振南技术干货集:深入浅出的Bootloader(5)

简介: 振南技术干货集:深入浅出的Bootloader(5)

注解目录

1、烧录方式的更新迭代

1.1 古老的烧录方式

(怀旧一下,单片机高压烧录器。)

1.2 ISP 与ICP 烧录方式

(还记得当年我们玩过的 AT89S51?)

1.3 更方便的 ISP 烧录方式

1.3.1串口 ISP

(是 STC 单片机成就了我们,还是我们成就了 STC?)

1.3.2 各种 USB ISP

1)AVR

2) C8051F

3) MSP430

(在当前 STM32 一统天下的时代,上面这些单片机你还在用吗? )

2、关于 Bootloader

2.1 Bootloader 的基本形态

(Bootloader 先行,APP 在后。)

2.2 Bootloader 的两个设计实例

1)带 Shell 命行的口 BL

2)插 SD 卡即烧录的 BL

(上面这两种 BL 在实际应用中最常见,还讲了一下 Linux 的 Uboot。)

2.3 BL实现的要点

3、花百出的 BL

3.1 BL(串口传输)的现与延伸

(告诉你一个秘密: STM32F103C8T6 的后64K ROM 也能用,不信你试。)

3.2 10 米之内隔空烧录的实现

(一部安卓手机在手,空中升级调试全有。)

3.3 BL的分散烧录

(你以为 BL 只能给自己烧序? )

4、不走寻常路的BL

4.1 Bootpatcher

(反其道而行之,APP 先行,BL 在后。)

4.2 APP 反烧 BL

(你以为只能 BL 烧录 APP? )

花百出的 BL

3.3 BL的分散烧录

我们知道 BL 的核心功能其实就是程序烧录。那你有没有遇到过比较复杂的情况,如图 7.31 所示。

这种情况是有可能遇到的。主 MCU+CPLD+通信协处理器+采集协处理器就是典型的复杂系统架构。这种产品在批量生产阶段,烧录程序是非常烦琐的。首先需要维护多个固件,再就是需要一个个给每一个部件进行烧写,烧写方式可能还不尽相同。所以我引人了一个机制,叫“BL的分散烧录”

首先我们将所有的固件拼装成一个大固件(依次数据拼接),并将这个大固件预先批量烧

图 7.31 一个系统(产品)中有多个部件需要烧录固件

录到外扩 ROM 中,比如 spiFlash;再将主 MCU 预先烧录好 BL;然后进行 SMT 焊接。PCBA生产出来之后,只要一上测试工装(首次上电),BL 会去外扩 ROM 中读取大固件,并从中分离出各个小固件,分别以相应的接口烧录到各个部件中去。配合工装的测试命令,直接进行自检。这样做,批量化生产是非常高效的。当然,这个 BL 开发起来也会有一定难度,最大问题可能还是各个部件烧录接口的实现(有些部件的烧录协议是比较复杂的,比如 STM32 的SWD 或者 ESP8266 的 SLIP)。

OK,上面振南就对一些 BL实例的实现和应用场景进为了介绍。还有一些实例没有介绍,比如通过 CAN 总线或 SPI进行文件传输,这个我们还是放到专门的章节去详细讲解。当然,各位读者可以在此基础上衍生出更多有特色而又实用的 BL 来。

BL 没有最好的,只有最适合自己的。通常来说,我们并不会把 BL 设计得非常复杂,原则上它应该尽量短小精炼,以便为 APP 区节省出更多的 ROM空间。毕竟不能喧宾夺主,APP才是产品的主角。

4

不走寻常路的BL

4.1 Bootpatcher

我来问大家一个问题:“Bootloader 在 ROM 中的位置一定是在 APP 区前面吗?很显然不是,AVR 就是最好的例子。那如果我们限定是 STM32 呢? 似乎是的。上电复位一定是从0X08000000 位置开始运行的,而且 BL一定是先于 APP 运行的。

在某些特殊的情况下,如果 APP 必须要放在 0X8000000 位置上的话,请问还有办法实现 BL 串口烧录吗? 要知道 APP 在运行的时候,是不能 IAP 自己的程序存储器的(就是自己不能擦除自己来烧录新固件),如图 7.32 所示。

APP 运行时,想要重新烧录自身,它可以直接跳转到后面的 BL 上,BL 运行起来之后开始接收固件文件,暂存校验 OK 之后,将固件写人到前面的 APP 区。然后跳转到 0X08000000。

图 7.32 BL位于 APP 之后称之为 Bootpatcher

或者直接重启。这样新的 APP 就运行起来了。这个位于 APP 后面的 BL,我们称之为 Boot-patcher(意为启动补丁)。但是这种做法是有风险的,一旦 APP 区烧录失败,那产品就变砖了。所以这种方法一般不用。

4.2 APP 反烧 BL

前面我们都是在讲 BL 烧录 APP,那如果 B 需要升级怎么办呢?用JLINK。不错,不过有更直接的方法,如图 7.33 所示。

图 7.33APP 烧录 BL区

这是一种逆向思维,我们在 APP 程序中也实现接收固件文件,暂存校验,然后将其烧录到BL 区。这种做法与 Bootpatcher 同理,也是有一定风险的,但一般都没有问题。

本章对 BL 进行了详尽的剖析讲解,应该做到了深入浅出,包含基本的原理,以及实例的实现,还有一些知识的扩展。这其中不乏振南的一些创新思想,希望能够对大家产生启发,在实际的工作中将这些知识付诸实践。

相关文章
|
存储 Shell Linux
振南技术干货集:深入浅出的Bootloader(1)
振南技术干货集:深入浅出的Bootloader(1)
|
域名解析 Linux Docker
CentOS8 安装 Docker
本文主要为大家讲解在CentOS8 上安装 Docker的过程,以及安装中的常见问题解决。
24173 2
CentOS8 安装 Docker
|
移动开发 安全 JavaScript
uniapp打包成H5部署到服务器教程
uniapp打包成H5部署到服务器教程
2620 0
|
人工智能 自然语言处理 运维
钉钉MCP能力上新:AI如何提效你的工作流程
钉钉通讯录 & 部门管理、日程管理、待办任务、机器人&通知等高频场景API提供MCP服务
钉钉MCP能力上新:AI如何提效你的工作流程
|
5月前
|
canal 数据可视化 关系型数据库
2025年5大国产ETL工具横向评测
在企业数据管理中,ETL工具成为整合分散数据的关键。本文介绍了五款主流国产ETL工具:FineDataLink(低代码、功能全面)、Kettle(开源易用)、DataX(高速同步)、Canal(MySQL实时增量处理)和StreamSets(可视化强),帮助用户根据需求选择最合适的工具,提升数据效率与业务价值。
1105 56
|
11月前
|
JSON 前端开发 安全
【潜意识java】前后端跨域问题及解决方案
本文深入探讨了跨域问题及其解决方案。跨域是指浏览器出于安全考虑,限制从一个域加载的网页请求另一个域的资源。
2278 0
|
安全 算法 网络安全
|
安全 前端开发 JavaScript
利用HTTP协议进行文件上传和下载的常见方法
【10月更文挑战第25天】可以利用HTTP协议方便地实现文件的上传和下载功能,满足不同应用场景下的需求。在实际应用中,还可以根据具体的业务需求和安全要求,对文件上传和下载的过程进行进一步的优化和安全处理。
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
1179 0