FreeRTOS打印任务状态#

FreeRTOS中如果想使用 vTaskList 函数来打印系统任务状态信息,以下配置项必须为1:

  1. configUSE_TRACE_FACILITY

  2. configUSE_STATS_FORMATTING_FUNCTIONS

task.c ‣ vTaskList#
4431#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
4432
4433void vTaskList( char * pcWriteBuffer )
4434{
4435...

该函数内部先调用 uxTaskGetSystemState 函数获取任务状态原始数据,再将这些原始数据格式化为方便人为查看的字符串。 该函数只格式化了任务状态原始数据中的 任务名称任务状态任务优先级任务栈空闲深度任务号

警告

该函数只应做为调试阶段使用,在发布版中应少用。

示例:
main.c ‣ vApplicationStackOverflowHook#
void vApplicationStackOverflowHook(osThreadId_t xTask, char *pcTaskName)
{
        extern void vTaskList( char * pcWriteBuffer );
        vTaskList(tasks_status);
#ifdef ELOG_ASSERT_ENABLE
    elog_async_enabled(false);
#endif
        elog_raw("task name    status  priority  statck   id\r\n");
        elog_raw("==========================================\r\n");
        elog_raw(tasks_status);
        osThreadExit();
}

当有任务发生栈溢出时会打印如下信息:

System core frequencey:48000000Hz
task name    status  priority  statck   id
==========================================
elog            R       1       118     2
IDLE            R       0       118     3
defaultTask     X       24      0       1
Tmr Svc         B       40      20      4

可以看出 defaultTask 的栈空间为0,它发生了栈溢出