]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/tasks.c
Update version number in preparation for maintenance release.
[freertos] / FreeRTOS / Source / tasks.c
index 8a296ba53d519f81b8d9024ba1dce1c5dcef54f8..6cf5ed8610689e433deb706031ec1f7ecaaeb4b0 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.\r
+    FreeRTOS V9.0.1 - Copyright (C) 2017 Real Time Engineers Ltd.\r
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
@@ -134,7 +134,7 @@ that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with
 a statically allocated stack and a dynamically allocated TCB.\r
 !!!NOTE!!! If the definition of tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is\r
 changed then the definition of StaticTask_t must also be updated. */\r
-#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) || ( portUSING_MPU_WRAPPERS == 1 ) )\r
+#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE      ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r
 #define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB                 ( ( uint8_t ) 0 )\r
 #define tskSTATICALLY_ALLOCATED_STACK_ONLY                     ( ( uint8_t ) 1 )\r
 #define tskSTATICALLY_ALLOCATED_STACK_AND_TCB          ( ( uint8_t ) 2 )\r
@@ -164,6 +164,12 @@ set then don't fill the stack so there is no unnecessary dependency on memset. *
        #define static\r
 #endif\r
 \r
+/* The name allocated to the Idle task.  This can be overridden by defining\r
+configIDLE_TASK_NAME in FreeRTOSConfig.h. */\r
+#ifndef configIDLE_TASK_NAME\r
+       #define configIDLE_TASK_NAME "IDLE"\r
+#endif\r
+\r
 #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )\r
 \r
        /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is\r
@@ -405,7 +411,7 @@ PRIVILEGED_DATA static List_t xPendingReadyList;                                            /*< Tasks that have been r
 \r
 /* Other file private variables. --------------------------------*/\r
 PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks     = ( UBaseType_t ) 0U;\r
-PRIVILEGED_DATA static volatile TickType_t xTickCount                          = ( TickType_t ) 0U;\r
+PRIVILEGED_DATA static volatile TickType_t xTickCount                          = ( TickType_t ) configINITIAL_TICK_COUNT;\r
 PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority                 = tskIDLE_PRIORITY;\r
 PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning           = pdFALSE;\r
 PRIVILEGED_DATA static volatile UBaseType_t uxPendedTicks                      = ( UBaseType_t ) 0U;\r
@@ -667,7 +673,53 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION;
 #endif /* SUPPORT_STATIC_ALLOCATION */\r
 /*-----------------------------------------------------------*/\r
 \r
-#if( portUSING_MPU_WRAPPERS == 1 )\r
+#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r
+\r
+       BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )\r
+       {\r
+       TCB_t *pxNewTCB;\r
+       BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r
+\r
+               configASSERT( pxTaskDefinition->puxStackBuffer != NULL );\r
+               configASSERT( pxTaskDefinition->pxTaskBuffer != NULL );\r
+\r
+               if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) )\r
+               {\r
+                       /* Allocate space for the TCB.  Where the memory comes from depends\r
+                       on the implementation of the port malloc function and whether or\r
+                       not static allocation is being used. */\r
+                       pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer;\r
+\r
+                       /* Store the stack location in the TCB. */\r
+                       pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer;\r
+\r
+                       #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r
+                       {\r
+                               /* Tasks can be created statically or dynamically, so note this\r
+                               task was created statically in case the task is later deleted. */\r
+                               pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB;\r
+                       }\r
+                       #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r
+\r
+                       prvInitialiseNewTask(   pxTaskDefinition->pvTaskCode,\r
+                                                                       pxTaskDefinition->pcName,\r
+                                                                       ( uint32_t ) pxTaskDefinition->usStackDepth,\r
+                                                                       pxTaskDefinition->pvParameters,\r
+                                                                       pxTaskDefinition->uxPriority,\r
+                                                                       pxCreatedTask, pxNewTCB,\r
+                                                                       pxTaskDefinition->xRegions );\r
+\r
+                       prvAddNewTaskToReadyList( pxNewTCB );\r
+                       xReturn = pdPASS;\r
+               }\r
+\r
+               return xReturn;\r
+       }\r
+\r
+#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r
+/*-----------------------------------------------------------*/\r
+\r
+#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) )\r
 \r
        BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )\r
        {\r
@@ -716,7 +768,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION;
 \r
        BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,\r
                                                        const char * const pcName,              /*lint !e971 Unqualified char types are allowed for strings and single characters only. */\r
-                                                       const uint16_t usStackDepth,\r
+                                                       const configSTACK_DEPTH_TYPE usStackDepth,\r
                                                        void * const pvParameters,\r
                                                        UBaseType_t uxPriority,\r
                                                        TaskHandle_t * const pxCreatedTask )\r
