资讯动态

FreeRtos——16、查询freeRTOS任务的状态

发布时间:2026/9/5 23:13:08 来源:尧图企业网站定制
FreeRTOS 中如何查询任务的运行状态比如运行、阻塞、挂起等这是调试和监控系统运行状态的重要能力。FreeRTOS 提供了多种方式查询任务状态既可以获取单个任务的状态也能批量查看所有任务的状态信息。下面我会详细讲解具体实现方法包括核心 API、代码示例和状态含义。一、任务状态的核心定义首先明确 FreeRTOS 中任务的几种核心状态宏定义在task.h中状态宏缩写含义eRunningR任务正在运行仅单核 CPU同一时间只有 1 个eReadyR任务就绪等待调度器调度eBlockedB任务被阻塞延时、等待信号量 / 队列等eSuspendedS任务被挂起调用vTaskSuspend()eDeletedD任务已删除但未清理资源二、查询任务状态的两种方法方法 1查询单个任务的状态xTaskGetTaskState适用于针对性查看某个任务的状态核心 APIeTaskState xTaskGetTaskState( TaskHandle_t xTask );参数xTask- 任务句柄传 NULL 表示当前任务返回值eTaskState枚举类型代表任务状态完整示例代码#include FreeRTOS.h #include task.h #include stdio.h // 定义任务句柄 TaskHandle_t xTestTaskHandle NULL; // 测试任务 void vTestTask(void *pvParameters) { for(;;) { vTaskDelay(pdMS_TO_TICKS(1000)); // 任务阻塞1秒 } } // 解析任务状态并打印 void vPrintTaskState(eTaskState eState) { switch(eState) { case eRunning: printf(状态运行(Running)\r\n); break; case eReady: printf(状态就绪(Ready)\r\n); break; case eBlocked: printf(状态阻塞(Blocked)\r\n); break; case eSuspended: printf(状态挂起(Suspended)\r\n); break; case eDeleted: printf(状态已删除(Deleted)\r\n); break; default: printf(状态未知\r\n); break; } } // 查询单个任务状态的函数 void vCheckSingleTaskState(void) { // 1. 查询当前任务的状态 eTaskState eCurrentState xTaskGetTaskState(NULL); printf(当前任务); vPrintTaskState(eCurrentState); // 2. 查询指定任务的状态需任务句柄 if(xTestTaskHandle ! NULL) { eTaskState eTestState xTaskGetTaskState(xTestTaskHandle); printf(测试任务); vPrintTaskState(eTestState); } } // 创建任务 void vCreateTasks(void) { xTaskCreate(vTestTask, // 任务函数 TestTask, // 任务名 1024, // 堆栈大小字 NULL, // 参数 tskIDLE_PRIORITY 1,// 优先级 xTestTaskHandle); // 任务句柄 }方法 2批量查看所有任务状态vTaskList这是最常用的全局监控方式能一次性获取所有任务的状态、优先级、堆栈等信息需先开启配置宏// 在FreeRTOSConfig.h中开启 #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1批量查询代码示例#include FreeRTOS.h #include task.h #include stdio.h // 缓冲区需足够大根据任务数量调整建议1024字节以上 #define TASK_LIST_BUFFER_SIZE 1024 static char pcTaskListBuffer[TASK_LIST_BUFFER_SIZE]; // 打印所有任务状态及信息 void vPrintAllTaskStates(void) { // 获取所有任务信息状态、优先级、堆栈等 vTaskList(pcTaskListBuffer); // 格式化打印 printf(\r\n); printf(任务名\t状态\t优先级\t剩余堆栈\t任务ID\r\n); printf(-----------------------------------------\r\n); printf(%s, pcTaskListBuffer); printf(\r\n); } // 示例在低优先级任务中定时打印 void vMonitorTask(void *pvParameters) { for(;;) { vPrintAllTaskStates(); // 打印所有任务状态 vTaskDelay(pdMS_TO_TICKS(2000)); // 每2秒打印一次 } }典型输出结果任务名 状态 优先级 剩余堆栈 任务ID-----------------------------------------IDLE R 0 118 1TestTask B 1 980 2Monitor R 2 856 3UART B 3 720 4状态缩写对应R运行 / 就绪、B阻塞、S挂起、D已删除单核 CPU 中R状态只会出现在当前正在运行的任务上其他就绪任务也显示为R三、进阶结合任务名查询状态xTaskGetHandle如果只有任务名没有任务句柄可先通过任务名获取句柄再查询状态// 根据任务名获取句柄注意需开启configUSE_APPLICATION_TASK_TAG1 TaskHandle_t xHandle xTaskGetHandle(TestTask); if(xHandle ! NULL) { eTaskState eState xTaskGetTaskState(xHandle); printf(TestTask状态); vPrintTaskState(eState); } else { printf(未找到TestTask任务\r\n); }四、注意事项API 调用上下文xTaskGetTaskState()可在任务 / 中断中调用中断中需用xTaskGetTaskStateFromISRvTaskList()禁止在中断中调用且会短暂关闭调度器建议在低优先级任务中使用配置依赖所有状态查询功能都需要开启configUSE_TRACE_FACILITY1否则 API 不可用状态判断逻辑阻塞状态eBlocked任务因vTaskDelay、等待信号量 / 队列、等待事件等进入挂起状态eSuspended仅通过vTaskSuspend()/xTaskResume()主动控制就绪状态eReady任务已就绪但未被调度和运行状态共用R缩写总结查询单个任务状态用xTaskGetTaskState()需传入任务句柄返回枚举类型的完整状态批量查看所有任务状态用vTaskList()输出包含状态、优先级、堆栈等综合信息最适合全局监控状态缩写中R代表运行 / 就绪、B代表阻塞、S代表挂起是调试中最常关注的三种状态。通过这些方法你可以全面监控 FreeRTOS 中所有任务的运行状态快速定位任务阻塞、挂起等异常问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价