GCC别名在翻译单元-AKA-之外运行,这甚至是适合这项工作的工具吗?
我正在使用STR32(Cortex-M3)上的FreeRTOS,并使用ST的CMSIS库来引导所有内容。
CMSIS库在启动“.s”文件中定义弱符号SVC_Handler
。 必须在某处重写它才能将ISR置于中断向量表中。 FreeRTOS定义了vPortSVCHandler
,这是我想要处理SVC中断的ISR。
我想使用我的应用程序代码(即没有修改FreeRTOS或CMSIS源代码)将两者“粘合”在一起。 我认为别名是工作的正确工具,所以我尝试了这个(在一个单独的源文件main.c中):
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
这导致: error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
事实certificate,根据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")));
这会产生相同的错误。 有什么建议???
我真的想避免修改任何一个库。 我知道我可以编写一个简单调用vPortSVCHandler
的函数SVC_Handler
,但这可能vPortSVCHandler
ISR增加不必要的开销(可能取决于优化设置)。 注意:FreeRTOS示例通过自定义启动文件实现此目的。 我正在寻找一种方法来从C 或我的链接器脚本执行此操作。
- 编译器版本:gcc版本4.5.2(Sourcery G ++ Lite 2011.03-42)
- 目标:arm-none-eabi
您应该能够使用链接描述文件或通过将适当的选项传递给链接器来执行此操作,例如。 对于ld, – --defsym=SVC_Handler=vPortSVCHandler
有关ld --defsym
选项以及链接描述文件中的赋值的更多信息,请参阅binutils文档
我认为别名的问题是,它需要一个声明和定义的函数,因为它只是一个别名。 您希望将其用作另一个函数的前向声明。 我得到了类似的工作:
void SVC_Handler(void) asm("vPortSVCHandler");
这将重命名SVC_Handler的入口点,如果您不定义它,它应该找到vPortSVCHandler。
请参阅: https : //gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html
我从其中一个FreeRTOS示例中收集到的另一个解决方案是将以下内容添加到FreeRTOSConfig.h中…
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS standard names - or at least those used in the unmodified vector table. */ #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler
原始文件来自FreeRTOS / Demo / CORTEX_M0_LPC1114_LPCXpresso / RTOSDemo / Source / FreeRTOSConfig.h,它还将CMSIS系统时钟集成到配置中。 CMSIS / FreeRTOS项目的一个非常好的起点。
我很确定SVC处理程序仅在初始启动时由FreeRTOS使用,因此添加间接exception处理程序不会损害性能(但它的丑陋)。 最好在FreeRTOS论坛上问这个,回复通常很棒。
希望这有帮助,最好的问候,戴夫