ESP32-C3 监控
通过代码查看当前运行的系统中有哪些任务在运行。
1. 前提条件
需要在 idf.py menuconfig
中启用 CONFIG_FREERTOS_USE_TRACE_FACILITY
和 CONFIG_FREERTOS_TRACE_TASK_STACK_MONITOR
。
Component config -> FreeRTOS -> Kernel -> configUSE_TRACE_FACILITY[Y] && configUSE_STATS_FORMATTING_FUNCTIONS[Y]
这样配置后,在 sdkconfig
中会生成以下配置:
CONFIG_FREERTOS_USE_TRACE_FACILITY=y
CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y
这样准备工作,就结束了。
2. 编写代码
在你想要查看任务的文件中的某个合适位置,添加以下函数的执行以下代码:
c
void print_tasks_info() {
char *task_status[] = {"Running", "Ready", "Blocked", "Suspended", "Deleted"};
UBaseType_t num_tasks = uxTaskGetNumberOfTasks();
TaskStatus_t *tasks = pvPortMalloc(num_tasks * sizeof(TaskStatus_t));
if(tasks) {
num_tasks = uxTaskGetSystemState(tasks, num_tasks, NULL);
for(int i=0; i<num_tasks; i++) {
ESP_LOGI("TASK_MONITOR",
"Task: %-12s State: %-8s Prio: %2u Stack: %5u",
tasks[i].pcTaskName,
task_status[tasks[i].eCurrentState],
tasks[i].uxCurrentPriority,
tasks[i].usStackHighWaterMark);
}
vPortFree(tasks);
}
}
3. 编译运行
编译运行后,在串口助手上,就可以看到当前系统中有哪些任务在运行了。
I (10981) TASK_MONITOR: Task: main State: Running Prio: 1 Stack: 1540
I (10991) TASK_MONITOR: Task: IDLE State: Ready Prio: 0 Stack: 1256
I (11001) TASK_MONITOR: Task: tiT State: Blocked Prio: 18 Stack: 2432
I (11011) TASK_MONITOR: Task: mdns State: Blocked Prio: 1 Stack: 2552
I (11011) TASK_MONITOR: Task: esp_timer State: Suspended Prio: 22 Stack: 3672
I (11021) TASK_MONITOR: Task: wifi State: Blocked Prio: 23 Stack: 4028
I (11031) TASK_MONITOR: Task: httpd State: Blocked Prio: 5 Stack: 3480
I (11031) TASK_MONITOR: Task: sys_evt State: Blocked Prio: 20 Stack: 940
I (11041) TASK_MONITOR: Task: Tmr Svc State: Blocked Prio: 1 Stack: 1776
4. 说明参数
FreeRTOS任务状态的含义如下:
- Running (运行中): 当前正在CPU上执行的任务 单核ESP32同一时刻只有一个任务处于此状态 示例中的"main"任务
- Ready (就绪): 任务准备就绪,等待调度器分配CPU时间 示例中的"IDLE"任务(空闲任务)
- Blocked (阻塞): 任务正在等待某个事件(如信号量、队列、延时等) 常见阻塞任务:
- "httpd":等待HTTP请求
- "wifi":等待网络事件
- "Tmr Svc":定时器服务任务
- Suspended (挂起): 任务被显式挂起(通过vTaskSuspend()) 不会参与调度,直到被恢复 示例中的"esp_timer"任务
- Deleted (已删除): 任务已被删除但资源尚未完全释放 您的输出中未出现此状态
- 各状态转换关系:
text
Ready → Running ←→ Blocked
↑ ↓
└── Suspended
5. 注意事项
"tiT"任务通常是ESP-IDF系统中的定时器任务(Timer Task),具体分析如下:
任务特征:
名称缩写:tiT = timer Task 较高优先级(Prio:18):高于多数应用任务 阻塞状态(Blocked):等待定时事件触发 中等堆栈用量(2432字节):处理定时回调需要一定栈空间功能作用:
管理系统软件定时器(esp_timer) 处理周期性定时事件 触发注册的回调函数相关代码位置:
ESP-IDF组件:esp_timer 源码文件:esp-idf/components/esp_timer/src/esp_timer.c典型行为:
大部分时间处于Blocked状态等待定时事件 定时触发时短暂进入Ready/Running状态 执行完回调后重新进入Blocked