MDK默认链接脚本导致的问题

本文探讨了在使用MDK进行Boot程序开发时遇到的问题,即链接脚本默认设置导致的一部分程序被错误地放置在预留的Flash区域,从而在擦除该区域时破坏了程序的完整性。文章分析了问题的原因,并提出了三种解决方案:修改链接脚本以精确控制程序布局、避免使用绝对定位指令,以及精细化擦除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MDK默认链接脚本导致的问题

问题背景

我要做一个boot,我想要将APP之前的一页flash的首半字作为判断APP是否完整的条件。于是在boot中用绝对定位指令(const uint32_t IAP_FLAG attribute((at(0x8004A38))) = 0xAAAA;)对该地址进行初始化,然后在我的boot更新完APP后擦掉这一页(太粗放,未经慎重思考)。我可以在APP中对这一页的首地址赋值0xAAAA以重新进入boot。然而代码并没有按我想象的方式工作,在我第一次更新完APP后,boot就再也不能正常工作了。

原因

经过查看boot的bin文件我发现在0x8004A38开是的那页flash跟我想象的不一样,开始的半字值为0xAAAA,但是在其后并不是全为0xFFFF。尽管在我不用绝对定位指令时该boot的大小不超过11K。也就是说在我擦除的这一页出现了程序。我擦除了一部分boot的程序,boot当然就运行不正常了。
MDK的链接程序并没有像我想象的那样把IAP_FLAG放在整个boot程序的末尾,在其后还放了其它程序。

解决方案

解决方案有三个
1.编写MDK链接脚本,也就是所谓的分散加载文件,人为地控制链接过程。
2.弃用绝对定位指令
3.不擦除一整页,该方案节约了近1K的flash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值