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


前言

在物联网应用中,经常遇到要求快速部署的情况,这样就要求设备能支持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,可自行改造。

四、使用方法

  1. 首先需要使用到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

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

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

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

五、使用ymodem协议下载固件及补丁包

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

六、项目地址

https://gitee.com/eming/bootloader_stm32f103_hd  
https://gitee.com/eming/make_udiff  
https://gitee.com/eming/mkuzimage  

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

七、感谢

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

  • 14
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
差分升级算法是用于在软件版本升级时,通过比较旧版本和新版本的差异来减少升级包的大小,从而减少下载和安装的时间和带宽消耗。bsdff和hdiff是两种常用的差分升级算法bsdff算法是一种基于二进制的差分算法,它通过将新旧版本进行二进制比较,找出它们之间的差异,并生成一个差分文件。这个差分文件只包含了需要修改的部分内容,因此相对于整个新版本的升级包,它的大小更小。在升级时,只需将差分文件与旧版本文件进行合并,就可以得到完整的新版本文件。bsdff算法在处理二进制文件时非常高效,因此在很多软件升级被广泛使用。 hdiff算法是一种基于压缩的差分算法,它采用了压缩和哈希技术来减少差异数据的大小和提高匹配效率。与bsdff算法不同,hdiff算法生成的差分文件不仅包含了需要修改的内容,还包含了一些辅助信息,比如哈希表。这样在升级时,需要将差分文件与旧版本文件和辅助信息一起使用,才能得到完整的新版本文件。hdiff算法在处理文本文件时效果较好,特别是对于较大的文件或者稍有复杂度的文件。 综上所述,bsdff算法和hdiff算法都可以实现差分升级的功能,但它们在处理文件类型和效率上有所差异。在选择使用哪种算法时,需要考虑到具体的应用场景和需求,综合评估使用二进制比较还是压缩和哈希技术更适合。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值