OpenBLT和Bootloader 分析

关键词 Bootloader 单片机 OpenBLT

  1. 适用范围
    适用于对单片机Bootloader原理不了解的工程师,本文有一定的启发意义。
  2. 原理概述
    单片机通常烧录有三种:
  • ISP(In-System Programming)
    在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。
  • ICP (In-circuit programmer)
    在电路编程,使用SWD/JTAG接口。
  • IAP(In-Application Programming)
    指MCU可以在系统中获取新代码并对自己重新编程,即用程序来改变程序。
    本次主要针对IAP进行分析。
    单片机正常时运行上电/复位,第一条指令是固定的,程序正常顺序运行到Bootloader,由Bootloader跳转到APP程序运行。Openblt做的包括这些部分,这期间有很多事情要做,以下章节具体分析。
    图1-1 Bootloader简易流程
    图1-1 Bootloader简易流程

3. 准备工作

3.1 环境准备

  • 代码编辑器

3.2 资源准备

  • OpenBLT软件包

4. 技术分析

4.1 什么是Bootloader

单片机正常运行时总是从固定地方取指令,顺序运行,这将对编写程序的人产生巨大的挑战,程序更新时需要使用烧录器等工具烧录,于是有人将程序设计成,由一个程序跳转到另一个程序,这个程序通常称作Bootloader,另一个叫做APP。
Bootloader程序常常具有通信接口和擦写内部存储空间的功能,可将需要更新的APP擦除,写入新的APP。有时会设计成相互跳转,技术也是可以实现的。有些为了保证程序不丢失,单独预留出备份区和出厂版本,出现某些错误时可以恢复到出厂版本或使用其他APP均可。
在这里插入图片描述
图1-2 Bootloader扩展流程

4.1 跳转时发生了什么

在这里插入图片描述
图1-3 Bootloader跳转与中断向量表
上文提及的三种启动方式,从系统存储器启动项,里面固化厂家出厂的代码,不可重写。
  代码区始终从地址0x0000 0000开始,那么设置成Flash启动之后,Flash的起始地址0x0800 0000就映射到了0x0000 0000,那么原本保存在0x0000 0000处的“中断向量表”也相应可以通过0x0800 0000访问(中断向量表是在芯片的启动文件中,随着IDE的编译,将中断向量表放在执行文件的开始(可查看.hex与.bin),又因为代码执行的开始地址与Flash的起始地址形成了映射,所以才能在代码执行的开始直接进入中断向量表)。基于该原理,其它地址启动的app程序首先要做的就是在程序的开始进行向量表的映射。
  “中断向量表”的功能主要是用来存储相应中断服务程序入口地址,当中断来临时,PC指针会从该表中寻找对应中断服务程序入口地址。
  向量表的第一个4字节保存的是用户程序堆栈空间的栈顶地址。程序启动时,先从0x0800 0004地址处去取复位中断向量的地址,并跳转到复位中断服务程序,执行完之后跳转到IAP的main函数,图1-3 ①所示。如果在IAP过程接收到中断请求,则PC指针强制指向中断向量表处,根据中断源进入相应的中断服务程序。执行完之后,再次返回到main函数。
  在执行完IAP后,跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,图1-3标号②和③所示。
  在APP的main函数运行过程中,如果接收到中断请求,PC指针仍强制跳转到0x0800 0004(第一个中断向量表),图1-3标号④所示;程序再根据设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,图1-3标号⑤所示;执行完之后,返回main函数继续运行,图1-3标号⑥所示。
相应的其它启动配置,例如内置SRAM启动,确保映射了向量表,其余流程与之相同

4.2 Bootloader编写步骤

Bootloader主要是为了更新APP而存在的,内部逻辑大同小异。Bootloader一般只在启动时占用很短时间,超时后自动跳转运行APP。

  • 读取新版程序(可以从串口、SPI和CAN等获取)
  • 擦除旧版
  • 写入新版
  • 确认无误,跳转
    新版本APP在传输和缓存时,有部分需求希望压缩大小,因此,可以压缩后传输,传入到设备中再解压缩,另一种是,备份的版本压缩后存入存储设备,在需要时候解压复制到指定位置。

4.3 APP编写步骤

APP为正常的应用程序,是产品的实现功能程序:

  • 设置中断向量表偏移量
  • 编写需求功能以及逻辑
  • 设计存储新版软件功能(可以选择由Bootloader实现,这里重启即可)

5. OpenBLT

OpenBLT是一种开源引导加载程序(Bootloader),可以在任何微控制器上运行并使用任何类型的通信接口来执行软件更新,而无需专用的调试器硬件。使用场景:

  • 现场更新程序。客户开始使用基于微控制器的产品后,总是有可能需要进行软件更新。例如,启用新功能或解决现有问题。使用OpenBLT,即使在客户所在地,也可以轻松地对软件程序进行更新程序。
  • 流水线集中烧录。使用OpenBLT,可以在组装线的末尾烧录产品的软件程序,从而可以将最新版本随产品一起提供。
  • 开发阶段。在软件程序的开发阶段,经常对软件程序进行重新编程。 OpenBLT可使无需特殊的调试器硬件即可执行此操作。
  • 校准阶段。在微调软件程序时,可以优化软件程序的参数。 OpenBTL可用于快速对优化的校准参数进行重新编程。
  • 基础套件。通过将引导加载程序(Bootloader)预加载到微控制器基础工具包上,最终用户无需购买昂贵的调试器接口。基础套件板上也不必包括片上调试器。这降低了基础工具包的成本价格,对最终用户更具吸引力。
    OpenBLT是开源的,使用GNU GPL version 3开源协议。

