1-获取系统的任务状态(uxTaskGetSystemState())
1.1 函数描述
UBaseType_t uxTaskGetSystemState(
TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
unsigned long * const pulTotalRunTime );
configUSE_TRACE_FACILITY 必须设置为1
该函数向TaskStatus_t结构体填充相关信息,系统中每一个任务的信息都可以填充到TaskStatus_t结构体数组中,数组大小由uxArraySize指定。结构体TaskStatus_t定义如下:
typedef struct xTASK_STATUS
{
TaskHandle_t xHandle;
const signed char *pcTaskName;
UBaseType_t xTaskNumber;
eTaskState eCurrentState;
UBaseType_t uxCurrentPriority;
UBaseType_t uxBasePriority;
unsigned long ulRunTimeCounter;
StackType_t *pxStackBase;
configSTACK_DEPTH_TYPE usStackHighWaterMark;
} TaskStatus_t;
注意,这个函数仅用来调试用,调用此函数会挂起所有任务,直到函数最后才恢复挂起的任务,因此任务可能被挂起很长时间。在文件FreeRTOSConfig.h中,宏configUSE_TRACE_FACILITY必须设置为1,此函数才有效。
1.2 参数描述
pxTaskStatusArray:指向TaskStatus_t类型的结构体数组。这个数组至少要包含1个元素。RTOS控制的任务数量可以使用API函数uxTaskGetNumberOfTasks()获取。
uxArraySize:参数pxTaskStatusArray指向的数组大小,也就是该数组的索引数目。
pulTotalRunTime:如果在文件FreeRTOSConfig.h中设置宏configGENERATE_RUN_TIME_STATS为1,则该函数将总运行时间写入*pulTotalRunTime中。pulTotalRunTime可以设置为NULL,表示忽略总运行时间。
返回值:由uxTaskGetSystemState()填充的TaskStatus_t结构的数量。这个值应该等于uxTaskGetNumberOfTasks() API函数返回的值,但是如果uxArraySize参数传递的值太小,它将为零。
1.3 用例
void vTaskGetRunTimeStats(signed char *pcWriteBuffer )
{
TaskStatus_t*pxTaskStatusArray;
volatileUBaseType_t uxArraySize, x;
unsignedlong ulTotalRunTime, ulStatsAsPercentage;
*pcWriteBuffer = 0x00;
uxArraySize = uxTaskGetNumberOfTasks ();
pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ));
if(pxTaskStatusArray != NULL )
{
uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize,&ulTotalRunTime );
ulTotalRunTime /= 100UL;
if(ulTotalRunTime > 0 )
{
for( x &#61; 0; x < uxArraySize; x&#43;&#43; )
{
ulStatsAsPercentage &#61; 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
{
sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n",
pxTaskStatusArray[ x ].pcTaskName,
pxTaskStatusArray[x ].ulRunTimeCounter );
}
pcWriteBuffer &#43;&#61; strlen( ( char * ) pcWriteBuffer );
}
}
vPortFree( pxTaskStatusArray );
}
}
2-获取任务消息&#xff08;vTaskGetInfo()&#xff09;
2.1 函数描述
void vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t *pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState );
configUSE_TRACE_FACILITY必须设置1
uxTaskGetSystemState()为系统中的每个任务填充TaskStatus_t结构&#xff0c;而vTaskGetInfo()仅为单个任务填充TaskStatus_t结构。TaskStatus_t结构包含任务句柄的成员、任务名称、任务优先级、任务状态和任务消耗的运行时间总量。
注意:此函数仅用于调试&#xff0c;因为使用它会导致调度器在较长时间内保持挂起状态。
2.2 参数描述
xTask &#xff1a; 正在查询任务的句柄。将xTask设置为NULL将返回调用任务的信息。
**pxTaskStatus&#xff1a;**由pxTaskStatus指向的TaskStatus_t结构体将被xTask参数中传递的句柄所引用的任务的信息填充。
xGetFreeStackSpace&#xff1a; TaskStatus_t结构包含一个成员&#xff0c;用于报告正在查询的任务的堆栈高水位标记。堆栈高水位标志是曾经存在的堆栈空间的最小值&#xff0c;因此该数字越接近零&#xff0c;任务就越接近溢出堆栈。计算堆栈高水位标志需要相对较长的时间&#xff0c;并且可能使系统暂时无响应——因此提供xGetFreeStackSpace参数以允许跳过高水位标志检查。如果xGetFreeStackSpace没有设置为pdFALSE&#xff0c;高水位值只会被写入TaskStatus_t结构。
eState&#xff1a; TaskStatus_t结构体包含一个成员&#xff0c;用于报告正在查询的任务的状态。获取任务状态没有简单的赋值那么快——因此提供eState参数以允许从TaskStatus_t结构中省略状态信息。要获得状态信息&#xff0c;请将eState设置为eInvalid—否则在eState中传递的值将作为TaskStatus_t结构中的任务状态报告。
2.3 用例
void vAFunction( void )
{
TaskHandle_t xHandle;
TaskStatus_t xTaskDetails;
xHandle &#61; xTaskGetHandle( "Task_Name" );
configASSERT( xHandle );
vTaskGetInfo(
xHandle,
&xTaskDetails,
pdTRUE,
eInvalid );
}
2.4 The TaskStatus_t definition
typedef struct xTASK_STATUS
{
TaskHandle_t xHandle;
const signed char *pcTaskName;
UBaseType_t xTaskNumber;
eTaskState eCurrentState;
UBaseType_t uxCurrentPriority;
UBaseType_t uxBasePriority;
unsigned long ulRunTimeCounter;
StackType_t *pxStackBase;
configSTACK_DEPTH_TYPE usStackHighWaterMark;
} TaskStatus_t;