/* This example demonstrates how a human readable table of run time stats information is generated from raw data provided by uxTaskGetSystemState(). The human readable table is written to pcWriteBuffer. (see the vTaskList() API function which actually does just this). */ void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) { TaskStatus_t *pxTaskStatusArray; volatile UBaseType_t uxArraySize, x; unsigned long ulTotalRunTime, ulStatsAsPercentage; /* Make sure the write buffer does not contain a string. */ *pcWriteBuffer = 0x00; /* Take a snapshot of the number of tasks in case it changes while this function is executing. */ uxArraySize = uxCurrentNumberOfTasks(); /* Allocate a TaskStatus_t structure for each task. An array could be allocated statically at compile time. */ pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) ); if( pxTaskStatusArray != NULL ) { /* Generate raw status information about each task. */ uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime ); /* For percentage calculations. */ ulTotalRunTime /= 100UL; /* Avoid divide by zero errors. */ if( ulTotalRunTime > 0 ) { /* For each populated position in the pxTaskStatusArray array, format the raw data as human readable ASCII data. */ for( x = 0; x < uxArraySize; x++ ) { /* What percentage of the total run time has the task used? This will always be rounded down to the nearest integer. ulTotalRunTimeDiv100 has already been divided by 100. */ ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime; if( ulStatsAsPercentage > 0UL ) { sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); } else { /* If the percentage is zero here then the task has consumed less than 1% of the total run time. */ sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); } pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); } } /* The array is no longer needed, free the memory it consumes. */ vPortFree( pxTaskStatusArray ); } }
The TaskStatus_t definitiontypedef struct xTASK_STATUS { /* The handle of the task to which the rest of the information in the structure relates. */ TaskHandle_t xHandle; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ const signed char *pcTaskName; /* A number unique to the task. */ UBaseType_t xTaskNumber; /* The state in which the task existed when the structure was populated. */ eTaskState eCurrentState; /* The priority at which the task was running (may be inherited) when the structure was populated. */ UBaseType_t uxCurrentPriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ UBaseType_t uxBasePriority; /* The total run time allocated to the task so far, as defined by the run time stats clock. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ unsigned long ulRunTimeCounter; /* Points to the lowest address of the task's stack area. */ StackType_t *pxStackBase; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ unsigned short usStackHighWaterMark; } TaskStatus_t;
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|
Latest News
NXP tweet showing LPC5500 (ARMv8-M Cortex-M33) running FreeRTOS. Meet Richard Barry and learn about running FreeRTOS on RISC-V at FOSDEM 2019 Version 10.1.1 of the FreeRTOS kernel is available for immediate download. MIT licensed. View a recording of the "OTA Update Security and Reliability" webinar, presented by TI and AWS. Careers
FreeRTOS and other embedded software careers at AWS. FreeRTOS Partners
|