Skip to content

ESP32-C3 监控

通过代码查看当前运行的系统中有哪些任务在运行。

1. 前提条件

需要在 idf.py menuconfig 中启用 CONFIG_FREERTOS_USE_TRACE_FACILITYCONFIG_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