Add runtime parameter checks (#761)

* Add runtime parameter checks

This commit adds runtime checks for function parameters to mpu_wrappers_v2 file. The same checks are performed
in the API implementation using asserts.

Signed-off-by: kar-rahul-aws <karahulx@amazon.com>
This commit is contained in:
kar-rahul-aws 2023-08-18 14:24:44 +05:30 committed by GitHub
parent cd87a39736
commit cdd3678c29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 290 additions and 193 deletions

1
.github/lexicon.txt vendored
View file

@ -2462,6 +2462,7 @@ uxpriority
uxprioritytouse uxprioritytouse
uxqueue uxqueue
uxqueuegetqueueitemsize uxqueuegetqueueitemsize
uxqueuegetqueuelength
uxqueuelength uxqueuelength
uxqueuemessageswaiting uxqueuemessageswaiting
uxqueuespacesavailable uxqueuespacesavailable

View file

@ -46,26 +46,6 @@
* correct privileged Vs unprivileged linkage and placement. */ * correct privileged Vs unprivileged linkage and placement. */
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */ #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */
/* The following bit fields convey control information in a task's event list
* item value. It is important they don't clash with the
* taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
#define eventWAIT_FOR_ALL_BITS 0x0400U
#define eventEVENT_BITS_CONTROL_BYTES 0xff00U
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL
#define eventWAIT_FOR_ALL_BITS 0x04000000UL
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100000000000000ULL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200000000000000ULL
#define eventWAIT_FOR_ALL_BITS 0x0400000000000000ULL
#define eventEVENT_BITS_CONTROL_BYTES 0xff00000000000000ULL
#endif /* if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) */
typedef struct EventGroupDef_t typedef struct EventGroupDef_t
{ {
EventBits_t uxEventBits; EventBits_t uxEventBits;

View file

@ -36,6 +36,26 @@
/* FreeRTOS includes. */ /* FreeRTOS includes. */
#include "timers.h" #include "timers.h"
/* The following bit fields convey control information in a task's event list
* item value. It is important they don't clash with the
* taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
#define eventWAIT_FOR_ALL_BITS 0x0400U
#define eventEVENT_BITS_CONTROL_BYTES 0xff00U
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL
#define eventWAIT_FOR_ALL_BITS 0x04000000UL
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100000000000000ULL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200000000000000ULL
#define eventWAIT_FOR_ALL_BITS 0x0400000000000000ULL
#define eventEVENT_BITS_CONTROL_BYTES 0xff00000000000000ULL
#endif /* if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) */
/* *INDENT-OFF* */ /* *INDENT-OFF* */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View file

@ -1753,6 +1753,7 @@ void vQueueSetQueueNumber( QueueHandle_t xQueue,
UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
/* *INDENT-OFF* */ /* *INDENT-OFF* */
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -366,13 +366,16 @@
BaseType_t xReturn = pdFAIL; BaseType_t xReturn = pdFAIL;
BaseType_t xIsPreviousWakeTimeAccessible = pdFALSE; BaseType_t xIsPreviousWakeTimeAccessible = pdFALSE;
xIsPreviousWakeTimeAccessible = xPortIsAuthorizedToAccessBuffer( pxPreviousWakeTime, if( ( pxPreviousWakeTime != NULL ) && ( xTimeIncrement > 0U ) )
sizeof( TickType_t ),
( tskMPU_WRITE_PERMISSION | tskMPU_READ_PERMISSION ) );
if( xIsPreviousWakeTimeAccessible == pdTRUE )
{ {
xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); xIsPreviousWakeTimeAccessible = xPortIsAuthorizedToAccessBuffer( pxPreviousWakeTime,
sizeof( TickType_t ),
( tskMPU_WRITE_PERMISSION | tskMPU_READ_PERMISSION ) );
if( xIsPreviousWakeTimeAccessible == pdTRUE )
{
xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement );
}
} }
return xReturn; return xReturn;
@ -391,22 +394,15 @@
TaskHandle_t xInternalTaskHandle = NULL; TaskHandle_t xInternalTaskHandle = NULL;
int32_t lIndex; int32_t lIndex;
if( xTask == NULL ) lIndex = ( int32_t ) xTask;
{
xReturn = xTaskAbortDelay( xTask );
}
else
{
lIndex = ( int32_t ) xTask;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalTaskHandle != NULL )
{ {
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); xReturn = xTaskAbortDelay( xInternalTaskHandle );
if( xInternalTaskHandle != NULL )
{
xReturn = xTaskAbortDelay( xInternalTaskHandle );
}
} }
} }
@ -473,22 +469,15 @@
TaskHandle_t xInternalTaskHandle = NULL; TaskHandle_t xInternalTaskHandle = NULL;
int32_t lIndex; int32_t lIndex;
if( pxTask == NULL ) lIndex = ( int32_t ) pxTask;
{
eReturn = eTaskGetState( pxTask );
}
else
{
lIndex = ( int32_t ) pxTask;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalTaskHandle != NULL )
{ {
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); eReturn = eTaskGetState( xInternalTaskHandle );
if( xInternalTaskHandle != NULL )
{
eReturn = eTaskGetState( xInternalTaskHandle );
}
} }
} }
@ -577,7 +566,11 @@
{ {
/* After the scheduler starts, only privileged tasks are allowed /* After the scheduler starts, only privileged tasks are allowed
* to suspend other tasks. */ * to suspend other tasks. */
if( ( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED ) || ( portIS_TASK_PRIVILEGED() == pdTRUE ) ) #if ( INCLUDE_xTaskGetSchedulerState == 1 )
if( ( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED ) || ( portIS_TASK_PRIVILEGED() == pdTRUE ) )
#else
if( portIS_TASK_PRIVILEGED() == pdTRUE )
#endif
{ {
lIndex = ( int32_t ) pxTaskToSuspend; lIndex = ( int32_t ) pxTaskToSuspend;
@ -1047,13 +1040,16 @@
{ {
BaseType_t xIsTimeOutWriteable = pdFALSE; BaseType_t xIsTimeOutWriteable = pdFALSE;
xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut, if( pxTimeOut != NULL )
sizeof( TimeOut_t ),
tskMPU_WRITE_PERMISSION );
if( xIsTimeOutWriteable == pdTRUE )
{ {
vTaskSetTimeOutState( pxTimeOut ); xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut,
sizeof( TimeOut_t ),
tskMPU_WRITE_PERMISSION );
if( xIsTimeOutWriteable == pdTRUE )
{
vTaskSetTimeOutState( pxTimeOut );
}
} }
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -1068,16 +1064,19 @@
BaseType_t xIsTimeOutWriteable = pdFALSE; BaseType_t xIsTimeOutWriteable = pdFALSE;
BaseType_t xIsTicksToWaitWriteable = pdFALSE; BaseType_t xIsTicksToWaitWriteable = pdFALSE;
xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut, if( ( pxTimeOut != NULL ) && ( pxTicksToWait != NULL ) )
sizeof( TimeOut_t ),
tskMPU_WRITE_PERMISSION );
xIsTicksToWaitWriteable = xPortIsAuthorizedToAccessBuffer( pxTicksToWait,
sizeof( TickType_t ),
tskMPU_WRITE_PERMISSION );
if( ( xIsTimeOutWriteable == pdTRUE ) && ( xIsTicksToWaitWriteable == pdTRUE ) )
{ {
xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut,
sizeof( TimeOut_t ),
tskMPU_WRITE_PERMISSION );
xIsTicksToWaitWriteable = xPortIsAuthorizedToAccessBuffer( pxTicksToWait,
sizeof( TickType_t ),
tskMPU_WRITE_PERMISSION );
if( ( xIsTimeOutWriteable == pdTRUE ) && ( xIsTicksToWaitWriteable == pdTRUE ) )
{
xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait );
}
} }
return xReturn; return xReturn;
@ -1103,24 +1102,27 @@
TaskHandle_t xInternalTaskHandle = NULL; TaskHandle_t xInternalTaskHandle = NULL;
BaseType_t xIsPreviousNotificationValueWriteable = pdFALSE; BaseType_t xIsPreviousNotificationValueWriteable = pdFALSE;
if( pulPreviousNotificationValue != NULL ) if( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{ {
xIsPreviousNotificationValueWriteable = xPortIsAuthorizedToAccessBuffer( pulPreviousNotificationValue, if( pulPreviousNotificationValue != NULL )
sizeof( uint32_t ),
tskMPU_WRITE_PERMISSION );
}
if( ( pulPreviousNotificationValue == NULL ) || ( xIsPreviousNotificationValueWriteable == pdTRUE ) )
{
lIndex = ( int32_t ) xTaskToNotify;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); xIsPreviousNotificationValueWriteable = xPortIsAuthorizedToAccessBuffer( pulPreviousNotificationValue,
sizeof( uint32_t ),
tskMPU_WRITE_PERMISSION );
}
if( xInternalTaskHandle != NULL ) if( ( pulPreviousNotificationValue == NULL ) || ( xIsPreviousNotificationValueWriteable == pdTRUE ) )
{
lIndex = ( int32_t ) xTaskToNotify;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xTaskGenericNotify( xInternalTaskHandle, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ); xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalTaskHandle != NULL )
{
xReturn = xTaskGenericNotify( xInternalTaskHandle, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue );
}
} }
} }
} }
@ -1148,16 +1150,19 @@
BaseType_t xReturn = pdFAIL; BaseType_t xReturn = pdFAIL;
BaseType_t xIsNotificationValueWritable = pdFALSE; BaseType_t xIsNotificationValueWritable = pdFALSE;
if( pulNotificationValue != NULL ) if( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{ {
xIsNotificationValueWritable = xPortIsAuthorizedToAccessBuffer( pulNotificationValue, if( pulNotificationValue != NULL )
sizeof( uint32_t ), {
tskMPU_WRITE_PERMISSION ); xIsNotificationValueWritable = xPortIsAuthorizedToAccessBuffer( pulNotificationValue,
} sizeof( uint32_t ),
tskMPU_WRITE_PERMISSION );
}
if( ( pulNotificationValue == NULL ) || ( xIsNotificationValueWritable == pdTRUE ) ) if( ( pulNotificationValue == NULL ) || ( xIsNotificationValueWritable == pdTRUE ) )
{ {
xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait );
}
} }
return xReturn; return xReturn;
@ -1176,9 +1181,12 @@
BaseType_t xClearCountOnExit, BaseType_t xClearCountOnExit,
TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */ TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
{ {
uint32_t ulReturn; uint32_t ulReturn = 0;
ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ); if( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{
ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait );
}
return ulReturn; return ulReturn;
} }
@ -1198,21 +1206,24 @@
int32_t lIndex; int32_t lIndex;
TaskHandle_t xInternalTaskHandle = NULL; TaskHandle_t xInternalTaskHandle = NULL;
if( xTask == NULL ) if( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{ {
xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear ); if( xTask == NULL )
}
else
{
lIndex = ( int32_t ) xTask;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear );
}
else
{
lIndex = ( int32_t ) xTask;
if( xInternalTaskHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xTaskGenericNotifyStateClear( xInternalTaskHandle, uxIndexToClear ); xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalTaskHandle != NULL )
{
xReturn = xTaskGenericNotifyStateClear( xInternalTaskHandle, uxIndexToClear );
}
} }
} }
} }
@ -1237,21 +1248,24 @@
int32_t lIndex; int32_t lIndex;
TaskHandle_t xInternalTaskHandle = NULL; TaskHandle_t xInternalTaskHandle = NULL;
if( xTask == NULL ) if( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{ {
ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ); if( xTask == NULL )
}
else
{
lIndex = ( int32_t ) xTask;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear );
}
else
{
lIndex = ( int32_t ) xTask;
if( xInternalTaskHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
ulReturn = ulTaskGenericNotifyValueClear( xInternalTaskHandle, uxIndexToClear, ulBitsToClear ); xInternalTaskHandle = MPU_GetTaskHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalTaskHandle != NULL )
{
ulReturn = ulTaskGenericNotifyValueClear( xInternalTaskHandle, uxIndexToClear, ulBitsToClear );
}
} }
} }
} }
@ -1809,6 +1823,7 @@
QueueHandle_t xInternalQueueHandle = NULL; QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL; BaseType_t xReturn = pdFAIL;
BaseType_t xIsItemToQueueReadable = pdFALSE; BaseType_t xIsItemToQueueReadable = pdFALSE;
UBaseType_t uxQueueItemSize, uxQueueLength;
lIndex = ( int32_t ) xQueue; lIndex = ( int32_t ) xQueue;
@ -1818,16 +1833,27 @@
if( xInternalQueueHandle != NULL ) if( xInternalQueueHandle != NULL )
{ {
if( pvItemToQueue != NULL ) uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
{ uxQueueLength = uxQueueGetQueueLength( xInternalQueueHandle );
xIsItemToQueueReadable = xPortIsAuthorizedToAccessBuffer( pvItemToQueue,
uxQueueGetQueueItemSize( xInternalQueueHandle ),
tskMPU_READ_PERMISSION );
}
if( ( pvItemToQueue == NULL ) || ( xIsItemToQueueReadable == pdTRUE ) ) if( ( !( ( pvItemToQueue == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) ) &&
( !( ( xCopyPosition == queueOVERWRITE ) && ( uxQueueLength != ( UBaseType_t ) 1U ) ) )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{ {
xReturn = xQueueGenericSend( xInternalQueueHandle, pvItemToQueue, xTicksToWait, xCopyPosition ); if( pvItemToQueue != NULL )
{
xIsItemToQueueReadable = xPortIsAuthorizedToAccessBuffer( pvItemToQueue,
uxQueueGetQueueItemSize( xInternalQueueHandle ),
tskMPU_READ_PERMISSION );
}
if( ( pvItemToQueue == NULL ) || ( xIsItemToQueueReadable == pdTRUE ) )
{
xReturn = xQueueGenericSend( xInternalQueueHandle, pvItemToQueue, xTicksToWait, xCopyPosition );
}
} }
} }
} }
@ -1896,6 +1922,7 @@
QueueHandle_t xInternalQueueHandle = NULL; QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL; BaseType_t xReturn = pdFAIL;
BaseType_t xIsReceiveBufferWritable = pdFALSE; BaseType_t xIsReceiveBufferWritable = pdFALSE;
UBaseType_t uxQueueItemSize;
lIndex = ( int32_t ) pxQueue; lIndex = ( int32_t ) pxQueue;
@ -1905,13 +1932,22 @@
if( xInternalQueueHandle != NULL ) if( xInternalQueueHandle != NULL )
{ {
xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer, uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
uxQueueGetQueueItemSize( xInternalQueueHandle ),
tskMPU_WRITE_PERMISSION );
if( xIsReceiveBufferWritable == pdTRUE ) if( ( !( ( ( pvBuffer ) == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{ {
xReturn = xQueueReceive( xInternalQueueHandle, pvBuffer, xTicksToWait ); xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer,
uxQueueGetQueueItemSize( xInternalQueueHandle ),
tskMPU_WRITE_PERMISSION );
if( xIsReceiveBufferWritable == pdTRUE )
{
xReturn = xQueueReceive( xInternalQueueHandle, pvBuffer, xTicksToWait );
}
} }
} }
} }
@ -1932,6 +1968,7 @@
QueueHandle_t xInternalQueueHandle = NULL; QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL; BaseType_t xReturn = pdFAIL;
BaseType_t xIsReceiveBufferWritable = pdFALSE; BaseType_t xIsReceiveBufferWritable = pdFALSE;
UBaseType_t uxQueueItemSize;
lIndex = ( int32_t ) xQueue; lIndex = ( int32_t ) xQueue;
@ -1941,13 +1978,22 @@
if( xInternalQueueHandle != NULL ) if( xInternalQueueHandle != NULL )
{ {
xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer, uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
uxQueueGetQueueItemSize( xInternalQueueHandle ),
tskMPU_WRITE_PERMISSION );
if( xIsReceiveBufferWritable == pdTRUE ) if( ( !( ( ( pvBuffer ) == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{ {
xReturn = xQueuePeek( xInternalQueueHandle, pvBuffer, xTicksToWait ); xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer,
uxQueueGetQueueItemSize( xInternalQueueHandle ),
tskMPU_WRITE_PERMISSION );
if( xIsReceiveBufferWritable == pdTRUE )
{
xReturn = xQueuePeek( xInternalQueueHandle, pvBuffer, xTicksToWait );
}
} }
} }
} }
@ -1965,6 +2011,7 @@
int32_t lIndex; int32_t lIndex;
QueueHandle_t xInternalQueueHandle = NULL; QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL; BaseType_t xReturn = pdFAIL;
UBaseType_t uxQueueItemSize;
lIndex = ( int32_t ) xQueue; lIndex = ( int32_t ) xQueue;
@ -1974,7 +2021,16 @@
if( xInternalQueueHandle != NULL ) if( xInternalQueueHandle != NULL )
{ {
xReturn = xQueueSemaphoreTake( xInternalQueueHandle, xTicksToWait ); uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
if( ( uxQueueItemSize == 0 )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
xReturn = xQueueSemaphoreTake( xInternalQueueHandle, xTicksToWait );
}
} }
} }
@ -2932,24 +2988,27 @@
int32_t lIndex; int32_t lIndex;
BaseType_t xIsHigherPriorityTaskWokenWriteable = pdFALSE; BaseType_t xIsHigherPriorityTaskWokenWriteable = pdFALSE;
if( pxHigherPriorityTaskWoken != NULL ) if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )
{ {
xIsHigherPriorityTaskWokenWriteable = xPortIsAuthorizedToAccessBuffer( pxHigherPriorityTaskWoken, if( pxHigherPriorityTaskWoken != NULL )
sizeof( BaseType_t ),
tskMPU_WRITE_PERMISSION );
}
if( ( pxHigherPriorityTaskWoken == NULL ) || ( xIsHigherPriorityTaskWokenWriteable == pdTRUE ) )
{
lIndex = ( int32_t ) xTimer;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); xIsHigherPriorityTaskWokenWriteable = xPortIsAuthorizedToAccessBuffer( pxHigherPriorityTaskWoken,
sizeof( BaseType_t ),
tskMPU_WRITE_PERMISSION );
}
if( xInternalTimerHandle != NULL ) if( ( pxHigherPriorityTaskWoken == NULL ) || ( xIsHigherPriorityTaskWokenWriteable == pdTRUE ) )
{
lIndex = ( int32_t ) xTimer;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xTimerGenericCommandFromTask( xInternalTimerHandle, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); xInternalTimerHandle = MPU_GetTimerHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalTimerHandle != NULL )
{
xReturn = xTimerGenericCommandFromTask( xInternalTimerHandle, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait );
}
} }
} }
} }
@ -3291,15 +3350,23 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL; EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex; int32_t lIndex;
lIndex = ( int32_t ) xEventGroup; if( ( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ) &&
( uxBitsToWaitFor != 0 )
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE ) #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{ {
xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); lIndex = ( int32_t ) xEventGroup;
if( xInternalEventGroupHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xEventGroupWaitBits( xInternalEventGroupHandle, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalEventGroupHandle != NULL )
{
xReturn = xEventGroupWaitBits( xInternalEventGroupHandle, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait );
}
} }
} }
@ -3317,15 +3384,18 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL; EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex; int32_t lIndex;
lIndex = ( int32_t ) xEventGroup; if( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 )
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); lIndex = ( int32_t ) xEventGroup;
if( xInternalEventGroupHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xEventGroupClearBits( xInternalEventGroupHandle, uxBitsToClear ); xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalEventGroupHandle != NULL )
{
xReturn = xEventGroupClearBits( xInternalEventGroupHandle, uxBitsToClear );
}
} }
} }
@ -3343,15 +3413,18 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL; EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex; int32_t lIndex;
lIndex = ( int32_t ) xEventGroup; if( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 )
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); lIndex = ( int32_t ) xEventGroup;
if( xInternalEventGroupHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xEventGroupSetBits( xInternalEventGroupHandle, uxBitsToSet ); xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalEventGroupHandle != NULL )
{
xReturn = xEventGroupSetBits( xInternalEventGroupHandle, uxBitsToSet );
}
} }
} }
@ -3373,15 +3446,23 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL; EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex; int32_t lIndex;
lIndex = ( int32_t ) xEventGroup; if( ( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ) &&
( uxBitsToWaitFor != 0 )
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE ) #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{ {
xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); lIndex = ( int32_t ) xEventGroup;
if( xInternalEventGroupHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xEventGroupSync( xInternalEventGroupHandle, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); xInternalEventGroupHandle = MPU_GetEventGroupHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalEventGroupHandle != NULL )
{
xReturn = xEventGroupSync( xInternalEventGroupHandle, uxBitsToSet, uxBitsToWaitFor, xTicksToWait );
}
} }
} }
@ -3654,21 +3735,24 @@
int32_t lIndex; int32_t lIndex;
BaseType_t xIsTxDataBufferReadable = pdFALSE; BaseType_t xIsTxDataBufferReadable = pdFALSE;
xIsTxDataBufferReadable = xPortIsAuthorizedToAccessBuffer( pvTxData, if( pvTxData != NULL )
xDataLengthBytes,
tskMPU_READ_PERMISSION );
if( xIsTxDataBufferReadable == pdTRUE )
{ {
lIndex = ( int32_t ) xStreamBuffer; xIsTxDataBufferReadable = xPortIsAuthorizedToAccessBuffer( pvTxData,
xDataLengthBytes,
tskMPU_READ_PERMISSION );
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE ) if( xIsTxDataBufferReadable == pdTRUE )
{ {
xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); lIndex = ( int32_t ) xStreamBuffer;
if( xInternalStreamBufferHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xStreamBufferSend( xInternalStreamBufferHandle, pvTxData, xDataLengthBytes, xTicksToWait ); xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalStreamBufferHandle != NULL )
{
xReturn = xStreamBufferSend( xInternalStreamBufferHandle, pvTxData, xDataLengthBytes, xTicksToWait );
}
} }
} }
} }
@ -3692,21 +3776,24 @@
int32_t lIndex; int32_t lIndex;
BaseType_t xIsRxDataBufferWriteable = pdFALSE; BaseType_t xIsRxDataBufferWriteable = pdFALSE;
xIsRxDataBufferWriteable = xPortIsAuthorizedToAccessBuffer( pvRxData, if( pvRxData != NULL )
xBufferLengthBytes,
tskMPU_WRITE_PERMISSION );
if( xIsRxDataBufferWriteable == pdTRUE )
{ {
lIndex = ( int32_t ) xStreamBuffer; xIsRxDataBufferWriteable = xPortIsAuthorizedToAccessBuffer( pvRxData,
xBufferLengthBytes,
tskMPU_WRITE_PERMISSION );
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE ) if( xIsRxDataBufferWriteable == pdTRUE )
{ {
xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) ); lIndex = ( int32_t ) xStreamBuffer;
if( xInternalStreamBufferHandle != NULL ) if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
{ {
xReturn = xStreamBufferReceive( xInternalStreamBufferHandle, pvRxData, xBufferLengthBytes, xTicksToWait ); xInternalStreamBufferHandle = MPU_GetStreamBufferHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalStreamBufferHandle != NULL )
{
xReturn = xStreamBufferReceive( xInternalStreamBufferHandle, pvRxData, xBufferLengthBytes, xTicksToWait );
}
} }
} }
} }

View file

@ -2236,6 +2236,12 @@ UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTI
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
{
return ( ( Queue_t * ) xQueue )->uxLength;
}
/*-----------------------------------------------------------*/
#if ( configUSE_MUTEXES == 1 ) #if ( configUSE_MUTEXES == 1 )
static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue )

View file

@ -7408,6 +7408,8 @@ TickType_t uxTaskResetEventItemValue( void )
TCB_t * pxTCB; TCB_t * pxTCB;
uint32_t ulReturn; uint32_t ulReturn;
configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES );
/* If null is passed in here then it is the calling task that is having /* If null is passed in here then it is the calling task that is having
* its notification state cleared. */ * its notification state cleared. */
pxTCB = prvGetTCBFromHandle( xTask ); pxTCB = prvGetTCBFromHandle( xTask );