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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/173857.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序实现语音识别功能

不废话&#xff0c;直接上代码 <template><view><u-popupround"16" :show"recordShow" :close-on-click-overlay"false":safe-area-inset-bottom"false"close"close"open"open"><view clas…

NI和EttusResearchUSRP设备之间的区别

NI和EttusResearchUSRP设备之间的区别 概述 USRP&#xff08;通用软件无线电外设&#xff09;设备是业界领先的商软件定义无线电&#xff08;SDR&#xff09;。全球数以千计的工程师使用USRPSDR来快速设计、原型设计和部署无线系统。它们以两个不同的品牌进行营销和销售&…

【机器学习】正则化到底是什么?

先说结论&#xff1a;机器学习中的正则化主要解决模型过拟合问题。 如果模型出现了过拟合&#xff0c;一般会从两个方面去改善&#xff0c;一方面是训练数据&#xff0c;比如说增加训练数据量&#xff0c;另一方面则是从模型角度入手&#xff0c;比如&#xff0c;降低模型复杂…

如何在Qemu上跑Milk-duo开发板

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;学习本文之前&#xff0c;要求先看一下Milk-V Duo快速上手的环境搭建部分&#xff0c;创建好镜像文件。 正文 编译milk-duo qemu &#xff08;1&#xff09;下面步…

LabVIEW中如何在网络上使用远程VI服务器

LabVIEW中如何在网络上使用远程VI服务器 如何在网络上使用远程VI服务器&#xff1f; 解答: 首先&#xff0c;需要在远程的计算机上打开一个在VI服务器上的LabVIEW应用程序的引用。这可以通过“Open ApplicationReference“函数实现。然后用“Open VI Reference”函数打开一个…

Postman for Mac(HTTP请求发送调试工具)v10.18.10官方版

Postman for mac是一个提供在MAC设备上功能强大的开发&#xff0c;监控和测试API的绝佳工具。非常适合开发人员去使用。此版本通过Interceptor添加了对请求捕获的支持&#xff0c;修正了使用上下文菜单操作未复制响应正文的问题和预请求脚本的垂直滚动条与自动完成下拉列表重叠…

11-13 spring整合web

spring注解 把properties文件中的key注入到属性当中去 xml配置文件拆分 -> import标签 注解开发中 import 实现 搞一个主配置类&#xff0c;其他配置类全部导入进来这个这个主配置类 而且其他配置类不需要 加上configuration注解 之前这个注解用于表示这是一个配置文件 …

一篇文章教会你什么是C++异常

一篇文章教会你什么是C异常 C语言传统的处理错误的方式断言检查返回值检查全局错误码设置全局错误处理函数 C异常概念基本概念注意事项 异常的使用异常的抛出和捕获异常的重新捕获异常安全异常规范 自定义异常体系C标准库的异常体系1. std::exception2. std::bad_alloc3. std::…

transformers安装避坑

1.4 下载rust编辑器 看到这里你肯定会疑惑了&#xff0c;我们不是要用python的吗&#xff1f; 这个我也不知道&#xff0c;你下了就对了&#xff0c;不然后面的transformers无法安装 因为是windows到官网选择推荐的下载方式https://www.rust-lang.org/tools/install。 执行文…

Java 设计模式——访问者模式

目录 1.概述2.结构3.案例实现3.1.抽象访问者类3.2.抽象元素类3.3.具体元素类3.4.具体访问者类3.5.对象结构类3.6.测试 4.优缺点5.使用场景6.扩展6.1.分派6.2.动态分配6.3.静态分配6.4.双分派 1.概述 访问者模式 (Visitor Pattern) 是一种行为型设计模式&#xff0c;它用于将数…

创新旗舰X100:手机周期大考下,vivo的“满分答案”

对于智能手机行业来说&#xff0c;今年是触底反弹&#xff0c;逆转上扬的一年。 利好在于&#xff0c;科技与经济双周期拐点已经到来。在当前消费结构升级的关键阶段&#xff0c;随着经济持续恢复向好&#xff0c;国内总的消费趋势正稳步向上。 一直以来&#xff0c;智能手机…

LeetCode(10)跳跃游戏 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 45. 跳跃游戏 II 1.题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nu…