振南技术干货集:深入浅出的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)
|
4月前
|
弹性计算 人工智能 数据库
阿里云服务器活动参考:云服务器抢购、超值优选、优惠券都有,活动详情解析
阿里云目前有哪些云服务器活动?阿里云针对个人、学生和企业用户均推出了相关活动,活动既有云服务器抢购,也有超值优选,云服务器爆款直降和云工开物等,也有老友专属福利券包、学生无门槛券、通义万相优惠券等优惠券活动,每个活动的内容并不是完全一样的。本文就为大家整理汇总了目前比较热门的一些云服务器相关活动,以供大家了解最新的优惠相关政策。
图表
4.5 图表 4.5.1 图表简介 1、图表 图表就是工作表单元格中数据的图形化表示,以直观形象的形式显示数据及数据之间的关系。 图表是基于工作表中的数据建立的,为工作表中的数据建立了图表后,图表和建立图表的数据就建立了一种动态链接关系: 1删除数据清单中的源数据时,图表中相应数据系列会自动删除。 2但删除图表中数据系列时,数据清单中源数据不变 2、图表的分类 按照图表的存放位置分为以下两种类型: 1嵌入式图表 (Alt+F1,默认),它和创建图表的数据源放置在同一张工作表中,打印时同时打印; 2独立图表 (F11),它是一个独立的图表工作表,打印时也将与数据表分开打印。 注意
|
11月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
277 3
|
传感器 人工智能 数据可视化
数智入海,GIS赋能智慧海洋
随着科技发展,各国积极推进海洋数字化建设,建立全球海洋观测网络,获取实时数据并挖掘价值。我国从“十四五”规划到二十大报告强调海洋强国战略,利用地理空间信息技术和物联网整合监测数据,提供智能管理与决策支持,实现海洋环境的可视化三维场景、实时监测、环境保护、灾害预警及专题图件服务,推动海洋经济高质量发展。
|
存储 缓存 算法
优化Java后台性能的五大最佳实践
在高并发环境中,Java后台系统的性能至关重要。本文探讨了五种有效的优化方法,包括JVM调优、数据库连接池配置、代码优化技巧、异步处理的使用以及缓存机制的实现。通过这些实践,开发人员可以显著提升系统的响应速度和稳定性。
|
安全 搜索推荐 网络协议
互联网流量编排方案
【2月更文挑战第23天】
|
Java 开发工具
2023全网最详细的银河麒麟操作系统,Java运行环境【jdk】安装
2023全网最详细的银河麒麟操作系统,Java运行环境【jdk】安装
5377 0
|
JavaScript
Ant Design vue 表格内换行
Ant Design vue 表格内换行
670 1