irpas技术客

在STM32中使用bsdiff算法实现差分升级(bootloader)_eming2083_stm32差分升级

irpas 4696

文章目录 前言演示项目一、bsdiff简介二、bootloader主要功能三、FLASH分区四、使用方法五、使用ymodem协议下载固件及补丁包六、项目地址七、感谢


前言

在物联网应用中,经常遇到要求快速部署的情况,这样就要求设备能支持OTA功能,为了减少升级包体积,最好的办法就是采用差分包升级,这篇文章主要介绍这些功能最重要的部分之一bootloader。


演示项目

演示项目地址


一、bsdiff简介

bsdiff是一个优秀的开源差分算法,目前被用在很多场景,它是基于二进制的增量更新算法,当然也可以用于MCU系统中。

二、bootloader主要功能 这个bootloader的主要功能是按照下载的升级包类型升级应用程序,然后跳转到应用程序区运行。支持非压缩的固件。支持lzma压缩后的固件,解压大概需要30K的SRAM空间,如果需要其他压缩方式,可自行改造。支持bsdiff差分升级包,可极大减少升级包体积。所有升级包均附加64字节包头,用来保存升级包名称,长度,校验等信息,类似u-boot镜像头。目前支持STM32F103VE和VG芯片。 三、FLASH分区 目前所有数据均保存在芯片内部Flash,Flash分为4个分区。 分区1为bootloader分区,固定32K - 64字节,这最后64字节用来保存应用程序镜像头。分区2为应用程序区,镜像起始地址为0x08007FC0,程序入口地址为0x08008000。分区3用来保存下载的升级包,差分升级时还用来保存解码出来的新固件。分区4位于Flash的最后4K,用来保存一些升级信息。 当前bootloader支持2种分区参数,一种512K,一种1024K,具体可参见flash.h文件。如果需要将数据保存在外部Flash,可自行改造。 四、使用方法

首先需要使用到2个工具,分别是mkuzimage和make_udiff,前者用来生成非压缩固件或者lzma压缩固件,后者用来生成差分升级包。

非压缩固件 mkuzimage -i image.bin -o uimage.bin

LZMA方式压缩固件 mkuzimage -C lzma -i image.bin -o uzimage.bin

差分固件 make_udiff -o old.bin -n new.bin -p patch.bin

将升级包(uimage.bin,uzimage.bin,patch.bin,3种的任意1种即可)通过某种通信方式(串口,网口,4G等)下载到分区3,这部分需要在应用中实现。也可以在bootloader命令行下使用ymodem串口下载,具体下述。

最后更新位于分区4的升级标志(分区4偏移地址0,值为0xAA55),这一步建议在应用程序中完成。也可在bootloader命令行下,输入iap-start命令,更新这个标志。

复位,bootloader会自动解析升级包类型,然后升级。

五、使用ymodem协议下载固件及补丁包 下载应用程序到分区2 分区2固件由bootloader直接引导,所以必须使用mkuzimage生成非压缩固件,然后下载,在超级终端输入命令: #ymodem app 超级终端窗口收到CCC时,用YMODEM发送文件。 下载成功后,设备会自动重启,并引导到应用程序运行。 下载升级包到分区3 升级包支持上文提到的3种类型,下载时可任选一种,在超级终端输入命令: #ymodem patch 超级终端窗口收到CCC时,用YMODEM发送文件。下载成功后,设备会自动重启,并自动升级到新版本程序。 六、项目地址 https://gitee.com/eming/bootloader_stm32f103 https://gitee.com/eming/make_udiff https://gitee.com/eming/mkuzimage

不想自己编译的可以直接下载编译好的版本。

七、感谢

这个项目使用了很多源于网络的开源代码,例如bsdiff,lzma,atomlib等,在此表示感谢。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #stm32差分升级