1.具体问题
在初学RTThread着手最基础的——动态内存分配线程来控制LED闪烁。keil5编译时遇到以下的错误提示:
STM32L431RC_BearPiLED\STM32L431RC_BearPiLED.axf: Error: L6218E: Undefined symbol rt_system_heap_init (referred from board.o).
2.问题分析
猜想:
undefined,rt_system_heap_init,这两个关键词说明error与函数定义或者声明缺失有关,而且这个函数也的确是后面加上,忽略了在定义函数的.c文件进行定义或.h进行声明也是有可能的。
进一步:
找到函数调用的地方`
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
顺着函数查看函数的声明时发现——函数在rtthread.h文件进行声明,具体如下,到这里便可以确定错误的原因是调用函数缺少声明!原因是我的 RT_USING_HEAP 宏定义定义在另外一处地方,导致此处无法触发条件编译,进而缺少函数声明,所以链接时出现问题。
#ifdef RT_USING_HEAP
/*
* heap memory interface
*/
void rt_system_heap_init(void *begin_addr, void *end_addr);