]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/tasks.c
Added eTaskStateGet().
[freertos] / FreeRTOS / Source / tasks.c
index cb123c528a8143e4013f74c1459d59116ee2321f..8d622939babf8baca1649b52d0c580a1fdff00fe 100644 (file)
@@ -733,6 +733,68 @@ tskTCB * pxNewTCB;
 #endif\r
 /*-----------------------------------------------------------*/\r
 \r
+#if ( INCLUDE_eTaskStateGet == 1 )\r
+       \r
+       eTaskState eTaskStateGet( xTaskHandle pxTask )\r
+       {\r
+       eTaskState eReturn;\r
+       xList *pxStateList;\r
+       tskTCB *pxTCB;\r
+\r
+               pxTCB = ( tskTCB * ) pxTask;\r
+\r
+               if( pxTCB == pxCurrentTCB )\r
+               {\r
+                       /* The task calling this function is querying its own state. */\r
+                       eReturn = eRunning;\r
+               }\r
+               else\r
+               {\r
+                       taskENTER_CRITICAL();\r
+                       {\r
+                               pxStateList = ( xList * ) listLIST_ITEM_CONTAINED( &( pxTCB->xGenericListItem ) );\r
+                       }\r
+                       taskEXIT_CRITICAL();\r
+\r
+                       if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) )\r
+                       {\r
+                               /* The task being queried is referenced from one of the Blocked \r
+                               lists. */\r
+                               eReturn = eBlocked;\r
+                       }\r
+\r
+                       #if ( INCLUDE_vTaskSuspend == 1 )\r
+                               else if( pxStateList == &xSuspendedTaskList )\r
+                               {\r
+                                       /* The task being queried is referenced from the suspended \r
+                                       list. */\r
+                                       eReturn = eSuspended;\r
+                               }\r
+                       #endif\r
+\r
+                       #if ( INCLUDE_vTaskDelete == 1 )\r
+                               else if( pxStateList == &xTasksWaitingTermination )\r
+                               {\r
+                                       /* The task being queried is referenced from the deleted \r
+                                       tasks list. */\r
+                                       eReturn = eDeleted;\r
+                               }\r
+                       #endif\r
+\r
+                       else\r
+                       {\r
+                               /* If the task is not in any other state, it must be in the\r
+                               Ready (including pending ready) state. */\r
+                               eReturn = eReady;\r
+                       }\r
+               }\r
+\r
+               return eReturn;\r
+       }\r
+\r
+#endif\r
+/*-----------------------------------------------------------*/\r
+\r
 #if ( INCLUDE_uxTaskPriorityGet == 1 )\r
 \r
        unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )\r