GCC别名翻译单元之外的功能-AKA-这是正确的工具吗?

oknwwptz  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(73)

我正在STM32(Cortex-M3)上使用FreeRTOS,并使用ST的CMSIS库来引导所有内容。
CMSIS库在启动“.s”文件中定义了弱符号SVC_Handler。它必须在某个地方被覆盖,以便在中断向量表中获得ISR。FreeRTOS定义了vPortSVCHandler,这是我想要处理SVC中断的ISR。
我想用我的应用程序代码将两者“粘合”在一起(即w/o修改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
6psbrbz9

6psbrbz91#

你应该能够做到这一点,无论是与链接器脚本,或通过传递适当的选项,链接器,如。对于ld,--defsym=SVC_Handler=vPortSVCHandler
有关ld --defsym选项和链接器脚本中赋值的更多信息,请参见binutils文档

x6h2sr28

x6h2sr282#

我认为alias的问题是,它需要一个声明和定义的函数,因为它只是一个别名。你想用它作为另一个函数的前向声明。我有一个类似的东西这样工作:

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

字符串
这将重命名SVC_Handler的入口点,如果您没有定义它,它将找到vPortSVCHandler。
参见:https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

wko9yo5t

wko9yo5t3#

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

slhcrj9b

slhcrj9b4#

我很确定SVC处理程序只在FreeRTOS初始启动时使用,因此添加间接异常处理程序不会损害性能(但它很丑)。最好在FreeRTOS论坛上问这个问题,那里的React通常很好。
希望这对你有帮助,最好的问候,戴夫

相关问题