您的位置 首页 > 雕刻工具

bootloader?小白的单片机之旅

大家好,如果您还对bootloader不太了解,没有关系,今天就由本站为大家分享bootloader的知识,包括小白的单片机之旅的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

1、我们的单片机中运行的“程序”是怎么跑的?这些程序是如何下载更新的?如果我们在一些场景下需要升级我们自己的程序,有什么方法?

2、在前文《小白的单片机之旅——单片机的启动》一文已经简单描述了基本的启动过程,我们知道这里的我们通常编译生成一个bin文件或者hex文件作为烧写文件,然后通过ISP或者JTAG等方式写入器件内,然后看起来我们的程序在上电复位之后即等到了执行。

3、我们到底把什么东西写到那里了呢?如下图所示,Icode就是指令总线,显然是我们的指令都是存储、并且直接执行在flash中的(norflash)。我们的编译生成的bin文件包含了指令和数据,所有上面的问题我们把纯粹的二进制bin文件,写到了flash的某一段位置,在系统上电、复位之后,我们写进去的bin文件即主导了所有的软硬件动作,从而看起来是,我们的程序得到了执行。

4、我们通常是在离线状态时进行程序的烧写(烧片、或者上面的固件更新接口),那么如何实现在线更新呢?一个方法就是实现一个bootloader。顾名思义,bootloader有两个基本意图,boot&loader。boot就不说了,不同的硬件场景下有不同的内涵,意图就是让我们的系统按照我们的意图由简单到复杂的启动起来,loader就是加载我们需要加载的对象,这个对象可能是某个app、OS、或者其他的可执行对象。

5、这里我们先系统实现一个简单bootloader,先来实现我们自定义的方法来启动我们的app(以《小白的单片机之旅——sd卡驱动并基于其移植FATFS》为例)。当有bootloader的时候我们的flash空间怎么分布?我们这里简单分配一下,如下图所示。分配给bootloader32KB空间(MCU的flash资源非常宝贵,bootloader一个显著的要求就是资源占用一定要少

6、我们的设计是:当设备上电复位之后默认执行bootloader,如果需要人机交互,则输入CTRL+A命令进入交互界面,否则在倒数计时3S之后,则检查APP区是否有合法的镜像,如果有则跳转到app区,由app接管;如果没有合法的镜像,则自动重启。

7、基于之前的软件框架,我们增加一个bootloader的开发app(bootloader本身也是一个app)。主要步骤参考下图,已经写的比较清楚了。

8、那么基于bootloader的app,需要做什么修改吗?和我们普通的app有什么区别呢?最重要的

9、区别是我们在使用汇编文件进行引导c环境的时候,需要设置中断向量表的起始位置,如上面图2所示,有bootloader的时候app的镜像文件在flash中的位置是不一样的,在前文《小白的单片机之旅——单片机的启动》中已经说明硬件在复位等所有的中断的跳转需要依赖中断向量表,中断向量表在bin文件的开头,这一点有无bootloader时是敏感到的。需要做相应的适配,我们可以直接修改如下。除此以外,我们需要修改对应的链接文件,在编译其他app的时候执行图2中描述的app的范围。

10、存在bootloader时,其他app的中断向量入口适配

11、存在bootloader时,其他app的链接文件适配

12、bootloader引导启动sd卡测试app启动日志

13、至此,一个简易的具有引导过程的bootloader就完成了。该bootloader中我们还预埋了一个基于串口的xmodem协议的实现,可以直接基于串口进行flash加载更新,当然了,如果放大一些bootloader的空间,我们可以实现更方便的方法,我们接口sd卡的功能,可以实现在bootloader阶段读取sd卡的内容,从而实现可以通过sd卡来更新升级app。

14、源码路径:https://gitee.com/fg20/priv_stm32_proj

关于bootloader,小白的单片机之旅的介绍到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023