]> git.sur5r.net Git - freertos/commitdiff
Make xTaskIsTaskSuspended() a private function as it should only be called from withi...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 10 Feb 2014 17:02:37 +0000 (17:02 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 10 Feb 2014 17:02:37 +0000 (17:02 +0000)
Fix issue in and simplify the xTaskRemoveFromUnorderedEventList() function.  The function is new to the V8 release candidates so does not effect official released code.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2197 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Source/include/mpu_wrappers.h
FreeRTOS/Source/include/queue.h
FreeRTOS/Source/include/task.h
FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c
FreeRTOS/Source/queue.c
FreeRTOS/Source/tasks.c

index 95a52c29da775bab79aaa31aeb7267cd2f0401bb..2681ca82ad6621d1f8d1a28871a412fcbd7bf69d 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V8.0.0:rc1 - Copyright (C) 2014 Real Time Engineers Ltd. \r
+    FreeRTOS V8.0.0:rc1 - Copyright (C) 2014 Real Time Engineers Ltd.\r
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
@@ -84,7 +84,6 @@ only for ports that are using the MPU. */
                #define vTaskPrioritySet                                MPU_vTaskPrioritySet\r
                #define eTaskGetState                                   MPU_eTaskGetState\r
                #define vTaskSuspend                                    MPU_vTaskSuspend\r
-               #define xTaskIsTaskSuspended                    MPU_xTaskIsTaskSuspended\r
                #define vTaskResume                                             MPU_vTaskResume\r
                #define vTaskSuspendAll                                 MPU_vTaskSuspendAll\r
                #define xTaskResumeAll                                  MPU_xTaskResumeAll\r
index d559e2dca1793121ea2ef49228db7e5aa6a8888a..fbbff3115840b04f8c220fe9317254a42f7fd874 100644 (file)
@@ -173,8 +173,8 @@ typedef void * QueueSetMemberHandle_t;
  * <pre>\r
  BaseType_t xQueueSendToToFront(\r
                                                                   QueueHandle_t        xQueue,\r
-                                                                  const void   *       pvItemToQueue,\r
-                                                                  TickType_t   xTicksToWait\r
+                                                                  const void           *pvItemToQueue,\r
+                                                                  TickType_t           xTicksToWait\r
                                                           );\r
  * </pre>\r
  *\r
index 614565b88928ebf190bc1febd258f531a378e5de..b0d53a81175d7ebf8827659c9c3cd55384dd08b6 100644 (file)
@@ -1028,17 +1028,6 @@ void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION;
  */\r
 BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION;\r
 \r
-/**\r
- * task. h\r
- * <pre>BaseType_t xTaskIsTaskSuspended( const TaskHandle_t xTask );</pre>\r
- *\r
- * Utility task that simply returns pdTRUE if the task referenced by xTask is\r
- * currently in the Suspended state, or pdFALSE if the task referenced by xTask\r
- * is in any other state.\r
- *\r
- */\r
-BaseType_t xTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r
-\r
 /*-----------------------------------------------------------\r
  * TASK UTILITIES\r
  *----------------------------------------------------------*/\r
index 06f5949aa717567dc0292d936a9014dab1cd8f3e..d7d4dd6849f09647494e36c07622d922e2440b86 100644 (file)
@@ -179,7 +179,6 @@ UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t pxTask );
 void MPU_vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority );\r
 eTaskState MPU_eTaskGetState( TaskHandle_t pxTask );\r
 void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend );\r
-BaseType_t MPU_xTaskIsTaskSuspended( TaskHandle_t xTask );\r
 void MPU_vTaskResume( TaskHandle_t pxTaskToResume );\r
 void MPU_vTaskSuspendAll( void );\r
 BaseType_t MPU_xTaskResumeAll( void );\r
@@ -787,19 +786,6 @@ BaseType_t xRunningPrivileged = prvRaisePrivilege();
 #endif\r
 /*-----------------------------------------------------------*/\r
 \r
