]> git.sur5r.net Git - freertos/blobdiff - Source/tasks.c
Add in the pcTaskGetTaskName(), xTaskGetIdleTaskHandle() and xTimerGetTimerTaskHandle...
[freertos] / Source / tasks.c
index c105f37d4f44cb5eafef1b14c2c67d758febe851..16914978cb84b29ce511f37efcae967a26d7e8b9 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V7.0.0 - Copyright (C) 2011 Real Time Engineers Ltd.\r
+    FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd.\r
        \r
 \r
        FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by:\r
@@ -157,6 +157,12 @@ PRIVILEGED_DATA static xList xPendingReadyList;                                                    /*< Tasks that have been r
 \r
 #endif\r
 \r
+#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )\r
+       \r
+       PRIVILEGED_DATA static xTaskHandle xIdleTaskHandle = NULL;\r
+       \r
+#endif\r
+\r
 /* File private variables. --------------------------------*/\r
 PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks  = ( unsigned portBASE_TYPE ) 0;\r
 PRIVILEGED_DATA static volatile portTickType xTickCount                                                = ( portTickType ) 0;\r
@@ -273,7 +279,6 @@ PRIVILEGED_DATA static portTickType xNextTaskUnblockTime                                            = ( portTickType )
  */\r
 #define prvCheckDelayedTasks()                                                                                                                 \\r
 {                                                                                                                                                                              \\r
-register tskTCB *pxTCB;                                                                                                                                        \\r
 portTickType xItemValue;                                                                                                                               \\r
                                                                                                                                                                                \\r
        /* Is the tick count greater than or equal to the wake time of the first                        \\r
@@ -945,9 +950,9 @@ tskTCB * pxNewTCB;
                                /* The scheduler is not running, but the task that was pointed\r
                                to by pxCurrentTCB has just been suspended and pxCurrentTCB\r
                                must be adjusted to point to a different task. */\r
-                               if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1U )\r
+                               if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) \r
                                {\r
-                                       /* No other tasks are defined, so set pxCurrentTCB back to\r
+                                       /* No other tasks are ready, so set pxCurrentTCB back to\r
                                        NULL so when the next task is created pxCurrentTCB will\r
                                        be set to point to it no matter what its relative priority\r
                                        is. */\r
@@ -1091,7 +1096,18 @@ void vTaskStartScheduler( void )
 portBASE_TYPE xReturn;\r
 \r
        /* Add the idle task at the lowest priority. */\r
-       xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), ( xTaskHandle * ) NULL );\r
+       #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )\r
+       {\r
+               /* Create the idle task, storing its handle in xIdleTaskHandle so it can\r
+               be returned by the xTaskGetIdleTaskHandle() function. */\r
+               xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle );\r
+       }\r
+       #else\r
+       {\r
+               /* Create the idle task without storing its handle. */\r
+               xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL );\r
+       }\r
+       #endif\r
 \r
        #if ( configUSE_TIMERS == 1 )\r
        {\r
@@ -1282,6 +1298,17 @@ unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery )\r
+{\r
+tskTCB *pxTCB;\r
+\r
+       /* If null is passed in here then the name of the calling task is being queried. */\r
+       pxTCB = prvGetTCBFromHandle( xTaskToQuery );\r
+       configASSERT( pxTCB );\r
+       return &( pxTCB->pcTaskName[ 0 ] );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 #if ( configUSE_TRACE_FACILITY == 1 )\r
 \r
        void vTaskList( signed char *pcWriteBuffer )\r
@@ -1456,8 +1483,19 @@ unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void )
        }\r
 \r
 #endif\r
+/*----------------------------------------------------------*/\r
 \r
+#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )\r
 \r
+       xTaskHandle xTaskGetIdleTaskHandle( void )\r
+       {\r
+               /* If xTaskGetIdleTaskHandle() is called before the scheduler has been\r
+               started, then xIdleTaskHandle will be NULL. */\r
+               configASSERT( ( xIdleTaskHandle != NULL ) );\r
+               return xIdleTaskHandle;\r
+       }\r
+       \r
+#endif\r
 \r
 /*-----------------------------------------------------------\r
  * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES\r