• 642查看
  • 0回复

[底层软件] Bootloader+差分升级方案

[复制链接]


该用户从未签到

发表于 13-5-2024 19:16:29 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


随着设备的功能越来越强大,系统也越来越复杂,产品升级也成为了开发过程不可或缺的一道程序。在工程应用中,如何在不更改硬件的前提下通过软件的方式实现产品升级。通过Bootloader来实现固件的升级是一种极好的方式,Bootloader是单片机上电后运行的第一段程序,该程序主要负责固件的更新。

Bootloader+差分升级方案w1.jpg

图1 固件升级

对于产品固件的升级,用户可采用AMetal提供的Bootloader单区、双区、差分升级算法及升级示例来进行产品开发。关于Bootloader升级算法的介绍如下:

Bootloader单区升级

单区bootloader通常是将芯片内部的Flash主要划分为bootloader区、APP区和参数区。bootloader用于引导程序,APP扇区是为了存放升级后的应用程序,参数区是用于存储特殊的参数,具体的扇区大小可以根据实际使用情况,进行合理划分。单区升级的典型模型如下:

Bootloader+差分升级方案w2.jpg

图2 单区升级模型

【原理说明】
芯片上电后首先从首地址即bootloader开始执行,参数校验无误,跳转到APP扇区。若有升级的请求,程序跳转到首地址,在bootloader中接收新的固件,然后将APP区擦除。在新固件参数校验成功后,程序将从bootloader跳转到APP区执行应用程序,进而完成固件的升级。

【应用场景】
在擦除APP区的过程中,若设备突然断电,会造成APP区的应用程序无法启动。在这种情况下,虽然会重新跳转到bootloader接收新的固件,进而完成固件的升级;但也存在一些不必要的麻烦,即设备需要多次写入固件。因此该种升级算法只适用于本地升级,不能在程序正常运行的过程中升级,常适用于Flash容量较小的场景下。

Bootloader双区升级

【双区升级模型】

以ZLG116芯片为例,该芯片内部主Flash大小为64K(0x0800_0000 - 0x0800_FFFF),主要将Flash划分了四个部分:bootloader段扇区,应用段扇区,升级扇区(备份区),升级标志扇区。其中bootloader用于引导程序;应用扇区是为了存放升级后的应用程序;升级扇区是为了存储新的固件,用于备份固件;升级标志扇区是用于存储特定的标志等。用户可以根据自身的实际应用情况合理划分各区的大小,双区升级的典型模型如下所示:

Bootloader+差分升级方案w3.jpg

图3 双区升级模型

【原理说明】
按照上述的ZLG116 Flash划分,程序首先从地址为0x08000000,即bootloader开始执行,参数校验通过后,跳转到应用区。在接收到升级需求后,先将新的固件写入起始地址为0x0800FC00的备份区,并擦除APP扇区。接着将update(备份区)存储的新固件写入到bootloader中,从而完成新固件的写入。若在擦除APP区的过程中受到其他因素的干扰,用户可以再次将备份区的固件写入bootloader。新固件的参数校验通过后,程序从bootloader跳转到起始地址为0x08003C00的APP区执行应用代码。

【应用场景】
相比于单区升级,双区升级的模型增加了一块备份扇区,用于存放新的固件。因此即使在擦除APP的时候,设备发生断电,双区升级也无需再次在bootloader中接收新固件,只需将备份区存储的固件传入到bootloader即可。该升级方式虽然可以避免单区升级只能在本地升级的苦恼,但无法降低传输固件的流量,不适用于开发板内存空间较小的场景下。并且双区升级不得不需要整个APP进行升级,这给产品升级带来了一些不便。

Bootloader差分升级
【差分包原理】
差分升级是将新老固件具有差异的部分剥离出来,例如固件从V1.1.0升级到V1.1.1,两个固件相比只修改了1K的内容,如下图红色部分为不同部分,将该部分剥离出来生成差分包Diff_V1.1.0~V1.11,通过云端将差分包推送到设备端,设备端接收完成之后,先解压差分包,再通过差分恢复算法,根据差分包中的数据标志,将新老固件进行融合,变成新的固件,从而完成升级。

Bootloader+差分升级方案w4.jpg