@@ -1564,14 +1616,14 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
                                }\r
 \r
                                /* If the task is in the blocked or suspended list we need do\r
-                               nothing more than change it's priority variable. However, if\r
+                               nothing more than change its priority variable. However, if\r
                                the task is in a ready list it needs to be removed and placed\r
                                in the list appropriate to its new priority. */\r
                                if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )\r
                                {\r
-                                       /* The task is currently in its ready list - remove before adding\r
-                                       it to it's new ready list.  As we are in a critical section we\r
-                                       can do this even if the scheduler is suspended. */\r
+                                       /* The task is currently in its ready list - remove before\r
+                                       adding it to it's new ready list.  As we are in a critical\r
+                                       section we can do this even if the scheduler is suspended. */\r
                                        if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r
                                        {\r
                                                /* It is known that the task is in its ready list so\r
@@ -1646,6 +1698,17 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
                        }\r
 \r
                        vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) );\r
+\r
+                       #if( configUSE_TASK_NOTIFICATIONS == 1 )\r
+                       {\r
+                               if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION )\r
+                               {\r
+                                       /* The task was blocked to wait for a notification, but is\r
+                                       now suspended, so no notification was received. */\r
+                                       pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION;\r
+                               }\r
+                       }\r
+                       #endif\r
                }\r
                taskEXIT_CRITICAL();\r
 \r
@@ -1765,12 +1828,12 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
                                {\r
                                        traceTASK_RESUME( pxTCB );\r
 \r
-                                       /* As we are in a critical section we can access the ready\r
-                                       lists even if the scheduler is suspended. */\r
+                                       /* The ready list can be accessed even if the scheduler is\r
+                                       suspended because this is inside a critical section. */\r
                                        ( void ) uxListRemove(  &( pxTCB->xStateListItem ) );\r
                                        prvAddTaskToReadyList( pxTCB );\r
 \r
-                                       /* We may have just resumed a higher priority task. */\r
+                                       /* A higher priority task may have just been resumed. */\r
                                        if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )\r
                                        {\r
                                                /* This yield may not cause the task just resumed to run,\r
@@ -1887,7 +1950,7 @@ BaseType_t xReturn;
                address of the RAM then create the idle task. */\r
                vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );\r
                xIdleTaskHandle = xTaskCreateStatic(    prvIdleTask,\r
-                                                                                               "IDLE",\r
+                                                                                               configIDLE_TASK_NAME,\r
                                                                                                ulIdleTaskStackSize,\r
                                                                                                ( void * ) NULL, /*lint !e961.  The cast is not redundant for all compilers. */\r
                                                                                                ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),\r
