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

注解目录

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。)

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? )

当我面对一个有一定规模、稍显复杂的嵌入式项目时,我通常并不会直接专注于主要功能的实现,而是会做一些磨刀不误砍柴工的工作一一设计一个 Bootloader(以下简称 BL)以及构建一个 Shell框架。可能有人会觉得它们很高深,实则不难,正所谓“会者不难,难者不会”本章就针对 BL 进行详细的讲解,希望让大家可以体会到它的重要性。

1

烧录方式的更新迭代

1.1 古老的烧录方式


单片机诞生于20 世纪 80 年代,以 51 为代表开始广泛应用于工业控制、家电等很多行业中。起初对于单片机的烧录,也就是将可执行的程序写人到其内部的 ROM 中,这不是一件容易的事情,而且成本不低,因为需要依赖于专门的烧录设备。而且受到半导体技术与工艺的限制,对于 ROM 的烧写大多需要高压。这种境况一直持续到 2000 年左右(我上大学的时候还曾用过这种专门的烧录器),如图 7.1 所示。


图7.1 单片机烧录器

1.2 ISP与ICP烧录方式


随着低压电可擦写 ROM 的成熟,单片机开始集成可通过数字电平直接读写的存储介质。其最大的优势在于可实现在系统或在电路直接烧录程序,而无须像以前一样把单片机芯片从电路中拿出来,放到编程器上,这种烧录方式就是 ISP(In System Programming)或 ICP(InCircuit Programming),如图 7.2 所示。

有人问过这样一个问题:“ISP 和ICP 我都听说过,都说是可以在电路板上直接烧录程序而无须拿下芯片,那 ISP 和ICP 有什么区别?”从广义上来说,两者没有区别,平时我们把其意义混淆也毫无问题。非要创根问底的话,那可以这样来理解:ISP 要求单片机中驻留有专门的程序,用以与上位机进行通信,接收固件数据并烧录到自身的 ROM 中,很显然 ISP 的单片机是需要可运行的,即要具备基本的最小系统电路(时钟和复位);而ICP 可以理解为 MCU 就是一块可供外部读写的存储电路.它不需要预置任何程序,也不需要单片机芯片处于可运行的状态。

支持ISP或ICP 的芯片,以 AT89S51 最为经典,当时从 AT89C51 换成 S51,多少人曾因此不再依赖烧录器而大呼爽哉。这种并口下载线非常流行,如图 7.3 所示,网上还有各种 ISF小软件,可以说它降低了很多人人门单片机的门槛,让单片机变得喜闻乐见。一台电脑、一个S51 最小系统板、一条并口 ISP 下载线,齐了!


图7.2 单片机的ISP烧录


图7.3 用于 AT89S51的并口ISP下载线

1.3 更方便的ISP烧录方式


1.串口ISP

但是后来我们发现带有并口的电脑越来越少。那是在 2005 年前后,STC 单片机开始大量出现,在功能上其实与 S51 相差无几,甚至比同期的一些高端 51 单片机还要逊色。但是它凭借一个优势让人们对它爱不释手,进一步降低了单片机的学习门槛。这个优势就是一一串口 ISP,这是真正意义上的 ISP,如图 7.4 和图 7.5 所示。

再后来,9 针串口都很少见了,只有 USB。这促使一个烧录和调试神器炙手可热--USB


图7.4 STC单片机的串口ISP线路示意


图7.5 STC单片机的串口ISP原理示意

TTL 串口。这下 232 转换芯片省掉了,直接通过 USB 进行烧录。这种方式造福了无数的单片机学习者和工程师。我本人虽然已经搞了近 20 年单片机和嵌入式,USB 串口依然是不可或缺的调试工具。

多年来,在串口与单片机的交互上,我动了很多脑筋,这也是我乐于开发 Bootloader 的一个原因。我希望“USB 串口在手,一切全有!”

STC 并不是第一个使用串口 ISP 烧录程序的,但它是最成功和最深入人心的。与之同期的很多单片机,包括时至今日仍然应用最广泛的 STM32 全系列也都支持了串口 ISP,它成了种标配的、非常普遍的程序烧录手段。

2,各种 USB ISP

串口 ISP 固然方便,但是下载速度是它的硬伤,当固件体积比较大的时候,比如一些大型嵌入式项目的固件动辄几百 KB,甚至几 MB,再用串口 ISP 就未免太慢了。所以一些单片机配有专门的 USB ISP 下载器。以下列举几种比较主流的单片机及其 USB ISP 下载器

(1) AVR

AVR单片机曾经盛极一时,但经历了 2016 年的缺芯风波之后,加之 STM32 的冲击,开始变得一蹶不振,鲜有人用了。与之配套的 USB ISP 下载器非常多样,有些是官方发布的,更多的是爱好者开源项目的成果,如图 7.6 所示。


