史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)

一、概述

目前最流行的升级方式主要有以下几种:

1.1 boot+app+backup(拷贝升级)

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第1张图片

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第2张图片

        两个大小相同的分区app、backup,app分区存放要执行的固件,当OTA升级时会先把OTA数据包写入backup分区,然后再将OTA数据搬移到app数据区,最后从app数据区启动执行。

优点:

①即便升级失败,app区域是正常的,单片机仍能按原来的版本正常运行,提高了升级的稳定性和鲁棒性。

缺点:

①需要和app相同大小的额外flash空间,需要升级一次和备份一次

②需要增加判断升级异常后的处理逻辑,增加了程序设计的难度

③不能对boot进行升级

1.2 boot+app1+app2(A/B分区、乒乓升级)

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第3张图片

        两个大小相同的分区APP1、APP2,如果当前在APP1分区执行代码,升级时就把固件下载到APP2分区。升级成功后设备重启,模组切换到APP2分区执行;下次再升级就切换到APP1分区,一直这样轮询。

优点:

①出厂时设备上有两套可以正常工作的系统,升级时确保设备上始终有一个可以工作的系统,方便维修和售后;

②OTA升级可在系统的后台进行,所以更新过程中,用户可以正常使用设备,数据更新完成后,仅需要用户重启一次设备进入新系统(这场景熟不熟悉);

③如果OTA升级失败,设备可以回退到升级前的旧系统,并且可以尝试再次更新升级。

缺点:

①需要和app相同大小的额外flash空间

②同样在处理升级失败时的逻辑比较复杂

③不能对boot进行升级。

1.3 Boot0+boot1+标志区+app(APP和boot两重升级)

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第4张图片

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第5张图片

        按照上述的流程图可以明白,只要是标志区的跳转标记是正常模式或者bootloader_flag未被置位,说明是没有升级过boot1或者已经升级成功的,进而就跳转到boot1。否则都直接进入APP,这样可以防止APP里面升级boot1失败了而且不小心断电了,不用经过Boot1进入APP再次升级boot1。

        在boot0里面会根据标志区的升级模式(正常和升级)和升级标志(boot0是否升级,app是否升级)选择启动方式,正常执行boot0->boot1->app的流程;boot1里面可进入app和进行app升级,在app里可进行boot1的升级和设置app升级标志位。

优点:

①可以升级bootloader

②并且可以有效避免boot因升级失败导致需重新拆箱进行JTAG升级的麻烦;

缺点:

①由于需要设置boot0和标志区占用空间特别小,但又要单独设置一个片区,对于flash单个片区较大的情况就存在严重浪费;

②升级可靠性没那么好,比如升级失败了,原有的固件都已经被删除了,就还需要再次升级,直到升级成功为止。

③占用flash也比较多;

④流程相对比较复杂,设计过程中容易出现问题。

1.4 boot+app

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第6张图片

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第7张图片

        这种方案是最简单的升级方案,当boot里检测到升级标志会直接更新app,然后复位。

优点:

①简单易行

②升级效率高;

缺点:

①无备份区,不适合在线升级

②不能升级boot

1.5 boot0+boot1+app(APP和boot两重升级)

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第8张图片

史上最牛逼的单片机升级总结——究极骚气之boot0+boot1+app(boot+app双升级)_第9张图片

        上电进入boot0;判断是否有升级指令,如果没有则进入boot1,然后进入app正常运行,因为无升级指令所以此过程不可能有升级flag;如果有升级指令且为app升级,则擦除app区域并在app起始地址写入app_flag=1,然后跳入boot1等待app升级固件,然后按照国网协议进行升级,升级完成之后将app_flag复位然后进行系统复位;如果为boot升级,则擦除boot1区域并在boot1起始地址写入boot_flag=1,然后跳入app等待boot1升级固件,然后按照国网协议进行升级,升级完成之后将boot_flag复位然后进行系统复位。

优点:

①稳定可靠,不会因为断电导致变砖的情况,他可以上电继续重新升级;

②对于boot和app双升级方案来说,用了最少的flash配置,因为一般单片机的flash启动必须从0地址开始,所以要刷新boot必须要有一个引导区来引导程序跳转执行。

③逻辑简单清晰、效率很高。

缺点:

①无法备份,只能是本地升级。

二、总结提升

        根据第一部分的介绍,本质上将5种升级方式概括为带备份去不带boot升级(①②)不带备份区带boot升级(③⑤)不带备份区不带boot升级(④)这三种,当然你flash足够大并且有升级bootloader的需求也可以优化为带备份区带boot升级。

       升级方式有很多,JTAG、串口、CAN、网口等,但是本质上也就2种,本地升级在线升级

本地升级不需要备份区,因为即便升级过程中断电了,仍然可以重新再来。当然本地升级也可以实现在线升级,我们只需要接一个能联网的单片机,确保这个单片机接收到完整固件后再升级,不也相当于本地升级嘛~

        在线升级一定需要备份区,因为如果没有备份区,假如升级过程中断网,因app已经被破坏所以无法正常运行。当然备份区可实现的功能不止是简单的对app进行备份,我们还可以扩展为A/B分区、后台升级、以及实现不断电升级等等更加高级和人性化的功能,这里不一一谈啦~

        综上分析,我们可以做出如下决策:

①假如我们是本地升级且升级容许断电,那就不需要备份区;

②假如我们需要boot更新,那就需要带boot升级;

③假如我们需要在线升级,那就一定需要备份区。

还有什么升级的骚操作,或者我写的有bug?,留言留言^3^

你可能感兴趣的:(dsp开发,单片机,boot自升级,升级)