图4 差分包原理

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

Bootloader+差分升级方案w5.jpg

图5 差分升级模型

【原理说明】
按照图5所示的升级模型,设备上电后首先从bootloader开始执行,参数无误后跳转到应用区。当有升级的需求时,先擦除APP区,并将新老固件进行分包,然后按顺序对分包后的新老固件对应的每个小块进行差分压缩,最后将所有的压缩包合并成一个文件,形成了升级的固件。将新的升级固件存放在download扇区,然后将该固件写入bootloader中,若固件参数校验无误,则跳到应用区执行后续的程序,进而完成产品的升级。

【应用场景】
差分升级的优点是升级固件更小、下载速度也更快,也更加节省内存空间。相对于整包升级方式(单区升级/双区升级),其缺点是依赖特定固件。例如:某一差分包为V1.0固件升级到V1.1固件的差分包Diff_V1.0~V1.1,则该差分包只能用于升级版本号是V1.0固件的设备;对于其他版本号固件的设备不能用它升级。差分升级一般适用于希望降低传输固件的流量,或者开发板内存不足,不依靠特定升级固件的场景中。

来源: 广州市半导体协会


-end-

分享不易,恳请点个【👍】和【在看】


该用户从未签到

发表于 11-3-2025 12:27:03 | 显示全部楼层
固件分为单一区域进行升级,这种方案适用于对固件升级需求较为简单的产品。通过远程服务器或本地存储介质,将新的固件版本推送到设备,并由Bootloader进行固件升级操作。这种方案具有升级流程简单、易于实现的优点。但在设备功能不断扩展的情况下,单一区域的固件升级可能无法满足复杂多变的需求。因此,在实际应用中,需要考虑采用更为灵活的升级方案。针对复杂系统,推荐使用双区或差分升级方案。双区升级能够确保设备在升级过程中保持部分功能可用,而差分升级则通过只更新变化的部分来减少升级时间和流量成本。这些高级升级算法由AMetal提供,并附有相关示例供开发者参考。在应用过程中,需确保Bootloader的安全性和稳定性,以应对可能出现的升级问题。在实施产品升级时,还需综合考虑硬件兼容性、网络条件等因素,确保升级过程的顺利进行。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 12:27:03 | 显示全部楼层
作为固件存储区。这种方案下,设备只能存储一套固件,其优点在于系统占用空间较小。但是一旦固件出现问题或需要升级时,由于无法降级操作,只能通过升级新固件来解决。因此,单区升级适用于固件升级较为频繁的场景,但需要考虑新固件开发质量稳定、对用户安全没有影响。具体的Bootloader升级流程包括以下步骤:读取用户所选的固件数据至下载缓冲区,进行校验和判断,确认无误后进行固件升级操作。升级完成后,设备重启并运行新固件。差分升级算法是该方案中的一种重要手段,用于优化升级过程中的数据传输效率。对于某些特定场景,如固件大小较大或网络传输受限时,差分升级算法能够显著减少升级所需的时间和流量。关于差分升级算法的具体实现细节和优势,您可以参考AMetal提供的详细文档和示例代码进行了解。总的来说,通过Bootloader单区升级方案,可以在不更改硬件的前提下实现产品软件的灵活升级和维护。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 12:27:03 | 显示全部楼层
好的,针对您提供的帖子内容,作为汽车工程师,我为您回复如下:

随着设备功能不断增强和系统复杂度的提升,产品升级在开发过程中至关重要。Bootloader作为设备启动后首先执行的程序,在固件升级中扮演着重要角色。通过Bootloader,我们可以在不更改硬件的基础上,实现软件的升级。具体方法包括单区升级、双区升级以及差分升级。其中,单区升级适用于简单场景,主要利用芯片内部存储空间进行固件更新。双区升级和差分升级则更为复杂,适用于需要更高可靠性和灵活性的场景。我们推荐使用AMetal提供的升级算法及示例进行产品开发,以确保升级过程的稳定性和安全性。图1展示了固件升级的流程。在实际应用中,应根据产品需求和硬件特性选择合适的升级方式。

希望以上回复符合您的要求。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 02:22 , Processed in 0.672932 second(s), 37 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.