【问题标题】:GCC alias to function outside of translation unit -AKA- is this even the right tool for the job?GCC 别名在翻译单元之外起作用 -AKA- 这甚至是适合这项工作的工具吗?
【发布时间】:2011-11-30 18:55:01
【问题描述】:

我正在 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'

事实证明,根据此处 http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html 的 GCC 文档,为了使用 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

【问题讨论】:

    标签: c gcc cortex-m3 freertos codesourcery


    【解决方案1】:

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

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

    【讨论】:

    • 我应该补充一点,我还需要使用 SysTick 和 PendSV 处理程序来执行此操作。我也可能会在 FreeRTOS 论坛上提问,但这实际上更多是关于 GCC 工具链的问题,而不是关于 FreeRTOS 的问题。
    【解决方案2】:

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

    有关 ld --defsym 选项和 assignments in linker scripts 的更多信息,请参阅 binutils 文档

    【讨论】:

    • 只需将SVC_Handler = vPortSVCHandler; 添加到链接描述文件的顶部即可完成工作。看起来仍然很乱,但它确实有效。
    • 请注意,此解决方案似乎根本不适用于 LTO。似乎总是发出指向 0x0 的符号,导致生成的指令中的“CALL 0”。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        相关资源
        最近更新 更多