@@ -1907,7 +1970,8 @@ BaseType_t xReturn;
        {\r
                /* The Idle task is being created using dynamically allocated RAM. */\r
                xReturn = xTaskCreate(  prvIdleTask,\r
-                                                               "IDLE", configMINIMAL_STACK_SIZE,\r
+                                                               configIDLE_TASK_NAME,\r
+                                                               configMINIMAL_STACK_SIZE,\r
                                                                ( void * ) NULL,\r
                                                                ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),\r
                                                                &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */\r
@@ -2488,7 +2552,7 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than
        BaseType_t xTaskAbortDelay( TaskHandle_t xTask )\r
        {\r
        TCB_t *pxTCB = ( TCB_t * ) xTask;\r
-       BaseType_t xReturn = pdFALSE;\r
+       BaseType_t xReturn;\r
 \r
                configASSERT( pxTCB );\r
 \r
@@ -2498,6 +2562,8 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than
                        it is actually in the Blocked state. */\r
                        if( eTaskGetState( xTask ) == eBlocked )\r
                        {\r
+                               xReturn = pdPASS;\r
+\r
                                /* Remove the reference to the task from the blocked list.  An\r
                                interrupt won't touch the xStateListItem because the\r
                                scheduler is suspended. */\r
@@ -2546,7 +2612,7 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than
                        }\r
                        else\r
                        {\r
-                               mtCOVERAGE_TEST_MARKER();\r
+                               xReturn = pdFAIL;\r
                        }\r
                }\r
                ( void ) xTaskResumeAll();\r
@@ -3073,6 +3139,7 @@ BaseType_t xReturn;
        {\r
                /* Minor optimisation.  The tick count cannot change in this block. */\r
                const TickType_t xConstTickCount = xTickCount;\r
+               const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering;\r
 \r
                #if( INCLUDE_xTaskAbortDelay == 1 )\r
                        if( pxCurrentTCB->ucDelayAborted != pdFALSE )\r
@@ -3105,10 +3172,10 @@ BaseType_t xReturn;
                        was called. */\r
                        xReturn = pdTRUE;\r
                }\r
-               else if( ( ( TickType_t ) ( xConstTickCount - pxTimeOut->xTimeOnEntering ) ) < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */\r
+               else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */\r
                {\r
                        /* Not a genuine timeout. Adjust parameters for time remaining. */\r
-                       *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering );\r
+                       *pxTicksToWait -= xElapsedTime;\r
                        vTaskSetTimeOutState( pxTimeOut );\r
                        xReturn = pdFALSE;\r
                }\r
@@ -3262,6 +3329,11 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
                                        configASSERT( xNextTaskUnblockTime >= xTickCount );\r
                                        xExpectedIdleTime = prvGetExpectedIdleTime();\r
 \r
+                                       /* Define the following macro to set xExpectedIdleTime to 0\r
+                                       if the application does not want\r
+                                       portSUPPRESS_TICKS_AND_SLEEP() to be called. */\r
+                                       configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime );\r
+\r
                                        if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )\r
                                        {\r
                                                traceLOW_POWER_IDLE_BEGIN();\r
@@ -3753,25 +3825,27 @@ TCB_t *pxTCB;
 \r
 #if ( configUSE_MUTEXES == 1 )\r
 \r
-       void vTaskPriorityInherit( TaskHandle_t const pxMutexHolder )\r
+       BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder )\r
        {\r
-       TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;\r
+       TCB_t * const pxMutexHolderTCB = ( TCB_t * ) pxMutexHolder;\r
+       BaseType_t xReturn = pdFALSE;\r
 \r
                /* If the mutex was given back by an interrupt while the queue was\r
-               locked then the mutex holder might now be NULL. */\r
+               locked then the mutex holder might now be NULL.  _RB_ Is this still\r
+               needed as interrupts can no longer use mutexes? */\r
                if( pxMutexHolder != NULL )\r
                {\r
                        /* If the holder of the mutex has a priority below the priority of\r
                        the task attempting to obtain the mutex then it will temporarily\r
                        inherit the priority of the task attempting to obtain the mutex. */\r
-                       if( pxTCB->uxPriority < pxCurrentTCB->uxPriority )\r
+                       if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority )\r
                        {\r
                                /* Adjust the mutex holder state to account for its new\r
                                priority.  Only reset the event list item value if the value is\r
-                               not     being used for anything else. */\r
-                               if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )\r
+                               not being used for anything else. */\r
+                               if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )\r
                                {\r
-                                       listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */\r
+                                       listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */\r
                                }\r
                                else\r
                                {\r
@@ -3780,11 +3854,11 @@ TCB_t *pxTCB;
 \r
                                /* If the task being modified is in the ready state it will need\r
                                to be moved into a new list. */\r
-                               if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )\r
+                               if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE )\r
                                {\r
-                                       if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r
+                                       if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r
                                        {\r
-                                               taskRESET_READY_PRIORITY( pxTCB->uxPriority );\r
+                                               taskRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority );\r
                                        }\r
                                        else\r
                                        {\r
@@ -3792,26 +3866,45 @@ TCB_t *pxTCB;
                                        }\r
 \r
                                        /* Inherit the priority before being moved into the new list. */\r
