最近在学习FreeRTOS中出现了一个问题。
Error: L6218E: Undefined symbol eTaskGetState (referred from apptask.o).
像这种问题通常表示你的代码中使用了 FreeRTOS 函数 eTaskGetState,但链接器找不到这个函数的定义。这通常发生在 FreeRTOS 库没有正确链接或你正在尝试调用的函数与你使用的 FreeRTOS 版本不匹配时。
但是我很确定我的FreeRTOS移植是正确的。
第一步查找函数位置
eTaskGetState() 函数用于获取 FreeRTOS 中任务的状态。
任务状态包括以下几种:
- eRunning(运行中):任务当前正在运行或处于就绪状态,等待 CPU 时间片来执行。
- eReady(就绪):任务已经准备好运行,但由于其他高优先级任务正在执行,它尚未获得 CPU 时间片。
- eBlocked(阻塞):任务由于等待某些事件(例如信号量、消息队列、定时器等)而被阻塞,不能执行。
- eSuspended(挂起):任务被暂停执行,它不会被调度执行,直到被明确地恢复。
- eDeleted(已删除):任务已被删除并且不再存在。
那么一定就是位于 task.c 中。
查看用法
Ctrl+F搜索"eTaskGetState()"
#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) )
eTaskState eTaskGetState( TaskHandle_t xTask )
{
eTaskState eReturn;
List_t const * pxStateList;
List_t const * pxDelayedList;
List_t const * pxOverflowedDelayedList;
const TCB_t * const pxTCB = xTask;
......
}
.....
}
你会发现需要先定义宏
INCLUDE_eTaskGetState == 1
configUSE_TRACE_FACILITY == 1
INCLUDE_xTaskAbortDelay == 1
那么这三个宏定义有什么作用呢?
- INCLUDE_eTaskGetState:用于启用 eTaskGetState() 函数的宏定义。确保将此宏定义设置为 1,以便编译器包含该函数的定义。
- configUSE_TRACE_FACILITY:用于启用 FreeRTOS 的跟踪功能。如果你的应用程序需要跟踪任务状态,你需要将此宏定义设置为 1。
- INCLUDE_xTaskAbortDelay:如果你想使用 xTaskAbortDelay() 函数,你需要将此宏定义设置为 1。
所以如果我们需要使用eTaskGetState(),需要将
INCLUDE_eTaskGetState
定义为1.
在FreeRTOSconfig.h配置
直接插入就行
#define INCLUDE_eTaskGetState 1
#define configUSE_TRACE_FACILITY 1
#define INCLUDE_xTaskAbortDelay 1