图7.6 AVR多样的 USB ISP下载工具(AVRISP MKII与 USBASP)

(2)C8051F(见图7.7)


图7.7 C8051F的 USB ISP下载器(EC6)

(3)MSP430(见图7.8)


图7.8 MSP430的 USB ISP下载器

我们会发现,一个具有良好生态的主流单片机,一定有配套的高效便捷的烧录下载工具。可见一种好的烧录方式,对单片机开发是多么重要。

不论是串口 ISP 还是各种专用的 ISP 下载器,都有一些共同的弊端。

(1) 依赖于专门的上位机或不载器硬件,不能做到统型;

(2)下载器价格仍然比较高,尤其是原厂的,这也是为什么有些单片机催生出很多第三方的下载器,比如 AVR;

(3) 下载的时候通常需要附加额外的操作,比如 STC 要重新上电、STM32 需要设置BOOT引脚电平等。

这些额外的操作都增加了烧录的复杂性。尤其是在产品形态下要去重新烧录程序,比如嵌人式升级,就要打开外壳,或将附加信号引出到壳外。这都是非常不高效,不友好的做法。

如果有一种烧录方法,对于任何一种单片机:

(1) 通信方式统一(比如一律都用串口):

(2) 提供一个友好的操作界面(比如命令行方式):

(3) 高效快速,没有附加操作,最好一键自动化烧录;

(4) 另外再增加一些嵌人式固件管理的功能(比如固件版本管理).

这一定会让我们事半功倍。

Bootloader 就能实现上述的这一切!

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

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

相关文章

[当人工智能遇上安全] 10.威胁情报实体识别 (1)基于BiLSTM-CRF的实体识别万字详解

您或许知道,作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个《当人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文、实践,并分享各种案…

详解[ZJCTF 2019]NiZhuanSiWei 1(PHP两种伪协议、PHP反序列化漏洞、PHP强比较)还有那道题有这么经典?

题目环境&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){echo "<br><h1>&…

【C++】类和对象(2)--构造函数

目录 一 概念 二 构造函数特性 三 默认构造函数 一 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month <…

【Mysql】MySQL基于成本的优化

什么是成本 我们之前说 过MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。那么成本是怎么计算的呢&#xff0c;其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组成的: I/O 成本 …

【汇编】内存的读写与地址空间、寄存器及数据存储

文章目录 前言一、CPU对存储器的读写1.1 cpu对存储器的读写如何进行&#xff1f;1.2 演示 二、内存地址空间三、将各类存储器看作一个逻辑存储器——统一编址内存地址空间的分配方案 三、CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--AX为例“横看成岭侧成峰“ 四、“字…

C#,数值计算——函数计算,Ratfn的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Ratfn { private double[] cofs { get; set; } private int nn { get; set; } private int dd { get; set; } public Ratfn(double[] num, double[] den) { …

c++之xml的创建,增删改查

c之xml的创建&#xff0c;增删改查 1.创建写入2.添加3.删除4.修改&#xff1a; 1.创建写入 #include <stdio.h> #include <typeinfo> #include "F:/EDGE/tinyxml/tinyxml.h" #include <iostream> #include <string> #include <Winsock2.…

HarmonyOS分布式文件系统开发指导

分布式文件系统概述 分布式文件系统&#xff08;hmdfs&#xff0c;HarmonyOS Distributed File System&#xff09;提供跨设备的文件访问能力&#xff0c;适用于如下场景&#xff1a; 两台设备组网&#xff0c;用户可以利用一台设备上的编辑软件编辑另外一台设备上的文档。平板…

实现Vue3 readonly,教你如何一步步重构

本文通过实现readonly方法&#xff0c;一步步展示重构的流程。 前言 readonly接受一个对象&#xff0c;返回一个原值的只读代理。 实现 Vue3 中readonly方法&#xff0c;先来看一下它的使用。 <script setup> import { readonly } from "vue";let user {n…

无人机航迹规划MATLAB:七种优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

php 插入排序算法实现

插入排序是一种简单直观的排序算法&#xff0c;它的基本思想是将一个数据序列分为有序区和无序区&#xff0c;每次从无序区选择一个元素插入到有序区的合适位置&#xff0c;直到整个序列有序为止 5, 3, 8, 2, 0, 1 HP中可以使用以下代码实现插入排序算法&#xff1a; functi…

Scala---方法与函数

一、Scala方法的定义 有参方法&无参方法 def fun (a: Int , b: Int) : Unit {println(ab) } fun(1,1)def fun1 (a: Int , b: Int) ab println(fun1(1,2)) 注意点&#xff1a; 方法定义语法 用def来定义可以定义传入的参数&#xff0c;要指定传入参数的类型方法可以写返…