嵌入式设备差分升级方案讨论

如题,嵌入式设备,比如通信模组等,往往在使用中需要固件升级,但当设备已经部署出去后,再想通过工厂烧录的方式进行升级时不太现实的,一般采用FOTA升级,但当固件size太大的时候,使用蜂窝网进行升级会消耗过多的流量,产生较大资费。就算不考虑流量,下载大文件所需的电量、连续大流量下载的信号质量问题等,都会对FOTA升级提出考验。所以,对FOTA升级进行优化,产生了差分FOTA升级。

差分FOTA升级需要这些条件:1.合适的差分算法,比如hdiff,包括差分程序diff和打补丁程序patch。在嵌入式设备上应用的话,patch程序要嵌入在BootLoader中。2.足够的ROM空间,需要留出足够的ROM空间来放置差分包,以及备份区域(如果需要支持断电恢复)。

设计差分FOTA升级程序的思路如下:在PC端进行差分包的制作,对新老版本的固件进行差分即可。然后把差分包下载到设备的空闲ROM空间,在设备端,需要在BootLoader里嵌入打补丁过程,在升级的时候,BootLoader程序利用差分包和原固件进行打补丁,生成新的固件。到这里都很直观,很简单。但是,先考虑空间问题,一般来说ram空间会很小,新生成的固件不能完全先写在ram空间里,但也不能擦除旧固件的区域来保存新固件,因为在打补丁的过程中可能随时需要原固件的任何部分,无法预测。所以当ram空间不够的时候,新生成的固件是没法儿保存的,这样的方式不可行。当ram空间足够的时候,当新的固件生成完成后,擦除旧固件进行新固件保存,如果此时断电,则新固件在重启之后会消失,旧固件也已经被擦除,则设备变砖,这样的升级方式也是不可接受的,必须支持断电恢复,则必须对内容进行备份。任何时候,“旧固件和差分包”,“新固件”,必须有一个完整保存在rom中,才能支持断电恢复。对于嵌入式设备来说,一般ROM空间和固件大小是差不多的,并不会留出固件size几倍的空间,所以要达到备份目的,必须减小备份size,那就只有一个办法,固件进行分区,分成几个小代码区,分别进行升级,至于分成多少块,就看ROM空闲区域,以及差分包大小,来进行权衡。

对于代码分区,有两种方式,要么是不涉及固件生成过程的分区,即固定分区,比如2M的固件,强行平均分成10份,每次差分时,对每份分别差分,分别打补丁。这种方式的优点是逻辑简单,缺点是新老固件对应块的相关性会变差,导致差分包增大,有时会增大到无法应用的程度。第二种方式是逻辑分区,这就涉及固件生成过程了。逻辑分区的目的是提高新老固件对应块的相关性,逻辑分区又分为两种方式,一是LD文件生成的分区,对于cpu不可见。二是分成多个独立的bin文件,这种情况应该只适合于多核的情况,没有研究。


没有更多推荐了,返回首页