打印
[STM32F1]

链接器生成了veneers过程,导致程序进入HardFault。

[复制链接]
265|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梧桐uuu|  楼主 | 2025-7-25 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F103上运行RAM中的程序时,链接器生成的veneers过程出现错误代码。STM32F103只有Thumb模式,但链接器生成了ARM模式的veneers过程,导致程序进入HardFault。
如何解决这个问题?

20004420 <__display_screen_set_display_function__veneer>:
20004420:   e51ff004   ldr   pc, [pc, #-4]   ; 20004424 <__display_data_get_temp_veneer>
20004424:   080002f8   .word   0x080002f8
调试时显示如下
20004420: 0x04f01fe5          ; <UNDEFINED> instruction: 0xf004e51f
20004424: 0x0000f802  lsls   r0, r7, #11
20004426: 0x00000008  lsrs   r0, r0, #32 => jmp 0x080002F8

使用特权

评论回复
沙发
捉虫天师| | 2025-7-25 11:51 | 只看该作者
STM32F103只支持Thumb模式(Thumb-2指令集)

但链接器生成了ARM模式的veneers(如示例中的e51ff004是ARM指令)

这导致处理器尝试执行ARM指令时进入HardFault

使用特权

评论回复
板凳
捉虫天师| | 2025-7-25 11:52 | 只看该作者
1. 确保编译器/链接器使用Thumb模式
在编译和链接选项中强制使用Thumb模式:
CFLAGS += -mthumb
LDFLAGS += -mthumb

使用特权

评论回复
地板
捉虫天师| | 2025-7-25 11:52 | 只看该作者
修改链接器脚本
在链接器脚本中明确指定Thumb模式:
/* 确保所有代码都是Thumb模式 */
.thumb :
{
    *(.text)
} >RAM

使用特权

评论回复
5
捉虫天师| | 2025-7-25 11:52 | 只看该作者
检查交叉调用veneers
对于从RAM到Flash的调用,确保veneers是Thumb模式。可以尝试:

方法A:使用特定选项
LDFLAGS += --thumb-entry=your_entry_point

方法B:手动指定veneers类型
在某些工具链中,可以指定veneers类型:
LDFLAGS += --veneers=thumb

检查工具链版本
确保你使用的工具链(如GCC ARM Embedded)版本支持STM32F103的正确veneers生成。

使用特权

评论回复
6
捉虫天师| | 2025-7-25 11:53 | 只看该作者
替代方案:手动实现veneers
如果自动生成仍有问题,可以手动实现Thumb模式的veneers:
    .thumb
    .section .ram_veneers
    .align 2
    .global __display_screen_set_display_function__veneer
__display_screen_set_display_function__veneer:
    ldr r12, =0x080002F8
    bx r12

然后在链接器脚本中正确放置这个section。

使用特权

评论回复
7
捉虫天师| | 2025-7-25 11:53 | 只看该作者
反编译生成的二进制,确认veneers指令是Thumb指令(如bx或ldr pc)

检查指令地址是否对齐到2字节边界(Thumb要求)

确保所有跳转都使用Thumb模式的BX或BLX指令

通过以上方法,你应该能够解决因错误类型veneers导致的HardFault问题。

使用特权

评论回复
8
wang6623| | 2025-7-28 12:56 | 只看该作者
链接器配置不当或编译选项错误导致的。

使用特权

评论回复
9
probedog| | 2025-7-28 15:04 | 只看该作者
链接器配置问题,链接器默认生成 ARM 模式的 veneers,但 STM32F103 需要 Thumb 模式。可能是链接脚本或编译器选项未正确指定 Thumb 模式。

使用特权

评论回复
10
classroom| | 2025-7-28 16:05 | 只看该作者
函数指针或跳转表问题?

使用特权

评论回复
11
flycamelaaa| | 2025-7-28 19:05 | 只看该作者
强制链接器生成 Thumb 模式的 veneers。

使用特权

评论回复
12
powerantone| | 2025-7-28 22:06 | 只看该作者
手动处理跨存储区域调用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

37

帖子

0

粉丝