【连载-1】深入浅出话Bootloader

汽车电子嵌入式 2023-07-11 08:03

前言

本系列文章为于振南老师的深入浅出话Bootloader部分,本文内容为: 烧录方式的更新迭代、关于Bootloaer。

正文

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

1、烧录方式的更新迭代

1.1 古老的烧录方式

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

3.1 单片机烧录器

1.2 ISPICP烧录方式

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

图3.2 单片机的ISP烧录

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

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

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

1.3 更方便的ISP烧录方式

1.3.1 串口ISP

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

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

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

再后来,9针串口都很少见了,只有USB。这促使一个烧录和调试神器炙手可热--USB TTL串口。这下232转换芯片省掉了,直接通过USB进行烧录。这种方式造福了无数的单片机学习者和工程师。我本人虽然已经搞了近20年单片机和嵌入式,USB串口依然是不可或缺的调试工具。

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

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

1.3.2 各种USB ISP

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

1)AVR

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

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

2)C8051F

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

3)MSP430

图3.7 MSP430的USB ISP下载器

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

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

1、依赖于专门的上位机或下载器硬件,不能作到统型;

2、下载器价格仍然比较高,尤其是原厂的,这也是为什么有些单片机催生出很多

第三方的下载器,比如AVR;

3、下载的时候通常需要附加额外的操作,比如STC要重新上电、STM32需要设置

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

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

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

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

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

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

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

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

2、关于Bootloader

2.1 Bootloader的基本形态

直接看图3.8所示。

图3.8 Bootloader的基本形态

可以看到BL就是一段存储在ROM中的程序,它主要实现4个功能:

1、通过某种途径获取要烧录的固件数据;

2、将固件数据写入到ROM的APP区中;

3、跳转到APP区运行,将烧录进去的用户程序引导起来;

4、在此过程中,提供必要而友好的人机交互界面。

这么说可能不好理解,我们还是通过实例来进行讲解。

2.2 Bootloader的两个设计实例

下面的两个实例,用于说明BL的实际应用形态,不涉及具体的实现细节,旨在让大家了解BL实际是如何运行的。

2.2.1 带Shell命令行的串口BL

基本的操作逻辑如下:

1、通过超级终端、SecureCRT或Xshell之类的串口终端输入命令program;

2、BL接收到命令后,开始等待接收固件文件数据;

3、串口终端通过某种文件数据传输协议(大家可以参见本书相应章节对 X/Y/Zmodem协议的介绍)将固件数据传给BL;

4、BL将固件数据写入到ROM的APP区中;

5、BL将APP区中的程序引导运行起来。

更具体的示意如图3.9所示。

图3.9 带Shell命令行的串口BL逻辑示意

这里把操作逻辑说得很简单,实际实现起来却并不容易,我们放在后面去细究其具体实现。

2.2.2 插SD卡即烧录的BL

基本的操作逻辑如下:

1、将待烧录的固件拷贝到SD卡中;

2、将SD卡插入到卡槽中;

3、BL检测到SD卡插入,搜索卡中BIN文件;

4、将BIN文件数据读出写入到ROM的APP区中;

5、BL将APP区中的程序引导运行起来。

如图3.10所示。

图3.10 插SD卡即烧录的BL逻辑示意

通过这两个设计实例,大家应该已经了解BL是什么了吧。有没有感受到BL是比ISP烧录器更通用、更灵活、更友好、功能更强大的固件烧录和管理手段呢?

有人可能知道Linux下的Uboot,它就是一个强大的BL,它提供非常强大的刷机(烧录操作系统镜像)的功能以及完备而灵活的Shell界面,如图3.11所示。其实我们电脑的BIOS也是一种广义的BL。

图3.11 Uboot Shell界面

那如何实现一个BL呢?别急,要实现BL是需要满足一些基本要求的。

2.3 BL实现的要点

首先要说,并不是任何一个单片机都可以实现BL的,要满足几个要点。

2.3.1 芯片体系架构要支持

来看图3.12。

图3.12 BL的实现需要单片机支持中断向量表偏移(重定向)

我们知道单片机程序的最开头是中断向量表,包含了程序栈顶地址以及Reset程序入口,通过它才能把程序运行起来。很显然在从BL向APP跳转的时候,APP程序必须有自己的中断向量表。而且单片机体系架构上要允许中断向量表的重定向。

传统51单片机的中断向量表只允许放到ROM开头,而不能有偏移量,所以传统51单片机是不能支持BL的。有人要问“你这不是自相矛盾吗?你前面说STC的51单片机是支持串口ISP的,那它应该内置有ISP程序,我理解它应该和BL是一个道理。”没错,它内置的ISP程序就是一种BL。STC之所以可以实现BL功能,是因为宏晶半导体公司对它的硬件架构进行了改进,请看图3.13。

图3.12 STC对传统51单片机硬件架构上的改进

可以看到,STC51单片机多出了一块专门存放BL的ROM,称为BOOTROM。