-#if ( INCLUDE_vTaskSuspend == 1 )\r
-       BaseType_t MPU_xTaskIsTaskSuspended( TaskHandle_t xTask )\r
-       {\r
-       BaseType_t xReturn;\r
-    BaseType_t xRunningPrivileged = prvRaisePrivilege();\r
-\r
-               xReturn = xTaskIsTaskSuspended( xTask );\r
-        portRESET_PRIVILEGE( xRunningPrivileged );\r
-               return xReturn;\r
-       }\r
-#endif\r
-/*-----------------------------------------------------------*/\r
-\r
 #if ( INCLUDE_vTaskSuspend == 1 )\r
        void MPU_vTaskResume( TaskHandle_t pxTaskToResume )\r
        {\r
index 61f907852ecbc40664c01fa2d5c43f38985bad41..6a3acc984ecb94d14b6b448e1c5ac569fefbcde3 100644 (file)
@@ -86,7 +86,7 @@ privileged Vs unprivileged linkage and placement. */
 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */\r
 \r
 \r
-/* Constants used with the cRxLock and xTxLock structure members. */\r
+/* Constants used with the xRxLock and xTxLock structure members. */\r
 #define queueUNLOCKED                                  ( ( BaseType_t ) -1 )\r
 #define queueLOCKED_UNMODIFIED                 ( ( BaseType_t ) 0 )\r
 \r
@@ -1038,11 +1038,11 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
        link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */\r
        portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r
 \r
-       /* Similar to xQueueGenericSend, except we don't block if there is no room\r
-       in the queue.  Also we don't directly wake a task that was blocked on a\r
-       queue read, instead we return a flag to say whether a context switch is\r
-       required or not (i.e. has a task with a higher priority than us been woken\r
-       by this post). */\r
+       /* Similar to xQueueGenericSend, except without blocking if there is no room\r
+       in the queue.  Also don't directly wake a task that was blocked on a queue\r
+       read, instead return a flag to say whether a context switch is required or \r
+       not (i.e. has a task with a higher priority than us been woken by this \r
+       post). */\r
        uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r
        {\r
                if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )\r
@@ -1051,7 +1051,7 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
 \r
                        prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );\r
 \r
-                       /* If the queue is locked we do not alter the event list.  This will\r
+                       /* The event list is not altered if the queue is locked.  This will\r
                        be done when the queue is unlocked later. */\r
                        if( pxQueue->xTxLock == queueUNLOCKED )\r
                        {\r
@@ -2349,6 +2349,8 @@ BaseType_t xReturn;
        Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer;\r
        BaseType_t xReturn = pdFALSE;\r
 \r
+               /* This function must be called form a critical section. */\r
+       \r
                configASSERT( pxQueueSetContainer );\r
                configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength );\r
 \r