5.1 架构

在这里插入图片描述
图1-4 架构
Bootloader的功能和代码分为四个部分:

  • 可定制的Bootloader功能。这部分中的代码用于根据项目的特定需求定制Bootloader。 它包含函数main(),Bootloader的配置文件和钩子函数,这些函数能够按照使用需求调整引导程序的行为,而无需修改bootloader程序的内部。 例如,如果适用,您可以在此处实现控制后门的打开和关闭以及看门狗的处理的功能。
  • 独立加载更新功能。这部分是Bootloader的核心,在更新软件期间,处理固件文件到存储器的数据传输,使用时无需对Bootloader进行更改。主机和Bootloader之间的通信遵循XCP 1.0版协议,它的正式名称是ASAM MCD-1 XCP V1.0.0,它是一种通用的测量和校准协议。具体可查阅相关手册。
  • 平台特性。将Bootloader移植到新的平台控制器时,只需要修改这部分内容。它包含访问通信、计时器和存储设的驱动程序。
  • 编译器特性功能。这实际上是目标依赖类别的子类别。 它包含诸如c-startup例程和中断向量表之类的代码,通常需要一些编译器独特操作才能链接到正确的内存位置。
    Bootloader被编程到微控制器的内部存储器中,通常是内部FLASH,并控制主中断向量表。 每次复位后,都会在开始启动Bootloader。固件更新结束时它检查编程的校验和,以确定是否存在有效的用户程序。 如果确认无误,它将启动用户程序并将中断重新定向到伪向量表(偏移的向量表)。 如果编写了错误的用户程序,可以使用后门钩子函数这可能会派上用场来强制Bootloader运行。

5.2 模块

Bootloader的四个部分详细框架。代码依据框架进行开发的。
在这里插入图片描述
图1-5 模块

5.3 状态机

可以参考状态机理解典型使用场景:

在这里插入图片描述
图1-6 状态机
正在运行的用户程序如何进行固件更新:
所有OpenBLT例程的配置方式均可以从正在运行的用户程序中启动固件更新(处于用户程序活动状态)。当用户程序从主机接收到XCP CONNECT命令时,它将通过执行软件复位来激活Bootloader。重置后,Bootloader将所谓的后门保持打开状态一段预先配置的时间(BOOT_BACKDOOR_ENTRY_TIMEOUT_MS)。主机将连续发出XCP CONNECT命令,直到收到响应为止。如果在后门打开时Bootloader收到了XCP CONNECT命令,它将发送一个确认的响应,并使Bootloader进行固件更新,因此可以禁止(旧)用户程序的启动。
一旦固件更新完成,则执行软件复位,它首先进入入口状态(Entry)。在后门时间窗口过去之后,将发生转移到用户程序验证状态。此处,将再次计算用户程序校验和,并将其与固件更新结束时的值进行比较。如果校验和正确,则Bootloader会假定用户程序有效并启动它(处于用户程序活动状态)。
如果在固件更新过程中发生任何错误或校验和验证失败,则Bootloader默认为其进入更新状态。它在这里等待并监听新的固件更新请求。
从后门接口固件更新:
当用户程序不支持激活Bootloader或编程的错误用户程序无法运行时,可以始终通过后门激活Bootloader。 每次重启后,默认实现都会使后门保持打开状态约500毫秒(BOOT_BACKDOOR_ENTRY_TIMEOUT_MS宏的值)。 该后门功能可以通过钩子函数更改按照应用程序需求。 一种常用的配置是根据复位后数字输入的状态使后门始终保持打开状态的配置。 这样一来,就可以在复位期间简单地按一下按钮的开关,并且Bootloader保持活动状态,而不必尝试启动用户程序。 复位后(Entry状态)检测到后门打开状态时,则进入空闲状态。 一旦处于空闲状态,Bootloader就会侦听来自主机的XCP CONNECT命令,并在检测到用于处理固件更新的状态时转换为编程状态。
通讯顺序
在固件更新过程中,主机使用配置的通信接口将XCP命令发送到微控制器目标。 下图阐明了XCP命令的顺序。 请注意,主机期望每个XCP命令都来自微控制器目标,但PROGRAM_RESET命令除外。 这和XCP 1.0协议规范有关。
在这里插入图片描述
图1-7 通信协议
定制化
Bootloader通过文件blt_conf.h中的预处理程序语句进行配置。 在此头文件中,可以选择要使用的通信接口(UART,USB,CAN,SD卡等),还可以启用Bootloader应调用的钩子函数。 钩子函数可以进一步自定义引导加载程序应用程序,而不必对引导加载程序内核进行任何修改:
在这里插入图片描述
图1-8 配置文件与钩子函数

6. 总结

虽然是一个比较复杂的问题,在分析问题时,将问题分解,比如,整个Bootloader分为通信、存储等,梳理过原理之后,再接触OpenBLT,可以预测到代码实现逻辑,再追踪定位,验证预测。
7. 参考资料

  • STM32F1开发指南-库函数版本_V3.1
  • OpenBLT 设计原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值