Add xTaskGetHandle()
Posted by
Dirk Eibach on October 8, 2009
I needed to get the handle of a task from the number shown by vTaskList(). So I added xTaskGetHandle().
Cheers
Dirk
<pre><code>
diff -pur FreeRTOS/Source/include/task.h ../../neo-lwl/FreeRTOS/Source/include/task.h
--- FreeRTOS/Source/include/task.h2009-08-09 19:55:50.000000000 +0200
+++ ../../neo-lwl/FreeRTOS/Source/include/task.h2009-10-08 14:09:51.051501389 +0200
@@ -1058,6 +1058,11 @@ void vTaskSwitchContext( void );
xTaskHandle xTaskGetCurrentTaskHandle( void );
/*
+ * Return the handle of the task identified by uNumber.
+ */
+xTaskHandle xTaskGetTaskHandle( unsigned portBASE_TYPE uNumber );
+
+/*
* Capture the current time status for future reference.
*/
void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut );
diff -pur FreeRTOS/Source/tasks.c ../../neo-lwl/FreeRTOS/Source/tasks.c
--- FreeRTOS/Source/tasks.c2009-08-09 19:55:50.000000000 +0200
+++ ../../neo-lwl/FreeRTOS/Source/tasks.c2009-10-08 14:35:24.775001569 +0200
@@ -82,6 +82,7 @@ typedef struct tskTaskControlBlock
#if ( configUSE_TRACE_FACILITY == 1 )
unsigned portBASE_TYPEuxTCBNumber;/*< This is used for tracing the scheduler and making debugging easier only. */
+xListItemxFullListItem;
#endif
#if ( configUSE_MUTEXES == 1 )
@@ -132,6 +133,12 @@ static xList xPendingReadyList;/*
#endif
+#if ( configUSE_TRACE_FACILITY == 1 )
+
+static xList xFullTaskList;/*< All tasks */
+
+#endif
+
/* File private variables. --------------------------------*/
static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks= ( unsigned portBASE_TYPE ) 0;
static volatile portTickType xTickCount= ( portTickType ) 0;
@@ -446,6 +453,7 @@ tskTCB * pxNewTCB;
{
/* Add a counter into the TCB for tracing only. */
pxNewTCB->uxTCBNumber = uxTaskNumber;
+vListInsertEnd(&xFullTaskList, &pxNewTCB->xFullListItem);
}
#endif
uxTaskNumber++;
@@ -1852,6 +1860,13 @@ static void prvInitialiseTCBVariables( t
pxTCB->ulRunTimeCounter = 0UL;
}
#endif
+
+#if ( configUSE_TRACE_FACILITY == 1 )
+{
+vListInitialiseItem( &( pxTCB->xFullListItem ) );
+listSET_LIST_ITEM_OWNER( &( pxTCB->xFullListItem ), pxTCB );
+}
+#endif
}
/*-----------------------------------------------------------*/
@@ -1880,6 +1895,12 @@ unsigned portBASE_TYPE uxPriority;
}
#endif
+#if ( configUSE_TRACE_FACILITY == 1 )
+{
+vListInitialise( ( xList * ) &xFullTaskList );
+}
+#endif
+
/* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList
using list2. */
pxDelayedTaskList = &xDelayedTaskList1;
@@ -2222,6 +2243,29 @@ void vTaskExitCritical( void )
#endif
/*-----------------------------------------------------------*/
+#if ( configUSE_TRACE_FACILITY == 1 )
+
+xTaskHandle xTaskGetTaskHandle( unsigned portBASE_TYPE uNumber )
+{
+xTaskHandle handle = NULL;
+tskTCB *pxNextTCB=NULL, *pxFirstTCB=NULL;
+portENTER_CRITICAL();
+{
+listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, &xFullTaskList );
+do
+{
+listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, &xFullTaskList );
+if ( pxNextTCB->uxTCBNumber == uNumber ) {
+handle = pxNextTCB;
+break;
+}
+} while( pxNextTCB != pxFirstTCB );
+}
+portEXIT_CRITICAL();
+return handle;
+};
+#endif
+/*-----------------------------------------------------------*/
</code></pre>
RE: Add xTaskGetHandle()
Posted by
Dirk Eibach on October 8, 2009
Aargh.
Sending a patch to this forum does not seem that easy. What is the recommended way for sending a patch?
RE: Add xTaskGetHandle()
Posted by
Richard on October 9, 2009
I received your patch - thanks. This needs to be made more easy for sure.
Regards.