我正在使用FreeRTOS在STM32(Cortex-M3)上工作,并使用ST的CMSIS库来引导一切。
CMSIS库在启动的".s"文件中定义了弱符号"SVC_Handler"。为了将您的ISR放入中断向量表中,必须在某个地方覆盖它。FreeRTOS定义了"vPortSVCHandler",这是我想要处理SVC中断的ISR。
我希望使用我的应用程序代码将两者"粘合"在一起(即不修改FreeRTOS或CMSIS源代码)。我认为别名是完成此任务的正确工具,所以我尝试了以下方法(在一个单独的源文件main.c中):
这导致出现错误:'SVC_Handler'别名为未定义的符号 'vPortSVCHandler'。
事实证明,根据GCC文档http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html,为了使用alias属性,你不能将一个符号别名化到翻译单元之外。所以我想尝试在main.c中使用extern来引用该符号。
这会产生相同的错误。有什么建议吗?
我真的不想修改任何一个库。我知道我可以编写一个名为SVC_Handler的函数,只需调用vPortSVCHandler,但这可能会给ISR增加不必要的开销(可能取决于优化设置)。注意:FreeRTOS示例通过自定义启动文件实现了这一点。我正在寻找一种从C或我的链接脚本中实现这一点的方法。
编译器版本:gcc version 4.5.2 (Sourcery G++ Lite 2011.03-42) 目标:arm-none-eabi
CMSIS库在启动的".s"文件中定义了弱符号"SVC_Handler"。为了将您的ISR放入中断向量表中,必须在某个地方覆盖它。FreeRTOS定义了"vPortSVCHandler",这是我想要处理SVC中断的ISR。
我希望使用我的应用程序代码将两者"粘合"在一起(即不修改FreeRTOS或CMSIS源代码)。我认为别名是完成此任务的正确工具,所以我尝试了以下方法(在一个单独的源文件main.c中):
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
这导致出现错误:'SVC_Handler'别名为未定义的符号 'vPortSVCHandler'。
事实证明,根据GCC文档http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html,为了使用alias属性,你不能将一个符号别名化到翻译单元之外。所以我想尝试在main.c中使用extern来引用该符号。
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
这会产生相同的错误。有什么建议吗?
我真的不想修改任何一个库。我知道我可以编写一个名为SVC_Handler的函数,只需调用vPortSVCHandler,但这可能会给ISR增加不必要的开销(可能取决于优化设置)。注意:FreeRTOS示例通过自定义启动文件实现了这一点。我正在寻找一种从C或我的链接脚本中实现这一点的方法。
编译器版本:gcc version 4.5.2 (Sourcery G++ Lite 2011.03-42) 目标:arm-none-eabi
extern
的变量,在这种情况下别名解决方案也无法起作用。 - stefanct