【STM32】BootLoader介绍、编写以及OTA常见⽅案分析
参考博客:
⼀、关于BootLoader
1、BootLoader就是单⽚机启动时候运⾏的⼀段⼩程序,这段程序负责单⽚机固件的更新,也就是单⽚机选择性的⾃⼰给⾃⼰下程
序。可以更新,也可以不更新,更新的话,BootLoader更新完程序后,跳转到新程序运⾏;不更新的话,BootLoader直接跳转到原来的程序去运⾏。
2、BootLoader更新完程序后并不擦除⾃⼰,下次启动后依然先运⾏BootLoader程序,⼜可以选择性的更新或者不更新程序,所以
BootLoader就是⽤来管理单⽚机程序的更新。
3、在实际的单⽚机⼯程项⽬中,如果加⼊了BootLoader功能,就可以给单⽚机⽇后升级程序留出⼀个接⼝,⽅便⽇后单⽚机程序更
新。当然,这就需要创建两个⼯程项⽬,⼀个为BootLoader⼯程,⼀个为APP⼯程。
4、BootLoader⼯程⽣成的.hex或者.bin⽂件通常下载到ROM或Flash中的⾸地址,这样可以保证上电后先运⾏BootLoader程序。⽽
APP⼯程⽣成的.hex或者.bin⽂件则下载到ROM或Flash中BootLoader后⾯的地址中。也就是说,存在ROM/Flash中的内容是分为两部分的。
5、要实现在同⼀个ROM/Flash中保存两段程序,并且保证不能相互覆盖,则需要在下载程序时指定地址。如在Keil下,可以进⾏如下
的调整
⼆、OTA升级⽅式:(涉及到BootLoader的编写)
1.全量升级:
完整的下载新版本固件,下载完成后将固件搬运到APP程序运⾏的位置。(⼀般来说是将APP从⽚外flash搬运到⽚内flash上)。搬运完成后校验通过后重启APP。
2.差分升级:
利⽤算法,做出原版APP和新版APP程序的差分包,将差分包下载到flash,内部的BootLoader程序在利⽤算法将新版APP合成,合成后在搬运,搬运后校验,重启。
⼀般制作出来的差分包只有原包的5%左右。省空间!
服务器端: ⽣成差分包,bsdiff算法
1.对old⽂件中所有⼦字符串形成⼀个字典;
2.对⽐old⽂件和new⽂件,产⽣diff string 和extra string;
3.将diff string 和extra string 以及相应的控制 字⽤zip压缩成⼀个patch包。
设备端: ⽣成new File,bspatch算法1.接收patch包;
2.解压patch包;
3.还原new⽂件。
3.原地升级:
相⽐差分升级,合包的过程,直接搬运。容错率低。
4.AB⾯升级:
如图所⽰:
A/B 系统更新可带来以下好处:
OTA 更新可以在系统运⾏期间进⾏,⽽不会打断⽤户。⽤户可以在 OTA 期间继续使⽤其设备。在更新期间,唯⼀的⼀次宕机发⽣在设备重新启动到更新后的磁盘分区时。
更新后,重新启动所⽤的时间不会超过常规重新启动所⽤的时间。
如果 OTA ⽆法应⽤(例如,因为刷机失败),⽤户将不会受到影响。⽤户将继续运⾏旧的操作系统,并且客户端可以重新尝试进⾏更新。
如果 OTA 更新已应⽤但⽆法启动,设备将重新启动回旧分区,并且仍然可以使⽤。客户端可以重新尝试进⾏更新。
任何错误(例如 I/O 错误)都只会影响未使⽤的分区组,并且⽤户可以进⾏重试。由于 I/O 负载被特意控制在较低⽔平,以免影响⽤户体验,因此发⽣此类错误的可能性也会降低。
更新包可以流式传输到 A/B 设备,因此在安装之前不需要先下载更新包。流式更新意味着⽤户没有必要在 /data 或 /cache 上留出⾜够的可⽤空间来存储更新包。
缓存分区不再⽤于存储 OTA 更新包,因此⽆需确保缓存分区的⼤⼩要⾜以应对⽇后的更新。
dm-verity 可保证设备将使⽤未损坏的启动映像。如果设备因 OTA 错误或 dm-verity问题⽽⽆法启动,则可以重新启动到旧映像。
冀的拼音(Android 验证启动不需要 A/B 更新。)
火把节是哪天⼏种OTA⽅式的对⽐:
符龙飞即将当爸优点缺点
差
分升级1.差分包⼩(5%),下载更快,
节省OTA流程的时间。
手机按键1.⼀个差分包只能由特定的原包升级到特定的新包。
梦见死鱼2.保证基础包的⼀致性。若原包数据损毁,得到差分
包也⽆法升级。
全量升级1.拿到新的包就能升级。不需要指
定原包。2.不需保证基础包的⼀致
李安国籍性。
1.全量包的size更⼤,下载相⽐差分包需要更长时
间。
AB ⾯升级1.容错率⾼,更能避免固件升级出
错
2.OTA过程中不影响⽤户APP程序
的运⾏ 1.需要最多的flash空间的OTA⽅式。
3.下载完成后不需要搬运,不需要差分包还原
原地升级1.最节省flash空间的⽅式,不需要
合包存储,直接根据差分包搬运到
APP的位置
2.容错率低,若搬运过程中断电,则设备变砖
关于差分升级的缺点,如图所⽰,你懂得(懒得打字了......)
三、编写BootLoader
1.外设驱动-----CubeMX⼯具⽣成代码:GPIO uart(debug uart) SPI flash
2.md5库添加 、w25q80驱动⽂件添加
3.Boot_Start()函数
bootloader.h
发布评论