mirror of
https://github.com/espressif/esp-idf.git
synced 2025-12-10 18:06:29 +00:00
freertos: take tasks snapshot out of tasks.c source code
This commit is contained in:
@@ -5811,201 +5811,6 @@ const TickType_t xConstTickCount = xTickCount;
|
||||
#endif /* INCLUDE_vTaskSuspend */
|
||||
}
|
||||
|
||||
#if ( configENABLE_TASK_SNAPSHOT == 1 )
|
||||
static void prvTaskGetSnapshot( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, TCB_t *pxTCB )
|
||||
{
|
||||
if (pxTCB == NULL) {
|
||||
return;
|
||||
}
|
||||
pxTaskSnapshotArray[ *uxTask ].pxTCB = pxTCB;
|
||||
pxTaskSnapshotArray[ *uxTask ].pxTopOfStack = (StackType_t *)pxTCB->pxTopOfStack;
|
||||
#if( portSTACK_GROWTH < 0 )
|
||||
{
|
||||
pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxEndOfStack;
|
||||
}
|
||||
#else
|
||||
{
|
||||
pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxStack;
|
||||
}
|
||||
#endif
|
||||
(*uxTask)++;
|
||||
}
|
||||
|
||||
static void prvTaskGetSnapshotsFromList( TaskSnapshot_t *pxTaskSnapshotArray, UBaseType_t *uxTask, const UBaseType_t uxArraySize, List_t *pxList )
|
||||
{
|
||||
TCB_t *pxNextTCB, *pxFirstTCB;
|
||||
|
||||
if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )
|
||||
{
|
||||
listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );
|
||||
do
|
||||
{
|
||||
if( *uxTask >= uxArraySize )
|
||||
break;
|
||||
|
||||
listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );
|
||||
prvTaskGetSnapshot( pxTaskSnapshotArray, uxTask, pxNextTCB );
|
||||
} while( pxNextTCB != pxFirstTCB );
|
||||
}
|
||||
else
|
||||
{
|
||||
mtCOVERAGE_TEST_MARKER();
|
||||
}
|
||||
}
|
||||
|
||||
UBaseType_t uxTaskGetSnapshotAll( TaskSnapshot_t * const pxTaskSnapshotArray, const UBaseType_t uxArraySize, UBaseType_t * const pxTcbSz )
|
||||
{
|
||||
UBaseType_t uxTask = 0, i = 0;
|
||||
|
||||
|
||||
*pxTcbSz = sizeof(TCB_t);
|
||||
/* Fill in an TaskStatus_t structure with information on each
|
||||
task in the Ready state. */
|
||||
i = configMAX_PRIORITIES;
|
||||
do
|
||||
{
|
||||
i--;
|
||||
prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( pxReadyTasksLists[ i ] ) );
|
||||
} while( i > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
|
||||
|
||||
/* Fill in an TaskStatus_t structure with information on each
|
||||
task in the Blocked state. */
|
||||
prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxDelayedTaskList );
|
||||
prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, ( List_t * ) pxOverflowDelayedTaskList );
|
||||
for (i = 0; i < portNUM_PROCESSORS; i++) {
|
||||
if( uxTask >= uxArraySize )
|
||||
break;
|
||||
prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &( xPendingReadyList[i]) );
|
||||
}
|
||||
|
||||
#if( INCLUDE_vTaskDelete == 1 )
|
||||
{
|
||||
prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xTasksWaitingTermination );
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ( INCLUDE_vTaskSuspend == 1 )
|
||||
{
|
||||
prvTaskGetSnapshotsFromList( pxTaskSnapshotArray, &uxTask, uxArraySize, &xSuspendedTaskList );
|
||||
}
|
||||
#endif
|
||||
return uxTask;
|
||||
}
|
||||
|
||||
static TCB_t *prvFirstTaskGet( List_t *pxList )
|
||||
{
|
||||
ListItem_t *pxListItem = listGET_HEAD_ENTRY( pxList );
|
||||
if( pxListItem != listGET_END_MARKER( pxList ) ) {
|
||||
return listGET_LIST_ITEM_OWNER( pxListItem );
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static TCB_t *prvNextTaskGet( TCB_t *pxTCB )
|
||||
{
|
||||
List_t *pxList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) );
|
||||
ListItem_t *pxListItem = listGET_NEXT( &( pxTCB->xStateListItem ) );
|
||||
if( pxListItem != listGET_END_MARKER( pxList ) ) {
|
||||
return listGET_LIST_ITEM_OWNER( pxListItem );
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline void vTaskGetSnapshot( TaskHandle_t pxTask, TaskSnapshot_t *pxTaskSnapshot )
|
||||
{
|
||||
configASSERT( portVALID_TCB_MEM(pxTask) );
|
||||
configASSERT( pxTaskSnapshot != NULL );
|
||||
pxTaskSnapshot->pxTCB = (TCB_t *)pxTask;
|
||||
pxTaskSnapshot->pxTopOfStack = (StackType_t *)((TCB_t *)pxTask)->pxTopOfStack;
|
||||
pxTaskSnapshot->pxEndOfStack = ((TCB_t *)pxTask)->pxEndOfStack;
|
||||
}
|
||||
|
||||
TaskHandle_t pxTaskGetNext( TaskHandle_t pxTask )
|
||||
{
|
||||
TCB_t *pxTCB = pxTask;
|
||||
List_t *pxTaskList = NULL;
|
||||
UBaseType_t i = configMAX_PRIORITIES;
|
||||
UBaseType_t bCurTaskListFound = pdFALSE;
|
||||
List_t *task_lists[] = {
|
||||
pxDelayedTaskList,
|
||||
pxOverflowDelayedTaskList,
|
||||
#if( INCLUDE_vTaskDelete == 1 )
|
||||
&xTasksWaitingTermination,
|
||||
#endif
|
||||
#if( INCLUDE_vTaskSuspend == 1 )
|
||||
&xSuspendedTaskList
|
||||
#endif
|
||||
};
|
||||
|
||||
if( pxTask != NULL && !portVALID_TCB_MEM(pxTask) ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( pxTCB != NULL ) {
|
||||
pxTCB = prvNextTaskGet( pxTCB );
|
||||
if( pxTCB != NULL ) {
|
||||
// take care not to return garbage
|
||||
return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL;
|
||||
}
|
||||
pxTaskList = listLIST_ITEM_CONTAINER( &( ((TCB_t *)pxTask)->xStateListItem ) );
|
||||
}
|
||||
/* ready tasks lists */
|
||||
do
|
||||
{
|
||||
i--;
|
||||
List_t *pxList = &( pxReadyTasksLists[ i ] );
|
||||
if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) {
|
||||
/* need to find list the current task item from */
|
||||
if( pxTaskList == pxList ) {
|
||||
bCurTaskListFound = pdTRUE;
|
||||
}
|
||||
continue; /* go to the next 'ready list' */
|
||||
}
|
||||
pxTCB = prvFirstTaskGet( pxList );
|
||||
if( pxTCB != NULL ) {
|
||||
// take care not to return garbage
|
||||
return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL;
|
||||
}
|
||||
}
|
||||
while( i > tskIDLE_PRIORITY );
|
||||
/* pending ready tasks lists */
|
||||
for (i = 0; i < portNUM_PROCESSORS; i++) {
|
||||
List_t *pxList = &( xPendingReadyList[ i ] );
|
||||
if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) {
|
||||
/* need to find list the current task item from */
|
||||
if( pxTaskList == pxList ) {
|
||||
bCurTaskListFound = pdTRUE;
|
||||
}
|
||||
continue; /* go to the next 'ready list' */
|
||||
}
|
||||
pxTCB = prvFirstTaskGet( pxList );
|
||||
if( pxTCB != NULL ) {
|
||||
// take care not to return garbage
|
||||
return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL;
|
||||
}
|
||||
}
|
||||
/* other tasks lists */
|
||||
for (i = 0; i < sizeof(task_lists)/sizeof(task_lists[0]); i++) {
|
||||
List_t *pxList = task_lists[ i ];
|
||||
if( bCurTaskListFound == pdFALSE && pxTaskList != NULL ) {
|
||||
/* need to find list the current task item from */
|
||||
if( pxTaskList == pxList ) {
|
||||
bCurTaskListFound = pdTRUE;
|
||||
}
|
||||
continue; /* go to the next 'ready list' */
|
||||
}
|
||||
pxTCB = prvFirstTaskGet( pxList );
|
||||
if( pxTCB != NULL ) {
|
||||
// take care not to return garbage
|
||||
return portVALID_TCB_MEM(pxTCB) ? pxTCB : NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Code below here allows additional code to be inserted into this source file,
|
||||
especially where access to file scope functions and data is needed (for example
|
||||
when performing module tests). */
|
||||
|
||||
Reference in New Issue
Block a user