gpt4 book ai didi

c++ - arm-none-eabi-g++ 无法使用 -flto 正确处理弱别名

转载 作者:行者123 更新时间:2023-12-01 14:23:33 36 4
gpt4 key购买 nike

我正在使用 SystemWorkbench 4 stm32 对 STM32F413 微 Controller 进行编程。中断 vector 在程序集启动文件中定义为弱别名,如下所示:

.weak   TIM1_UP_TIM10_IRQHandler
.thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler

并在对象中引用如下:

g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.....
.word TIM1_UP_TIM10_IRQHandler
.....

因此 g_pfnVectors 是 IRQ 处理程序函数的地址列表。它们被声明为弱别名,因此如果用户未定义它们,则使用默认处理程序。

我这样定义处理程序:

extern "C" {
void TIM1_UP_TIM10_IRQHandler() {
if (SU_TIM->SR & TIM_SR_UIF) {
SU_TIM->SR &= ~TIM_SR_UIF;
...
}
}
}

这与普通的编译器优化标志一起工作正常,但是我想尝试使用 -flto 获得更小且可能更快的代码(主要是为了尝试它,并不是真的需要它)。但是当使用 -flto 编译时,g++ 忽略了我对处理程序的实现而只使用默认处理程序,我的处理程序根本不在代码中。

所以我试图通过在函数定义中添加 __attribute__((used)) 来强制 g++ 包含该函数,但它仍然没有被编译。但是,如果我给它另一个名字,它就会包含在二进制文件中。此外,如果我删除弱别名并仅引用启动文件中的处理程序,它也可以工作。

所以不知何故,弱别名不适用于 g++ 链接时间优化。也许有人可以告诉我错误是什么以及我在这里做错了什么。

编辑:

我查看了在生成的 .elf 文件中使用 nm 创建了哪些符号,TIM1_UP_TIM10_IRQHandler 导出为具有 DefaultHandler 地址的弱符号。但是,当仅查看来自包含 TIM1_UP_TIM10_IRQHandler 函数的编译单元的 .o 文件时,它作为文本部分 (T) 中的符号导出。因此,出于某种原因,链接器选择保留弱符号,即使存在同名的强符号也是如此。

最佳答案

我认为您应该通知编译器它是中断 __attribute__ ((interrupt ("IRQ"))),通常不需要它,因为 F4 默认情况下堆栈与 8 对齐硬件。

如果它没有帮助,解决方法是为处理程序分配一个函数指针,这将防止它被丢弃(如果指针本身不会被丢弃 - 请检查您的调试器)。

最后的手段——用 vector 表定义更改 .s 文件

关于c++ - arm-none-eabi-g++ 无法使用 -flto 正确处理弱别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946333/

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