问题出现
在将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的行为。