-                                       pxTCB->uxPriority = pxCurrentTCB->uxPriority;\r
-                                       prvAddTaskToReadyList( pxTCB );\r
+                                       pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;\r
+                                       prvAddTaskToReadyList( pxMutexHolderTCB );\r
                                }\r
                                else\r
                                {\r
                                        /* Just inherit the priority. */\r
-                                       pxTCB->uxPriority = pxCurrentTCB->uxPriority;\r
+                                       pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;\r
                                }\r
 \r
-                               traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB->uxPriority );\r
+                               traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority );\r
+\r
+                               /* Inheritance occurred. */\r
+                               xReturn = pdTRUE;\r
                        }\r
                        else\r
                        {\r
-                               mtCOVERAGE_TEST_MARKER();\r
+                               if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority )\r
+                               {\r
+                                       /* The base priority of the mutex holder is lower than the\r
+                                       priority of the task attempting to take the mutex, but the\r
+                                       current priority of the mutex holder is not lower than the\r
+                                       priority of the task attempting to take the mutex.\r
+                                       Therefore the mutex holder must have already inherited a\r
+                                       priority, but inheritance would have occurred if that had\r
+                                       not been the case. */\r
+                                       xReturn = pdTRUE;\r
+                               }\r
+                               else\r
+                               {\r
+                                       mtCOVERAGE_TEST_MARKER();\r
+                               }\r
                        }\r
                }\r
                else\r
                {\r
                        mtCOVERAGE_TEST_MARKER();\r
                }\r
+\r
+               return xReturn;\r
        }\r
 \r
 #endif /* configUSE_MUTEXES */\r
@@ -3831,7 +3924,6 @@ TCB_t *pxTCB;
                        interrupt, and if a mutex is given by the holding task then it must\r
                        be the running state task. */\r
                        configASSERT( pxTCB == pxCurrentTCB );\r
-\r
                        configASSERT( pxTCB->uxMutexesHeld );\r
                        ( pxTCB->uxMutexesHeld )--;\r
 \r
