当前位置: 首页 > 科技观察

设备OTA空中升级原理

时间:2023-03-20 15:28:03 科技观察

1。后台没有完美的软件,因为设计缺陷和业务需求更新,软件一直在升级和完善。如何用新软件替换正在运行的旧软件是本文的重点,尤其是电子产品,OTA无线设备升级,受限于硬件资源,需要选择不同的软件升级方案。2.空中升级过程在线升级过程简化了设备同时运行旧软件,获取新软件包,然后进行特殊操作,用新软件覆盖旧软件,最后运行新软件。根据硬件资源和系统整体架构,选择不同的升级方案。需要结合实际情况选择最佳方案,技术水平是次要的。3.无线升级方案3.1.整包升级以STM8单片机升级为例,单片机最小系统运行流程如下:图中要增加在线升级功能,需要拆分主应用程序,同样有2套程序在运行在设备中,标准名称是bootload+app,其中bootload始终不变,接收新的软件包并覆盖app区域。硬件限制解决方案MCU本身没有网络连接功能,只能基于外网模块从远程服务器下载新的软件包,然后通过串口传输给MCU。外部主机下载新的软件包并通知MCU进入升级模式。MCU内部RAM小,不能进行拷贝操作或缓存大量数据;单片机EEPROM体积小,不能保存一个完整的新软件包,只能在Bootload时分段接收新软件并立即写入flash。总体方案如下:难点和风险。当达到升级请求时,需要重启才能进入bootload。对于单片机控制的设备,需要保证单片机重启过程中网络模块没有上电。因此升级进入bootload后必须立即恢复网络模块主机的供电,必要时需要硬件支持。单片机的ram和rom有限,将新的软件包分段接收,直接写入flash。因此,需要保证数据包在应用层协议中不会被误传或漏传或重传。目前使用最多的是Ymodem协议。升级包需要转成bin文件,MCU收到后写入到app的起始地址。单片机分段接收和写入flash的整个过程需要10多秒。如果在此期间断电,单片机软件app处于损坏状态,需要通过超时机制重启单片机,重新启动升级和网络模块主动要求重传新软件包。一般PC软件不需要考虑内存和存储空间,也是采用整包升级,两个文件同时保存。例如,当app.exe运行时,会下载一个新的app_new.exe。下载验证后,app.exe自毁删除自身,然后将app_new.exe重命名为app.exe并启动。3.2.差异升级差异升级的软件架构与包升??级相同,区别在于新软件包的提供方式不同。单片机软件一般不超过50KB。复杂微处理器的软件一般都比较大,但它的RAM也很大。下载一个完整的新软件包需要很长时间并且浪费流量。因此,可以根据软件新旧版本的差异,将差异文件传输到设备上,通过恢复设备计算来升级新的软件包。困难和风险差异包的生产和恢复算法验证在从引导加载恢复新软件包时考虑了RAM。差分包是按块生成的,恢复也是按块进行的。在编写每个新软件之前,您需要先备份旧块,以防止异常停电恢复。出现画面异常,重启或进入bootlaod,查看上次恢复到哪个block,后面继续操作。为了再次减小差分包的体积,部分文件在恢复前也进行了压缩解压。升级时需要保证生成的差分包是基于当前设备运行的版本。比如设备运行的是V01,但是提供的差分包是基于V02到V03的,就会出现异常。或者在文件中预先设置特殊的版本字符,只有版本匹配才能进行差异恢复和升级。整个包没有这个缺点,只要bootlaod正常,任何app软件版本都可以互相升级。3.3.动态加载动态加载在PC软件中很常见。多个exe可执行文件共享dll库文件,所以exe文件很小。缺点是为保证exe的正常运行,需要将dll文件存放在指定路径下。对于嵌入式平台,图片的动态加载可以理解为保持底层基本框架不变,修改或替换不同的上层业务逻辑,实现不同的效果。为了保证底层和上层之间的调用关系,一些接口地址必须是固定的,即两者之间的接口映射,主要通过链接来实现。图像嵌入软件从源代码到可以下载到设备的图像文件需要经过:图像动态加载是在链接阶段将上层代码obj编译成axf可以动态加载的文件,而不是直接与其他obj合并成一个可以下载的可执行文件的文件。主要是通过armlink配置-entry来指定image文件的初始入口点或者在代码中使用#pragmaarmsectioncode关键字来保证动态上层有一个固定的入口地址。对于上层调用的底层接口,在编译阶段将函数体指针赋值为空指令,保证编译通过,后面再指向底层的真实地址。图片的作用发生在系统启动阶段,从flash加载到内存,界面在整个文件中的相对地址不变,整体偏移。这样,软件仍然可以计算得到动态图片文件的入口地址。加载到内存区域,需要保证这个区域不会被占用,否则内存覆盖肯定会引发异常。底层启动后只能找到动态加载文件的入口函数,但是底层和上层之间肯定不止一个接口,上层必然会调用底层接口,这需要在第一个函数体中实现,地址明确。层地址映射。这里有两种方案,一种是函数指针赋值,一种是根据字符串查找。底层需要为上层调用接口,底层映射接口函数指针表,按照固定顺序给上层函数指针赋值;或者底层只提供上层的一个函数,只是改变函数体,通过查字符串获取函数指针。这样上层就提前调用了固定底层接口。上层给下层提供的接口也是预先固定的函数指针,也是和上面的方法连接起来的。接口映射的核心是链接时指定一个函数在动态加载块中的地址,在这个函数中实现上下层函数映射。除了函数,全局变量也是通过指针传递的。困难与风险前两种采用bootload+app的方案是比较常规的方案。本质是一个芯片运行两套互不干扰的软件,上下层动态加载之间有一个固定的接口,除接口外不能使用。相互作用。动态加载对链路和arm底层要求很高,在升级方向很少用到,因为有软件开发接口的使用限制,但是动态加载实现了上下层的隔离,避免了代码调用混乱,并提供跨平台和多语言开发。根据。4.结语在线升级是为了在不召回产品的情况下,以较低的成本解决售后问题;升级是为了解决问题,但如果升级失败,可能会导致设备变砖。初步测试时,应选择不同的设备模拟升级异常,如强行断电或软件包异常,设备必须具有自恢复机制。本文转载自微信公众号“嵌入式系统”,可通过以下二维码关注。转载本文请联系EmbeddedSystems公众号。