gpt4 book ai didi

c - GCC 别名在翻译单元之外运行 -AKA- 这甚至是完成这项工作的正确工具吗?

转载 作者:太空狗 更新时间:2023-10-29 17:01:38 25 4
gpt4 key购买 nike

我在 STM32 (Cortex-M3) 上使用 FreeRTOS,并使用 ST 的 CMSIS 库来引导一切。

CMSIS 库在启动“.s”文件中定义了弱符号SVC_Handler。必须在某处覆盖它才能在中断 vector 表中获取您的 ISR。 FreeRTOS 定义了 vPortSVCHandler,这是我想要处理 SVC 中断的 ISR。

我想使用我的应用程序代码(即不修改 FreeRTOS 或 CMSIS 源代码)将两者“粘合”在一起。我认为别名是完成这项工作的正确工具,所以我尝试了这个(在单独的源文件 main.c 中):

void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));

这导致:错误:“SVC_Handler”别名为 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")));

这会产生相同的错误。有什么建议吗???

我真的很想避免修改这两个库中的任何一个。我知道我可以编写一个简单地调用 vPortSVCHandler 的函数 SVC_Handler,但这可能会给 ISR 增加不必要的开销(可能取决于优化设置)。注意:FreeRTOS 示例通过自定义启动文件完成此操作。我正在寻找一种从 C 我的链接器脚本执行此操作的方法。

  • 编译器版本:gcc 版本 4.5.2 (Sourcery G++ Lite 2011.03-42)
  • 目标:arm-none-eabi

最佳答案

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

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

关于c - GCC 别名在翻译单元之外运行 -AKA- 这甚至是完成这项工作的正确工具吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7649979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com