xTaskCreateCheckpoint()函数源码
时间: 2024-05-09 16:19:40 浏览: 9
由于xTaskCreateCheckpoint()函数不是FreeRTOS API的一部分,因此它的源代码可能会因FreeRTOS版本而异。以下是一种可能的实现:
```
void xTaskCreateCheckpoint( void )
{
TaskHandle_t pxTaskToSuspend;
UBaseType_t uxArraySize, uxTaskNumber;
StaticTask_t *pxTaskTCB;
TickType_t xTickCount;
uint32_t ulStackUsed;
uint32_t ulStackHighWaterMark;
/* Suspend task to avoid race conditions */
pxTaskToSuspend = xTaskGetCurrentTaskHandle();
vTaskSuspend( pxTaskToSuspend );
/* Get the number of tasks currently executing */
uxArraySize = uxTaskGetNumberOfTasks();
/* Allocate memory for the task list */
TaskStatus_t *pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
if( pxTaskStatusArray != NULL )
{
/* Get the TCB of the calling task */
pxTaskTCB = ( StaticTask_t * ) pxTaskToSuspend;
/* Get the high water mark and stack usage of the calling task */
ulStackUsed = pxTaskTCB->pxTopOfStack - pxTaskTCB->pxStack;
ulStackHighWaterMark = uxTaskGetStackHighWaterMark( pxTaskToSuspend );
/* Get the tick count */
xTickCount = xTaskGetTickCount();
/* Get the task status of all tasks in the system */
uxTaskNumber = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL );
/* Write the checkpoint data to the log */
vTaskSuspendAll();
{
ulog_write( "Task checkpoint: task_name=%s, stack_used=%d, stack_high_water_mark=%d, tick_count=%d", pxTaskTCB->pcTaskName, ulStackUsed, ulStackHighWaterMark, xTickCount );
for( UBaseType_t i = 0; i < uxTaskNumber; i++ )
{
TaskStatus_t *pxTaskStatus = &pxTaskStatusArray[ i ];
ulog_write( "Task checkpoint: task_name=%s, stack_used=%d, stack_high_water_mark=%d, tick_count=%d", pxTaskStatus->pcTaskName, pxTaskStatus->usStackHighWaterMark, pxTaskStatus->usStackHighWaterMark, pxTaskStatus->ulRunTimeCounter );
}
}
xTaskResumeAll();
}
/* Free the memory used by the task list */
vPortFree( pxTaskStatusArray );
/* Resume the calling task */
vTaskResume( pxTaskToSuspend );
}
```