index 51747b5e6949d3daa5391d2b738744aa77ec5a29..fc06935d8a24eb5c7fe9341b39cf905839997b08 100644 (file)
@@ -214,13 +214,22 @@ PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks        = ( UBaseTyp
 PRIVILEGED_DATA static volatile TickType_t xTickCount                          = ( TickType_t ) 0U;\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 uxSchedulerSuspended       = ( UBaseType_t ) pdFALSE;\r
 PRIVILEGED_DATA static volatile UBaseType_t uxPendedTicks                      = ( UBaseType_t ) 0U;\r
 PRIVILEGED_DATA static volatile BaseType_t xYieldPending                       = pdFALSE;\r
 PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows                     = ( BaseType_t ) 0;\r
 PRIVILEGED_DATA static UBaseType_t uxTaskNumber                                        = ( UBaseType_t ) 0U;\r
 PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime                = portMAX_DELAY;\r
 \r
+/* Context switches are held pending while the scheduler is suspended.  Also,\r
+interrupts must not manipulate the xStateListItem of a TCB, or any of the\r
+lists the xStateListItem can be referenced from, if the scheduler is suspended.\r
+If an interrupt needs to unblock a task while the scheduler is suspended then it\r
+moves the task's event list item into the xPendingReadyList, ready for the\r
+kernel to move the task from the pending ready list into the real ready list\r
+when the scheduler is unsuspended.  The pending ready list itself can only be\r
+accessed from a critical section. */\r
+PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended       = ( UBaseType_t ) pdFALSE;\r
+\r
 #if ( configGENERATE_RUN_TIME_STATS == 1 )\r
 \r
        PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL;     /*< Holds the value of a timer/counter the last time a task was switched in. */\r
@@ -393,6 +402,13 @@ to its original value when it is released. */
  */\r
 static void prvInitialiseTCBVariables( TCB_t * const pxTCB, const char * const pcName, UBaseType_t uxPriority, const MemoryRegion_t * const xRegions, const uint16_t usStackDepth ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */\r
 \r
+/**\r
+ * Utility task that simply returns pdTRUE if the task referenced by xTask is\r
+ * currently in the Suspended state, or pdFALSE if the task referenced by xTask\r
+ * is in any other state.\r
+ */\r
+static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r
+\r
 /*\r
  * Utility to ready all the lists used by the scheduler.  This is called\r
  * automatically upon the creation of the first task.\r
@@ -806,9 +822,8 @@ TCB_t * pxNewTCB;
                        {\r
                                traceTASK_DELAY_UNTIL();\r
 \r
-                               /* We must remove ourselves from the ready list before adding\r
-                               ourselves to the blocked list as the same list item is used for\r
-                               both lists. */\r
+                               /* Remove the task from the ready list before adding it to the\r
+                               blocked list as the same list item is used for both lists. */\r
                                if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )\r
                                {\r
                                        /* The current task must be in a ready list, so there is\r
@@ -1254,25 +1269,25 @@ TCB_t * pxNewTCB;
 \r
 #if ( INCLUDE_vTaskSuspend == 1 )\r
 \r
-       BaseType_t xTaskIsTaskSuspended( const TaskHandle_t xTask )\r
+       static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask )\r
        {\r
        BaseType_t xReturn = pdFALSE;\r
        const TCB_t * const pxTCB = ( TCB_t * ) xTask;\r
 \r
+               /* Accesses xPendingReadyList so must be called from a critical\r
+               section. */\r
+\r
                /* It does not make sense to check if the calling task is suspended. */\r
                configASSERT( xTask );\r
 \r
-               /* Is the task we are attempting to resume actually in the\r
-               suspended list? */\r
+               /* Is the task being resumed actually in the suspended list? */\r
                if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ) != pdFALSE )\r
                {\r
                        /* Has the task already been resumed from within an ISR? */\r
                        if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE )\r
                        {\r
-                               /* Is it in the suspended list because it is in the\r
-                               Suspended state?  It is possible to be in the suspended\r
-                               list because it is blocked on a task with no timeout\r
-                               specified. */\r
+                               /* Is it in the suspended list because it is in the     Suspended \r
+                               state, or because is is blocked with no timeout? */\r
                                if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE )\r
                                {\r
                                        xReturn = pdTRUE;\r
@@ -1313,7 +1328,7 @@ TCB_t * pxNewTCB;
                {\r
                        taskENTER_CRITICAL();\r
                        {\r
-                               if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE )\r
+                               if( prvTaskIsTaskSuspended( pxTCB ) == pdTRUE )\r
                                {\r
                                        traceTASK_RESUME( pxTCB );\r
 \r
@@ -1382,12 +1397,15 @@ TCB_t * pxNewTCB;
 \r
                uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r
                {\r
-                       if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE )\r
+                       if( prvTaskIsTaskSuspended( pxTCB ) == pdTRUE )\r
                        {\r
                                traceTASK_RESUME_FROM_ISR( pxTCB );\r
 \r
+                               /* Check the ready lists can be accessed. */\r
                                if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )\r
                                {\r
+                                       /* Ready lists can be accessed so move the task from the\r
+                                       suspended list to the ready list directly. */\r
                                        if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )\r
                                        {\r
                                                xYieldRequired = pdTRUE;\r
@@ -1402,9 +1420,9 @@ TCB_t * pxNewTCB;
                                }\r
                                else\r
                                {\r
-                                       /* We cannot access the delayed or ready lists, so will hold this\r
-                                       task pending until the scheduler is resumed, at which point a\r
-                                       yield will be performed if necessary. */\r
+                                       /* The delayed or ready lists cannot be accessed so the task\r
+                                       is held in the pending ready list until the scheduler is\r
+                                       unsuspended. */\r
                                        vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) );\r
                                }\r
                        }\r
@@ -2144,17 +2162,18 @@ TickType_t xTimeToWake;
 \r
        configASSERT( pxEventList );\r
 \r
-       /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE\r
-       SCHEDULER SUSPENDED. */\r
+       /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE\r
+       SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */\r
 \r
        /* Place the event list item of the TCB in the appropriate event list.\r
        This is placed in the list in priority order so the highest priority task\r
-       is the first to be woken by the event. */\r
+       is the first to be woken by the event.  The queue that contains the event\r
+       list is locked, preventing simultaneous access from interrupts. */\r
        vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );\r
 \r
