这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » MCU的Bootloader知多少

共1条 1/1 1 跳转至

MCU的Bootloader知多少

院士
2026-05-16 16:24:30     打赏

在嵌入式系统中,MCU做为核心控制器犹如设备的心脏,而开启这颗心脏跳动的关键便是Bootloader。

Bootloader定义

Bootloader,即引导加载程序,有的地方还简写为BL。其是MCU上电之初最先运行的一段程序,为后续应用程序的运行搭建起稳定可靠的平台。

本文所讲述的Bootloader为应用程序级别的引导程序,而非硬件级别,即此Bootloader为我们研发人员根据项目需要自行编写的,在正常应用程序之前运行的一段程序,有别于MCU厂商固化到芯片内部的程序。

Bootloader的位置

所有MCU都预设了固定的启动地址,我们以STM32为例,复位后默认读取0x0000_0000地址。这块地址其实也是我们平时烧录应用程序的起始地址,Keil项目的默认地址。这也证实了本文所述Bootloader其实就是应用程序,只是完成了Bootloader的功能任务而已。

Bootloader核心功能

一、应用程序引导功能

Bootloader能够从多种存储介质中读取固件,如Flash、SD卡、EEPROM、U盘、网络等。在读取过程中,它会对固件数据进行校验。对于一些对安全性要求较高的场景,还会采用数字签名的方式进行校验,只有验证通过的固件才能被加载运行,有效防止了恶意固件的植入和固件损坏带来的系统故障。此外,对于加密固件,Bootloader还具备解密功能;对于压缩固件,能够进行解压操作,确保固件能够正常加载到SRAM中。

二、底层硬件初始化

Bootloader由于是上电后最先运行的程序,所以对于一些时间紧迫的项目来说,必须将硬件初始化放在Bootloader阶段。对于Bootloader的实现,我个人在项目中倾向于基本的硬件初始化,软件初始化放在应用程序中处理,而简化Bootloader的程序内容与步骤。但在一些对实时性要求较高的应用中,如工业自动化控制、汽车电子等,则需要先完成时钟系统的精准初始化,这也将直接关系到系统的响应速度和控制精度。

三、固件升级(IAP/OTA)

Bootloader是实现MCU固件升级的核心,支持IAP(片内编程)和OTA(远程升级)两种方式。IAP是单片机专用的升级方式,无需烧录器,通过串口、USB等本地接口即可完成固件更新;OTA则适用于物联网设备,通过WiFi、4G等网络实现远程固件更新。为了保障升级的可靠性,Bootloader通常采用双分区设计(A/B分区),当升级失败时能够自动回滚到旧版本,避免设备“变砖”。同时,它还具备固件备份、版本校验、旧版本回滚等功能,进一步提升了固件升级的安全性和稳定性。例如,在智能家居领域,通过OTA功能,用户可以远程对家中的智能设备进行固件升级,无需亲自操作设备,极大地提升了用户体验和设备的可维护性。

四、安全启动与权限控制

在一些对安全性要求较高的应用场景中,如金融设备、汽车电子等,Bootloader具备安全启动功能,仅允许验证合法签名的固件运行,有效防止了恶意固件的攻击。同时,它还可以通过硬件锁等方式限制刷机、锁定硬件权限,保障设备的安全性和数据的保密性。

Bootloader的设计

一、内存布局与地址分配

Bootloader其实是整个应用程序的前面一小段,所以,其自身的容量与占用资源要限定在较小的范围。我们仍然以STM32为例,Bootloader的Flash占用

Flash空间大小为16KB,而RAM空间为4KB。其余的硬件资源要交给应用程序去使用。

二、通信协议

Bootloader通常需要通过串口、CAN、USB等接口与外部设备进行通信。为了提高通信效率,需要对通信协议进行优化。例如,增大接收缓冲区的大小,采用XON/XOFF流控机制,优化HEX文件解析算法等。在工业设备开发中,通过这些优化措施,将传输效率提升了30%,确保了固件升级的快速稳定进行。

三、外设deinit

Bootloader最后一步就是跳转到加载完成的应用程序,而在这一步之前需要将在Bootloader中使用的,初始化的外设尽量关闭与deinit。这样做的目的在于可以保证应用程序工程项目中的全部功能特性与Bootloader解耦,无关联。当然,依项目需要,必须承上启下的另算。我在项目中,Bootloader中使用了串口外设,我会等待其空闲之后,再将其deinit。这样,在应用程序中串口初始化就与有无Bootloader无关了。

四、中断少用,不用

也是原于Bootloader和应用程序是一个环境,所以中断功能也是继承。这时,有一个必须要考虑的问题,如果跳转的时候发生了中断,则中断函数是进入到Bootloader的,还是进入到应用程序的?这是一个不定因素,没有具体的标准答案。所以,我们要尽量避免这类事情的发生,所以,我们要Bootloader中能不使用中断就不使用中断,本身Bootloader的功能就单一,直接使用查询模式也无妨。

总结

在自已的项目中是否使用Bootloader来完成程序的加载,最主要的还是要看项目需求。只是,我更倾向于项目中要有Bootloader而已。

如果您有对Bootloader的感悟与经验分享,欢迎跟帖回复或发表新帖,版主定有积分奉上。





关键词: Bootloader    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]