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