-       /* We must remove ourselves from the ready list before adding ourselves\r
-       to the blocked list as the same list item is used for both lists.  We have\r
-       exclusive access to the ready lists as the scheduler is locked. */\r
+       /* The task must be removed from from the ready list before it is added to\r
+       the blocked list as the same list item is used for both lists.  Exclusive\r
+       access to the ready lists guaranteed because the scheduler is locked. */\r
        if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( UBaseType_t ) 0 )\r
        {\r
                /* The current task must be in a ready list, so there is no need to\r
@@ -2170,15 +2189,16 @@ TickType_t xTimeToWake;
        {\r
                if( xTicksToWait == portMAX_DELAY )\r
                {\r
-                       /* Add ourselves to the suspended task list instead of a delayed task\r
-                       list to ensure we are not woken by a timing event.  We will block\r
-                       indefinitely. */\r
+                       /* Add the task to the suspended task list instead of a delayed task\r
+                       list to ensure the task is not woken by a timing event.  It will\r
+                       block indefinitely. */\r
                        vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) );\r
                }\r
                else\r
                {\r
-                       /* Calculate the time at which the task should be woken if the event does\r
-                       not occur.  This may overflow but this doesn't matter. */\r
+                       /* Calculate the time at which the task should be woken if the event\r
+                       does not occur.  This may overflow but this doesn't matter, the\r
+                       scheduler will handle it. */\r
                        xTimeToWake = xTickCount + xTicksToWait;\r
                        prvAddCurrentTaskToDelayedList( xTimeToWake );\r
                }\r
@@ -2186,7 +2206,8 @@ TickType_t xTimeToWake;
        #else /* INCLUDE_vTaskSuspend */\r
        {\r
                        /* Calculate the time at which the task should be woken if the event does\r
-                       not occur.  This may overflow but this doesn't matter. */\r
+                       not occur.  This may overflow but this doesn't matter, the scheduler\r
+                       will handle it. */\r
                        xTimeToWake = xTickCount + xTicksToWait;\r
                        prvAddCurrentTaskToDelayedList( xTimeToWake );\r
        }\r
@@ -2200,14 +2221,20 @@ TickType_t xTimeToWake;
 \r
        configASSERT( pxEventList );\r
 \r
-       /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE\r
-       SCHEDULER SUSPENDED. */\r
+       /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED.  It is used by\r
+       the event groups implementation. */\r
+       configASSERT( uxSchedulerSuspended != 0 );\r
 \r
-       /* Store the item value in the event list item. */\r
+       /* Store the item value in the event list item.  It is safe to access the\r
+       event list item here as interrupts won't access the event list item of a\r
+       task that is not in the Blocked state. */\r
        listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE );\r
 \r
        /* Place the event list item of the TCB at the end of the appropriate event\r
-       list. */\r
+       list.  It is safe to access the event list here because it is part of an\r
+       event group implementation - and interrupts don't access event groups\r
+       directly (instead they access them indirectly by pending function calls to\r
+       the task level). */\r
        vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) );\r
 \r
        /* The task must be removed from the ready list before it is added to the\r
@@ -2235,8 +2262,9 @@ TickType_t xTimeToWake;
                }\r
                else\r
                {\r
-                       /* Calculate the time at which the task should be woken if the event does\r
-                       not occur.  This may overflow but this doesn't matter. */\r
+                       /* Calculate the time at which the task should be woken if the event\r
+                       does not occur.  This may overflow but this doesn't matter, the\r
+                       kernel will manage it correctly. */\r
                        xTimeToWake = xTickCount + xTicksToWait;\r
                        prvAddCurrentTaskToDelayedList( xTimeToWake );\r
                }\r
@@ -2244,7 +2272,8 @@ TickType_t xTimeToWake;
        #else /* INCLUDE_vTaskSuspend */\r
        {\r
                        /* Calculate the time at which the task should be woken if the event does\r
-                       not occur.  This may overflow but this doesn't matter. */\r
+                       not occur.  This may overflow but this doesn't matter, the kernel\r
+                       will manage it correctly. */\r
                        xTimeToWake = xTickCount + xTicksToWait;\r
                        prvAddCurrentTaskToDelayedList( xTimeToWake );\r
        }\r
@@ -2302,16 +2331,16 @@ BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )
 TCB_t *pxUnblockedTCB;\r
 BaseType_t xReturn;\r
 \r
-       /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE\r
-       SCHEDULER SUSPENDED.  It can also be called from within an ISR. */\r
+       /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION.  It can also be\r
+       called from a critical section within an ISR. */\r
 \r