网上有一位叫shaoziyang的网友为AVR单片机写了一个BL,还配套开发了一款叫AVRUBD的上位机,如图3.13 (AVRUBD是很有用的,本章后面会介绍,它可以让我们实现隔空烧录),实现了AVR单片机的串口烧录,让很多人摆脱了USBISP之类ISP下载器的依赖(虽然ISP下载器已经很方便了,但它毕竟还需要银子嘛)。

图3.13 shaoziyang的AVR BL配套上位机软件AVRUBD

AVR在硬件架构上与STC51是一个套路,如图3.14所示。

图3.14 AVR单片机硬件架构上对BL的支持

通过配置AVR的熔丝位可以控制复位入口地址以及BOOT区的大小和开始地址,如图3.15所示。

图3.15 AVR单片机硬件架构上对BL的支持

讲到这里,有人会说:“那有没有一种单片机,程序放在ROM的任何位置都可以运行起来,也就是中断向量表可以重定位?”当然有,这种单片机还很多,其中最典型的就是STM32。它的程序之所以可以放之各地皆可运行,是因为在它的NVIC控制器中提供了中断向量表偏移量的相关配置,这个后面我们再详细说。

2.3.2 ROM要支持IAP

这也是需要单片机硬件支持的。很好理解,在BL获取到固件数据之后,需要将它写入到ROM的APP区中,所以说单片机需要支持IAP操作,所谓IAP就是 In Application Programming,即在应用烧录。也就是在程序运行过程中,可以对自身ROM进行擦除和编程操作。

大家仔细想想是不是这样?似乎支持串口ISP的单片机都支持IAP功能。STC还把这一功能包装成了它的一大特色,可以用内部ROM来充当EEPROM的功能,可以在运行时记录一些掉电不丢失的参数信息。

STM32的ROM擦写在配套的固件库(标准库或HAL库)中已经有实现,大家可以参考或直接使用。

2.3.3 APP程序的配套修改

为了让BL可以顺利的将APP程序引导运行起来,APP程序在开发的时候需要配合BL作出相应的修改。最重要的就是APP程序的开始地址(即中断向量表的开始地址)以及对中断控制器的相应配置。

对于51、AVR这类单片机APP程序不用修改,具体原因大家应该明白。这里主要对STM32 APP程序如何修改进行详细讲解。

我们依然是结合实例,请看图3.16所示。

图3.16 STM32 ROM划分实例

假设我们所使用的STM32的ROM总大小为128KB,BL程序的体积是16K,APP程序紧邻BL,那么APP区的开始地址为0X08004000,也就是APP程序的中断向量表偏移地址为0X4000。

如果我们使用MDK作为开发环境的话,需要修改这里,如图3.17所示。

图3.17 MDK开发环境中对程序存储器开始地址与大小进行配置

而如果我们使用的是gcc的话,则需要对link.ld链接文件进行修改,如图3.18。

图3.18 gcc编译环境下对link.ld文件的修改

然后我们还需要对NVIC的中断向量表相关参数进行配置,主要是中断向量表的偏移量,如下代码。

#defineVECT_TAB_OFFSET  0x4000

OK,经过修改后的程序,我们把它放到ROM的0X08004000开始地址上,然后再让BL跳转到这个地址,我们的程序就能运行起来了。

有人又会问:“BL中的跳转代码怎么写?”别急,这是我们要讲的下一个要点。

2.3.4 BL中的跳转代码

跳转代码是BL要点中的关键,直接关系到APP程序能否正常运行,如图3.19。

图3.19 BL向APP的跳转示意

我直接给出STM32的jump_app函数代码。

typedef void (*iapfun)(void);iapfun jump2app;void MSR_MSP(u32 addr){  __ASM volatile("MSR MSP, r0");    //set Main Stack value  __ASM volatile("BX r14");}void load_app(u32 appxaddr){  if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)//检查栈顶地址合法  {  //用户代码区第二个字为程序开始地址(复位地址)     jump2app=(iapfun)*(vu32*)(appxaddr+4);   //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)     MSR_MSP(*(vu32*)appxaddr);       jump2app();   //跳转到APP.  }}

这段代码大家自行研究,如果展开讲就属于赘述了。

到这里BL相关的要点就介绍完了,大家应该有能力去完成一个简单的BL了。我基于STM32设计了一个小实验,大家有兴趣可以小试牛刀一下,如图3.20。

图3.20 BL功能验证实验

我们将BL程序用Jlink烧录到0X08000000位置,而把APP程序烧录到0X08002000开始位置,然后复位,如果串口打印了hello world或流水灯亮起来了,就说明我们的BL成功了。

「单片机和C语言其实不难,从某种意义上来说,它只不过是一个“熟练工种”,最重要的是“入门”。基础加上我们的聪明才智,每一个人都能成为高手!

扫描下图的二维码或者点击文章最后左下角的阅读原文可以获取更多信息

评论
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 102浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 163浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 122浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 141浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 58浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 55浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 36浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 82浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 113浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 74浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 98浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 57浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