@@ -3845,8 +3937,8 @@ TCB_t *pxTCB;
                                        /* A task can only have an inherited priority if it holds\r
                                        the mutex.  If the mutex is held by a task then it cannot be\r
                                        given from an interrupt, and if a mutex is given by the\r
-                                       holding task then it must be the running state task.  Remove\r
-                                       the     holding task from the ready     list. */\r
+                                       holding task then it must be the running state task.  Remove\r
+                                       the holding task from the ready list. */\r
                                        if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r
                                        {\r
                                                taskRESET_READY_PRIORITY( pxTCB->uxPriority );\r
@@ -3898,6 +3990,108 @@ TCB_t *pxTCB;
 #endif /* configUSE_MUTEXES */\r
 /*-----------------------------------------------------------*/\r
 \r
+#if ( configUSE_MUTEXES == 1 )\r
+\r
+       void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask )\r
+       {\r
+       TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;\r
+       UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse;\r
+       const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1;\r
+\r
+               if( pxMutexHolder != NULL )\r
+               {\r
+                       /* If pxMutexHolder is not NULL then the holder must hold at least\r
+                       one mutex. */\r
+                       configASSERT( pxTCB->uxMutexesHeld );\r
+\r
+                       /* Determine the priority to which the priority of the task that\r
+                       holds the mutex should be set.  This will be the greater of the\r
+                       holding task's base priority and the priority of the highest\r
+                       priority task that is waiting to obtain the mutex. */\r
+                       if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask )\r
+                       {\r
+                               uxPriorityToUse = uxHighestPriorityWaitingTask;\r
+                       }\r
+                       else\r
+                       {\r
+                               uxPriorityToUse = pxTCB->uxBasePriority;\r
+                       }\r
+\r
+                       /* Does the priority need to change? */\r
+                       if( pxTCB->uxPriority != uxPriorityToUse )\r
+                       {\r
+                               /* Only disinherit if no other mutexes are held.  This is a\r
+                               simplification in the priority inheritance implementation.  If\r
+                               the task that holds the mutex is also holding other mutexes then\r
+                               the other mutexes may have caused the priority inheritance. */\r
+                               if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld )\r
+                               {\r
+                                       /* If a task has timed out because it already holds the\r
+                                       mutex it was trying to obtain then it cannot of inherited\r
+                                       its own priority. */\r
+                                       configASSERT( pxTCB != pxCurrentTCB );\r
+\r
+                                       /* Disinherit the priority, remembering the previous\r
+                                       priority to facilitate determining the subject task's\r
+                                       state. */\r
+                                       traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );\r
+                                       uxPriorityUsedOnEntry = pxTCB->uxPriority;\r
+                                       pxTCB->uxPriority = uxPriorityToUse;\r
+\r
+                                       /* Only reset the event list item value if the value is not\r
+                                       being used for anything else. */\r
+                                       if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL )\r
+                                       {\r
+                                               listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               mtCOVERAGE_TEST_MARKER();\r
+                                       }\r
+\r
+                                       /* If the running task is not the task that holds the mutex\r
+                                       then the task that holds the mutex could be in either the\r
+                                       Ready, Blocked or Suspended states.  Only remove the task\r
+                                       from its current state list if it is in the Ready state as\r
+                                       the task's priority is going to change and there is one\r
+                                       Ready list per priority. */\r
+                                       if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )\r
+                                       {\r
+                                               if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r
+                                               {\r
+                                                       taskRESET_READY_PRIORITY( pxTCB->uxPriority );\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       mtCOVERAGE_TEST_MARKER();\r
+                                               }\r
+\r
+                                               prvAddTaskToReadyList( pxTCB );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               mtCOVERAGE_TEST_MARKER();\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       mtCOVERAGE_TEST_MARKER();\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               mtCOVERAGE_TEST_MARKER();\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       mtCOVERAGE_TEST_MARKER();\r
+               }\r
+       }\r
+\r
+#endif /* configUSE_MUTEXES */\r
+/*-----------------------------------------------------------*/\r
+\r
 #if ( portCRITICAL_NESTING_IN_TCB == 1 )\r
 \r
        void vTaskEnterCritical( void )\r
@@ -3987,7 +4181,7 @@ TCB_t *pxTCB;
 #endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */\r
 /*-----------------------------------------------------------*/\r
 \r
-#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )\r
+#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r
 \r
        void vTaskList( char * pcWriteBuffer )\r
        {\r
@@ -4079,10 +4273,10 @@ TCB_t *pxTCB;
                }\r
        }\r
 \r
-#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */\r
+#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */\r
 /*----------------------------------------------------------*/\r
 \r
-#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )\r
+#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r
 \r
        void vTaskGetRunTimeStats( char *pcWriteBuffer )\r
        {\r
@@ -4206,7 +4400,7 @@ TCB_t *pxTCB;
                }\r
        }\r
 \r
-#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */\r
+#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */\r
 /*-----------------------------------------------------------*/\r
 \r
 TickType_t uxTaskResetEventItemValue( void )\r
@@ -4365,7 +4559,7 @@ TickType_t uxReturn;
                        blocked state (because a notification was already pending) or the\r
                        task unblocked because of a notification.  Otherwise the task\r
                        unblocked because of a timeout. */\r
-                       if( pxCurrentTCB->ucNotifyState == taskWAITING_NOTIFICATION )\r
+                       if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED )\r
                        {\r
                                /* A notification was not received. */\r
                                xReturn = pdFALSE;\r