随着科技的飞速发展,设备的功能日益强大,系统也变得愈发复杂。在这样的背景下,产品升级成为了开发过程中不可或缺的重要环节。在工程应用里,如何在不更改硬件的前提下,通过软件方式实现产品升级,成为了开发者们关注的焦点。而通过 Bootloader 来实现固件的升级,无疑是一种极为出色的方式。Bootloader 作为单片机上电后运行的段程序,主要承担着固件更新的重要任务。

对于产品固件的升级,用户可以采用 AMetal 提供的 Bootloader 单区、双区、差分升级算法及升级示例来进行产品开发。下面为大家详细介绍 Bootloader 的几种升级算法。
Bootloader 单区升级
单区 bootloader 通常会将芯片内部的 Flash 主要划分为 bootloader 区、APP 区和参数区。bootloader 用于引导程序,APP 扇区用于存放升级后的应用程序,参数区则用于存储特殊的参数。具体的扇区大小可以根据实际使用情况进行合理划分。单区升级的典型模型如下:

【原理说明】
芯片上电后,首先从首地址即 bootloader 开始执行,当参数校验无误后,程序跳转到 APP 扇区。若有升级请求,程序会跳转到首地址,在 bootloader 中接收新的固件,然后将 APP 区擦除。在新固件参数校验成功后,程序将从 bootloader 跳转到 APP 区执行应用程序,从而完成固件的升级。
【应用场景】
在擦除 APP 区的过程中,如果设备突然断电,会导致 APP 区的应用程序无法启动。此时,虽然可以重新跳转到 bootloader 接收新的固件,进而完成固件的升级,但这也会带来一些不必要的麻烦,比如设备需要多次写入固件。因此,这种升级算法只适用于本地升级,不能在程序正常运行的过程中进行升级,通常适用于 Flash 容量较小的场景。
Bootloader 双区升级
【双区升级模型】
以 ZLG116 芯片为例,该芯片内部主 Flash 大小为 64K (0x0800_0000 - 0x0800_FFFF),主要将 Flash 划分为四个部分:bootloader 段扇区、应用段扇区、升级扇区(备份区)、升级标志扇区。其中,bootloader 用于引导程序;应用扇区用于存放升级后的应用程序;升级扇区用于存储新的固件,作为备份;升级标志扇区用于存储特定的标志等。用户可以根据自身的实际应用情况合理划分各区的大小,双区升级的典型模型如下所示:

【原理说明】
按照上述的 ZLG116 Flash 划分,程序首先从地址为 0x08000000,即 bootloader 开始执行,参数校验通过后,跳转到应用区。在接收到升级需求后,先将新的固件写入起始地址为 0x0800FC00 的备份区,并擦除 APP 扇区。接着将备份区存储的新固件写入到 bootloader 中,从而完成新固件的写入。若在擦除 APP 区的过程中受到其他因素的干扰,用户可以再次将备份区的固件写入 bootloader。新固件的参数校验通过后,程序从 bootloader 跳转到起始地址为 0x08003C00 的 APP 区执行应用代码。
【应用场景】
相比于单区升级,双区升级的模型增加了一块备份扇区,用于存放新的固件。因此,即使在擦除 APP 的时候设备发生断电,双区升级也无需再次在 bootloader 中接收新固件,只需将备份区存储的固件传入到 bootloader 即可。不过,这种升级方式虽然可以避免单区升级只能在本地升级的困扰,但无法降低传输固件的流量,不适用于开发板内存空间较小的场景。并且,双区升级需要对整个 APP 进行升级,这给产品升级带来了一些不便。
Bootloader 差分升级
【差分包原理】
差分升级是将新老固件具有差异的部分剥离出来。例如,固件从 V1.1.0 升级到 V1.1.1,两个固件相比只修改了 1K 的内容,如下图红色部分为不同部分,将该部分剥离出来生成差分包 Diff_V1.1.0~V1.11,通过云端将差分包推送到设备端,设备端接收完成之后,先解压差分包,再通过差分恢复算法,根据差分包中的数据标志,将新老固件进行融合,变成新的固件,从而完成升级。

【差分升级模型】
以基于华大 HC32L196 芯片设计差分升级为例,该芯片 Flash 为 256K(0x000_0000~0x0003_FFFF),首先需要对 Flash 进行划分,主要划分为 4 个部分:BootLoader 区、应用区、download 区、参数区。BootLoader 区用于引导升级,应用区为升级后的应用程序,download 区为差分包存储区间,参数区用于存储特定参数。各区大小按照实际使用情况进行合理划分。差分升级的典型模型如下所示:

【原理说明】
按照图 5 所示的升级模型,设备上电后首先从 bootloader 开始执行,参数无误后跳转到应用区。当有升级的需求时,先擦除 APP 区,并将新老固件进行分包,然后按顺序对分包后的新老固件对应的每个小块进行差分压缩,将所有的压缩包合并成一个文件,形成了升级的固件。将新的升级固件存放在 download 扇区,然后将该固件写入 bootloader 中,若固件参数校验无误,则跳到应用区执行后续的程序,进而完成产品的升级。
【应用场景】
差分升级的优点十分显著,它的升级固件更小、速度更快,也更加节省内存空间。然而,相对于整包升级方式(单区升级 / 双区升级),其缺点是依赖特定固件。例如,某一差分包为 V1.0 固件升级到 V1.1 固件的差分包 Diff_V1.0~V1.1,则该差分包只能用于升级版本号是 V1.0 固件的设备;对于其他版本号固件的设备不能用它升级。差分升级一般适用于希望降低传输固件的流量,或者开发板内存不足,不依靠特定升级固件的场景中。