RT-Thread OTA 固件升级
本文主要介绍在 RT-Thread 系统上进行固件升级的工具和方法。固件升级,通常也称为 OTA(Over the Air)升级或者 FOTA(Firmware Over-The-Air)升级,即固件通过空中下载进行升级的技术。
网络协议
Ymodem 协议
Ymodem 是一种文本传输协议,在 OTA 应用中为空中下载技术提供文件传输的支持。基于 Ymodem 协议的固件升级即为 OTA 固件升级的一个具体应用实例。
HTTP 协议
HTTP 是一种超文本传输协议,采用请求应答的通讯模式,可以基于通用 socket 实现极简客户端程序,广泛应用在互联网上。HTTP 请求应答的方式,及其很小的客户端代码量,也使其很方便地应用在物联网设备中,用于与服务器进行数据 交互,以及 OTA 固件下载。
Flash 分区
通常嵌入式系统程序是没有文件系统的,而是将 Flash 分成不同的功能区块,从而形成不同的功能分区。
要具备 OTA 固件升级能力,通常需要至少有两个程序运行在设备上。其中负责固件校验升级的程序称之为 bootloader,另一个负责业务逻辑的程序称之为 app。它们负责不同的功能,存储在 Flash 的不同地址范围,从而形成了 bootloader 分区 和 app 分区 。
但多数情况下嵌入式系统程序是运行在 Flash 中的,下载升级固件的时候不会直接向 app 分区写入新的固件,而是先下载到另外的一个分区暂存,这个分区就是 download 分区 ,也有称之为 app2 分区 ,这取决于 bootloader 的升级模式。
bootloader 分区、app 分区、download 分区及其他分区一起构成了分区表。分区表标识了该分区的特有属性,通常包含分区名、分区大小、分区的起止地址等。
bootloader 升级模式
bootloader 的升级模式常见有以下两种:
1、bootloader 分区 + app1 分区 + app2 分区模式
该模式下,bootloader 启动后,检查 app1 和 app2 分区,哪个固件版本最新就运行哪个分区的固件。当有新版本的升级固件时,固件下载程序会将新的固件下载到另外的一个没有运行的 app 分区,下次启动的时候重新选择执行新版本的固件。
- 优点:无需固件搬运,启动速度快。
- 缺点:app1 分 区和 app2 分区通常要大小相等,占用 Flash 资源;且 app1 和 app2 分区都只能存放 app 固件,不能存放其他固件(如 WiFi 固件)。
2、bootloader 分区 + app 分区 + download 分区模式
该模式下,bootloader 启动后,检查 download 分区是否有新版本的固件,如果 download 分区内有新版本固件,则将新版本固件从 download 分区搬运到 app 分区,完成后执行 app 分区内的固件;如果 download 分区内没有新版本的固件,则直接执行 app 分区内的固件。
当有新版本的升级固件时,固件下载程序会将新的固件下载到 download 分区内,重启后进行升级。
- 优点:download 分区可以比 app 分区小很多(使用压缩固件),节省 Flash 资源,节省下载流量;download 分区也可以下载其他固件,从而升级其他的固件,如 WiFi 固件、RomFs。
- 缺点:需要搬运固件,首次升级启动速度略慢。
RT-Thread OTA 使用的是 bootloader 升级模式 2,即 bootloader 分区 + app 分区 + download 分区的组合。
固件下载器
在嵌入式设备程序中实现的,具有从远端下载升级固件功能的代码块称之为固件下载器(OTA Downloader)。固件下载器的工作是把新版本的升级固件下载设备的 Flash 中,不同的协议以及不同的 OTA 固件托管平台会有不同的固件下载器,即不同的代码实现。
目前 RT-Thread 已经支持了多种固件下载器,如下所示:
- 基于 Ymodem 协议的 Ymodem OTA 固件下载器(可通过串口等方式升级固件)
- 基于 HTTP 协议的 HTTP OTA 固件下载器(可通过网络方式升级固件)