前言
随着运行时间的增加,物联网终端在使用过程中会暴露出各种问题,技术人员需要对其进行维护或升级,而终端设备逐渐小型化和空间分布广的特点使其拆卸不便,采用固件远程在线升级技术可使固件升级更加便利。
BSDIFF简介
bsdiff算法是较为成熟的增量更新算法,由于该算法生成的补丁文件较小,因此而得到广泛应用。
系统框图
Boot工作原理
不管用的是什么MCU,要实现固件升级都离不开BootLoader,BootLoader是一个统称,它是一段引导程序,在MCU启动的时候会先运行这段代码,判断是否需要升级,如果不需要升级就跳转到APP分区运行用户代码,如果需要升级则先通过一些硬件接口接收和搬运要升级的新固件,然后再跳转到APP分区运行新固件,从而实现固件升级。以下是Boot流程图:
FLash分区
采用将Flash区域划分成Boot区、Patch区、old区、new区,这种分区方式比较万能,优点是新固件存放在patch区,如果搬运过程中出现异常中断情况,也不会造成数据丢失。而缺点是需要划分单独的分区,占用较大资源变相减少了old区资源。
BootLoader制作
- 分区定义,先把各个分区内存起始地址和大小定义好。
- 程序跳转,BootLoader作为引导程序,最重要的是通过内存跳转至用户程序。
- 处理函数,读取patch区的升级标志位,如果需要升级则解析Patch区内容,对版本进行校验,比对旧文件的信息与差分包旧文件是否一致,计算是否能放下new文件,如果可以放下则通过差分还原算法将Patch区与old区内容进行合并写入new区。最后将old文件擦除,将合并后的文件复制到old区,最后boot跳转old起始地址开始运行升级后的程序。
APP实现原理
App区实现自己的功能,具体流程图如下