从0编写第一个Bootloader之散列文件

本来是应该继续写bootloader的内容的,但后面一些内容涉及到了APP的复制和散列文件,所以还是在这里介绍一下。

一.STM32散列文件

初学者在使用开发板下载程序时,可能并不会关心散列文件相关内容,其实当我们使用比较小巧的代码时,我们确实不必关注,我们直接让app在flash中就地执行即可。但如果为了追求执行效率或者flash资源紧张的话,将程序从flash复制到ram,然后在ram中执行还是很有必要的。

二.读懂散列文件

在keil中勾选此选项即可生成一个.sct文件,这就是散列文件。下面让我们看一下散列文件的内容:

上面的LR_IROM1为加载地址(可以简单理解为程序下载的地址),下面的ER_IROM1、RW_IRAM1为链接地址(理解为执行地址),此散列文件的意思是:将所有o文件中的RESET和First段、所有的RO段、所有的XO段放到ER_IROM1的位置(0x08000000),将所有的RW、ZI段放到RW_IRAM1(0x20000000),从上可以看从加载地址和一开始的链接地址是相同的,也就是说程序下载到FLASH中,并在FLASH中运行。

三.修改链接地址

如果我们想要将程序放到RAM中执行,我们可以修改链接地址:

这就表明程序放在flash上,运行时会到ram的地址(0x20000000)去执行。

好了,以为这样就成功了嘛?还没有,想一下开发板刚上电时跑到ram中去执行代码,但此时ram中有东西吗?显然没有,因此我们少了一步将代码从flash复制到ram中的操作,在M3/4权威指南中,给了我们办法:

在启动文件的Reset_handler中加入如上代码,这三段分别是将代码段、数据段复制到ram以及将zi段清零。

现在我们完成了程序的复制,以为万事大吉了吗?不,还是差最后一步:

我们需要修改开发板上电时PC寄存器的内容,让程序跳转到FLAH上的Reset_handler上,去执行我们将代码复制到ram的操作,不然一上来就跳到ram中,我们的一切又都白做了。这个地址可以通过反汇编文件去确定,如果有不懂反汇编文件的同学可以评论,我会考虑出一篇文章。

最后注意一下,跳转到main函数时要使用绝对跳转指令,不要使用相对跳转,不然还会出错。

四.小结

总结一下以上步骤:

1.修改散列文件的可执行域,让开发板可以跳到ram执行程序;

2.将flash中的程序复制到ram中;

3.修改启动文件最开始跳转的地址;

4.使用绝对地址跳转到main函数(ram中);

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值