GCC别名在翻译单元-AKA-之外运行,这甚至是适合这项工作的工具吗?

Bri*_*and 9 c gcc cortex-m3 codesourcery freertos

我正在使用STR32(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")));
Run Code Online (Sandbox Code Playgroud)

这导致: 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")));
Run Code Online (Sandbox Code Playgroud)

这会产生相同的错误.有什么建议???

我真的想避免修改任何一个库.我知道我可以编写一个SVC_Handler简单调用的函数vPortSVCHandler,但这可能会给ISR增加不必要的开销(可能取决于优化设置).注意:FreeRTOS示例通过自定义启动文件实现此目的.我正在寻找一种方法来从C 我的链接器脚本执行此操作.

  • 编译器版本:gcc版本4.5.2(Sourcery G ++ Lite 2011.03-42)
  • 目标:arm-none-eabi

Has*_*kun 8

您应该能够使用链接描述文件或通过将适当的选项传递给链接器来执行此操作,例如.对于ld,--defsym=SVC_Handler=vPortSVCHandler

有关ld --defsym选项的更多信息以及链接描述文件中的赋值,请参阅binutils文档

  • 只需将 `SVC_Handler = vPortSVCHandler;` 添加到链接器脚本的顶部即可完成工作。看起来仍然凌乱,但它有效。 (2认同)