-       /* The event list is sorted in priority order, so we can remove the\r
-       first in the list, remove the TCB from the delayed list, and add\r
-       it to the ready list.\r
+       /* The event list is sorted in priority order, so the first in the list can\r
+       be removed as it is known to be the highest priority.  Remove the TCB from \r
+       the delayed list, and add it to the ready list.\r
 \r
        If an event is for a queue that is locked then this function will never\r
        get called - the lock count on the queue will get modified instead.  This\r
-       means we can always expect exclusive access to the event list here.\r
+       means exclusive access to the event list is guaranteed here.\r
 \r
        This function assumes that a check has already been made to ensure that\r
        pxEventList is not empty. */\r
@@ -2333,10 +2362,9 @@ BaseType_t xReturn;
 \r
        if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )\r
        {\r
-               /* Return true if the task removed from the event list has\r
-               a higher priority than the calling task.  This allows\r
-               the calling task to know if it should force a context\r
-               switch now. */\r
+               /* Return true if the task removed from the event list has a higher\r
+               priority than the calling task.  This allows the calling task to know if\r
+               it should force a context switch now. */\r
                xReturn = pdTRUE;\r
 \r
                /* Mark that a yield is pending in case the user is not using the\r
@@ -2357,29 +2385,24 @@ BaseType_t xTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, cons
 TCB_t *pxUnblockedTCB;\r
 BaseType_t xReturn;\r
 \r
-       /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE\r
-       SCHEDULER SUSPENDED.  It can also be called from within an ISR. */\r
+       /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED.  It is used by\r
+       the event flags implementation. */\r
+       configASSERT( uxSchedulerSuspended != pdFALSE );\r
 \r
        /* Store the new item value in the event list. */\r
        listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE );\r
 \r
-       /* Remove the TCB from the delayed list, and add it to the ready list. */\r
-\r
+       /* Remove the event list form the event flag.  Interrupts do not access\r
+       event flags. */\r
        pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem );\r
        configASSERT( pxUnblockedTCB );\r
        ( void ) uxListRemove( pxEventListItem );\r
 \r
-       if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )\r
-       {\r
-               ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) );\r
-               prvAddTaskToReadyList( pxUnblockedTCB );\r
-       }\r
-       else\r
-       {\r
-               /* Cannot access the delayed or ready lists, so will hold this task\r
-               pending until the scheduler is resumed. */\r
-               vListInsertEnd( &( xPendingReadyList ), pxEventListItem );\r
-       }\r
+       /* Remove the task from the delayed list and add it to the ready list.  The\r
+       scheduler is suspended so interrupts will not be accessing the ready\r
+       lists. */\r
+       ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) );\r
+       prvAddTaskToReadyList( pxUnblockedTCB );\r
 \r
        if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )\r
        {\r
@@ -2812,7 +2835,9 @@ static void prvCheckTasksWaitingTermination( void )
                while( uxTasksDeleted > ( UBaseType_t ) 0U )\r
                {\r
                        vTaskSuspendAll();\r
+                       {\r
                                xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );\r
+                       }\r
                        ( void ) xTaskResumeAll();\r
 \r
                        if( xListIsEmpty == pdFALSE )\r
@@ -2932,6 +2957,21 @@ TCB_t *pxNewTCB;
                                pxTaskStatusArray[ uxTask ].eCurrentState = eState;\r
                                pxTaskStatusArray[ uxTask ].uxCurrentPriority = pxNextTCB->uxPriority;\r
 \r
+                               #if ( INCLUDE_vTaskSuspend == 1 )\r
+                               {\r
+                                       /* If the task is in the suspended list then there is a chance\r
+                                       it is actually just blocked indefinitely - so really it should\r
+                                       be reported as being in the Blocked state. */\r
+                                       if( eState == eSuspended )\r
+                                       {\r
+                                               if( listLIST_ITEM_CONTAINER( &( pxNextTCB->xEventListItem ) ) != NULL )\r
+                                               {\r
+                                                       pxTaskStatusArray[ uxTask ].eCurrentState = eBlocked;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               #endif /* INCLUDE_vTaskSuspend */\r
+\r
                                #if ( configUSE_MUTEXES == 1 )\r
                                {\r
                                        pxTaskStatusArray[ uxTask ].uxBasePriority = pxNextTCB->uxBasePriority;\r