解决FreeRTOS裁剪移植后编译报错:..\OBJ\BKM32.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred

问题出现

在将FreeRTOS裁剪移植后,出现了在keil里关于一些标识符未定义的报错**
如下图:
在这里插入图片描述

  • 根据报错信息,发现在task.o目标文件里有个钩子函数vApplicationTickHook未定义,然后去task.h文件里去找这个函数,发现有一个预编译条件,得要configUSE_TICK_HOOK这个宏常量大于0,才编译这个钩子函数。
#if  ( configUSE_TICK_HOOK > 0 )

/**
 *  task.h
 * @code{c}
 * void vApplicationTickHook( void );
 * @endcode
 *
 * This hook function is called in the system tick handler after any OS work is completed.
 */
    void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */

#endif
  • 接着,跳转到configUSE_TICK_HOOK这个宏常量所定义的头文件FreeRTOSConfig.h头文件里,发现这个宏是被定义为了1啊,按道理,那么这个vApplicationTickHook()钩子函数也应该被编译啊,到这里就有点百思不得其解。

在这里插入图片描述

  • 最后,在task.c文件里去搜索这个vApplicationTickHook,才发现这个钩子函数没有定义。

在这里插入图片描述

  • 然后,去搜了下这个钩子函数的用法,以下是定义,原来这个钩子函数是用户可自行根据需求去编写的,FreeRTOS官方没有提供这个函数的源码,所以在链接阶段没有找到task.o里这个函数的定义。

在 FreeRTOS 或类似的实时操作系统(RTOS)中,vApplicationTickHook 是一个钩子函数(hook function),它可以在每个系统时钟节拍(tick)时被调用,用于执行用户自定义的代码。

问题解决

方法1:在FreeRTOSConfig.h头文件里,将宏常量configUSE_TICK_HOOK置为0,即让编译器不编译这个vApplicationTickHook()钩子函数,这样编译时不会再报此错误。
方法二:在task.c文件里写一个vApplicationTickHook()钩子函数的定义,不去实现任何逻辑,这样也可以解决这个报错。
在这里插入图片描述

  • 其余几个报错也是以此类推去解决。

问题总结

  • 在FreeRTOS的官方源码中,很多功能是通过钩子函数(hook functions)或可选的配置宏来提供的,这些回调函数或宏允许用户根据自己的需求来定制FreeRTOS的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值