我正在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
4条答案
按热度按时间6psbrbz91#
你应该能够做到这一点,无论是与链接器脚本,或通过传递适当的选项,链接器,如。对于ld,
--defsym=SVC_Handler=vPortSVCHandler
有关ld
--defsym
选项和链接器脚本中赋值的更多信息,请参见binutils文档x6h2sr282#
我认为alias的问题是,它需要一个声明和定义的函数,因为它只是一个别名。你想用它作为另一个函数的前向声明。我有一个类似的东西这样工作:
字符串
这将重命名SVC_Handler的入口点,如果您没有定义它,它将找到vPortSVCHandler。
参见:https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html
wko9yo5t3#
我从FreeRTOS示例中收集的另一个解决方案是将以下内容添加到FreeRTOSConfig. h中。
字符串
原始文件来自FreeRTOS/Demo/CORTEX_M0_LPC1114_LPCXpresso/RTOSDemo/Source/FreeRTOSConfig.h,该文件还将CMSIS系统时钟集成到配置中。CMSIS/FreeRTOS项目的一个非常好的起点。
slhcrj9b4#
我很确定SVC处理程序只在FreeRTOS初始启动时使用,因此添加间接异常处理程序不会损害性能(但它很丑)。最好在FreeRTOS论坛上问这个问题,那里的React通常很好。
希望这对你有帮助,最好的问候,戴夫