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

时间:2011-10-04 15:04:13

标签: c gcc cortex-m3 freertos codesourcery

我在STM32(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'

根据此处的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

4 个答案:

答案 0 :(得分:8)

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

有关ld --defsym选项和assignments in linker scripts

的更多信息,请参阅binutils文档。

答案 1 :(得分:2)

我认为别名的问题是,它需要声明和定义的函数,因为它只是一个别名。您希望将其用作另一个函数的前向声明。我有类似的工作:

void SVC_Handler(void) asm("vPortSVCHandler");

这会重命名SVC_Handler的入口点,如果您没有定义它,它应该找到vPortSVCHandler。

请参阅:https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

答案 2 :(得分:1)

我从其中一个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项目的一个非常好的起点。

答案 3 :(得分:0)

我很确定SVC处理程序仅供FreeRTOS使用 在初始启动时,所以添加间接异常 处理程序不会伤害性能(但它的 丑陋)。最好在FreeRTOS论坛上提问,回复 通常很棒。

希望这有帮助,最诚挚的问候,戴夫