11

我在 STM32 (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")));

这导致: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

4 回答 4

9

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

--defsym有关 ld选项和链接描述文件中的分配的更多信息,请参阅 binutils 文档

于 2011-10-04T15:23:23.333 回答
3

我认为别名的问题在于,它需要一个声明和定义的函数,因为它只是一个别名。您想将其用作另一个函数的前向声明。我有类似的事情可以这样工作:

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

这将重命名 SVC_Handler 的入口点,如果您随后不定义它,它应该会找到 vPortSVCHandler。

见:https ://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

于 2016-02-18T10:39:49.270 回答
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 项目的一个非常好的起点。

于 2013-04-08T15:08:02.330 回答
0

我很确定 SVC 处理程序仅在 FreeRTOS 初始启动时使用,因此添加间接异常处理程序不会损害性能(但它很难看)。最好在 FreeRTOS 论坛上问这个问题,那里的反应通常很好。

希望这会有所帮助, 最好的问候, 戴夫

于 2011-10-04T15:10:57.713 回答