文章目录
- IAP、DFU和OTA的区别
- DFU模式
- DFU单区和双区
- 双区DFU设计
IAP、DFU和OTA的区别
IAP(In Application Programming),IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,属于软件编程方面的概念。
DFU(Device Firmware Update),就是设备固件升级的意思,升级方式包括有线传输和无线传输。
OTA(Over The Air)是实现DFU的一种方式,准确说,OTA的全称应该是OTA DFU,即通过空中无线方式实现设备固件升级。有时候大家也将OTA称为FOTA,即Firmware OTA。
DFU模式
DFU包括后台式(background)和非后台式两种模式。
后台式DFU,又称静默式DFU(Silent DFU),在升级的时候,新固件在后台悄悄下载,即新固件下载属于应用程序功能的一部分,在新固件下载过程中,应用可以正常使用,也就是说整个下载过程对用户来说是无感的,下载完成后,系统再跳到BootLoader程序,由BootLoader完成新老固件拷贝操作,至此整个升级过程结束。比如智能手机升级Android或者iOS系统都是采用后台式DFU方式,新系统下载过程中,手机可以正常使用。
非后台式DFU,在升级的时候,系统需要先从应用程序跳到BootLoader程序,由BootLoader进行新固件下载工作,下载完成后BootLoader继续完成新老固件拷贝操作,至此升级结束。早先的功能机就是采用非后台式 DFU来升级操作系统的,即用户需要先长按某些按键进入bootloader模式,然后再进行升级,整个升级过程中手机正常功能都无法使用。
DFU单区和双区
下面再讲双区(2 Slot)DFU和单区(1 Slot)DFU,双区或者单区DFU是新固件覆盖老固件的两种方式。
后台式DFU必须采用双区模式进行升级,即老系统(老固件)和新系统(新固件)各占一块Slot(存储区),假设老固件放在Slot0中,新固件放在Slot1中,升级的时候,应用程序先把新固件下载到Slot1中,只有当新固件下载完成并校验成功后,系统才会跳入BootLoader程序,然后擦除老固件所在的Slot0区,并把新固件拷贝到Slot0中,或者把Slot0和Slot1两者的image进行交换。非后台式DFU可以采用双区也可以采用单区模式,与后台式DFU相似,双区模式下新老固件各占一块Slot(老固件为Slot0,新固件为Slot1),升级时,系统先跳入BootLoader程序,然后BootLoader程序把新固件下载到Slot1中,只有新固件下载完成并校验成功后,才会去擦除老固件所在的Slot0区,并把新固件拷贝到Slot0区。
单区模式的非后台式DFU只有一个Slot0,老固件和新固件分享这一个Slot0,升级的时候,进入bootloader程序DFU模式后立马擦除老固件,然后直接把新固件下载到同一个Slot中,下载完成后校验新固件的有效性,新固件有效升级完成,否则要求重来。跟非后台式DFU双区模式相比,单区模式节省了一个Slot的Flash空间,在系统资源比较紧张的时候,单区模式是一个不错的选择。不管是双区模式还是单区模式,升级过程出现问题后,都可以进行二次升级,都不会出现“变砖”情况。不过双区模式有一个好处,如果升级过程中出现问题或者新固件有问题,它还可以选择之前的老固件老系统继续执行而不受其影响。而单区模式碰到这种情况就只能一直待在bootloader中,然后等待二次或者多次升级尝试,此时设备的正常功能已无法使用,从用户使用这个角度来说,你的确可以说此时设备已经“变砖”了。
所以说,虽然双区模式牺牲了很多存储空间,但是换来了更好的升级体验。
双区DFU设计
单片机需要有两段程序,
首先上电是bootloader程序,程序中要负责升级的传输和flash的读写。
然后是application程序,实现具体的项目功能。
像cortex-M3 M4这钟RAM小的单片机,通常还需要双备份。
以确保在传输结束后发现程序有问题还可以回退到正常执行版本。
bootloader上电后要校验固件合法性,
可以在app固件末尾附加CRC32,进行运算校验。
还可以在中断向量表的保留寄存器中写入标志位,
并在固件开头进行查询核对。
bootloader的中断在跳转到APP之后记得要关闭。
bootloader在上电后在flash中存储异常重启计数。
app开始执行一段时间后,将异常重启计数清零。
如果bootloader发现异常重启溢出,便停留在boot中等待升级。