硬汉嵌入式论坛

 找回密码
 立即注册
查看: 163|回复: 2
收起左侧

[技术讨论] 求助:芯片复位后scatterload的过程中,从flash读取了一个错误的地址并尝试跳转,导致hardfault

[复制链接]

3

主题

11

回帖

20

积分

新手上路

积分
20
发表于 2024-5-19 23:32:03 | 显示全部楼层 |阅读模式
使用STM32CubeMX默认配置创建的工程,裸机,Keil环境,使用AC6编译器,没修改过启动文件和链接脚本
芯片复位后在进入main函数前会运行scatterload加载内存环境

Snipaste_2024-05-19_23-22-15.png
第一条LDM语句会从flash中读取内容到寄存器R0-R3,然后一些操作后 跳转到R3继续执行
r4的值等于0x08003BA0,因此读到的R3就是flash位置0x08003BAC的值
Snipaste_2024-05-19_23-28-15.png
因此R3就是0x007A1200,后面bx r3就直接报错了,进入hardfault
map文件中,0x08003BAC对应的是
    Exec Addr       Load Addr          Size         Type   Attr           Idx    E Section Name        Object

    0x08003ba0   0x08003b9c   0x00000000   Data   RO          529    .init_array         c_p.l(init_aeabi.o)


此时就完全没有头绪了,对分散加载也不熟悉,完全不理解为什么会读到不应该是地址的地址去跳转
求大神相助


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2024-5-20 08:56:46 | 显示全部楼层
这个文件对此过程有详细说明

MDK的C库启动过程和初始化,即__main函数的执行全过程
https://www.armbbs.cn/forum.php? ... 1658&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2024-5-20 10:40:33 | 显示全部楼层
eric2013 发表于 2024-5-20 08:56
这个文件对此过程有详细说明

MDK的C库启动过程和初始化,即__main函数的执行全过程

感谢硬汉哥,我去好好学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-16 20:21 , Processed in 0.281805 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表