FreeRTOS如何获取当前运行任务名称并打印?解决编译与链接错误
问题描述
我正在使用FreeRTOS,希望获取当前运行任务的名称并将其打印出来,请问如何通过句柄提取当前运行任务的名称并打印?以下是我的任务代码示例及尝试的打印方式:
void TaskBlink(void *pvParameters) // This is a task. { (void) pvParameters; TaskHandle_t xHandle; TaskStatus_t xTaskDetails; // initialize digital LED_BUILTIN on pin 13 as an output. pinMode(LED_BUILTIN, OUTPUT); for (;;) // A Task shall never return or exit. { xHandle = xTaskGetHandle( "Task_Name" ); Serial.println(xHandle); digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second } }
但出现编译错误:
Compilation error: no matching function for call to 'println(TaskControlBlock_t*&)'
补充说明:我将FreeRTOSConfig.h中的USE_TRACE_FACILITY标志设为1后,又出现链接错误:
Blink_AnalogRead/Blink_AnalogRead.ino:80: undefined reference to `xTaskGetHandle'
请求解决上述问题。
解决方案
1. 解决编译错误:Serial.println(xHandle) 无效的问题
xHandle 是任务句柄(指针类型),Serial.println 没有直接打印该类型的重载函数。要获取任务名称,需通过句柄读取任务的名称字段,或使用FreeRTOS提供的封装函数提取。
另外,如果你要获取当前运行任务的名称,无需调用 xTaskGetHandle 通过名字查句柄,直接用 xTaskGetCurrentTaskHandle() 获取当前任务句柄即可,更高效。
2. 解决链接错误:undefined reference to xTaskGetHandle
xTaskGetHandle 等函数需要在FreeRTOSConfig.h中开启对应宏定义才能被编译:
- 确保
INCLUDE_xTaskGetHandle设为1 configUSE_TRACE_FACILITY设为1是使用vTaskGetInfo的前提,但xTaskGetHandle单独依赖INCLUDE_xTaskGetHandle
修正后的代码示例
以下是能正确获取并打印当前任务名称的代码:
void TaskBlink(void *pvParameters) { (void) pvParameters; TaskHandle_t xCurrentHandle; TaskStatus_t xTaskDetails; pinMode(LED_BUILTIN, OUTPUT); for (;;) { // 获取当前运行任务的句柄 xCurrentHandle = xTaskGetCurrentTaskHandle(); // 方法1:用封装函数直接获取任务名称(推荐) Serial.println( pcTaskGetName(xCurrentHandle) ); // 方法2:通过vTaskGetInfo获取完整任务信息后提取名称 // vTaskGetInfo( // xCurrentHandle, // &xTaskDetails, // pdTRUE, // pdTRUE填充栈信息,pdFALSE不填充,节省资源 // eInvalid // 无需任务状态,传eInvalid即可 // ); // Serial.println(xTaskDetails.pcTaskName); digitalWrite(LED_BUILTIN, HIGH); vTaskDelay( 1000 / portTICK_PERIOD_MS ); digitalWrite(LED_BUILTIN, LOW); vTaskDelay( 1000 / portTICK_PERIOD_MS ); } }
必要的FreeRTOSConfig.h配置
确保以下宏在FreeRTOSConfig.h中正确设置:
#define configUSE_TRACE_FACILITY 1 // 用于vTaskGetInfo #define INCLUDE_xTaskGetHandle 1 // 用于xTaskGetHandle(通过任务名查句柄时需要) #define INCLUDE_xTaskGetCurrentTaskHandle 1 // 用于xTaskGetCurrentTaskHandle #define INCLUDE_pcTaskGetName 1 // 用于pcTaskGetName(推荐的快捷函数)
关键说明
pcTaskGetName(xHandle)是FreeRTOS提供的封装函数,直接返回任务名称字符串,是最简单的实现方式。- 如果一定要用
xTaskGetHandle("Task_Name"),必须确保任务名称真实存在,且开启INCLUDE_xTaskGetHandle宏。 - FreeRTOS的多数扩展函数都需要通过宏定义开启才会被编译进固件,链接错误通常是因为缺少对应开关。
内容的提问来源于stack exchange,提问作者user3147192
相关产品推荐
相关产品推荐

