热度 5
2021-1-18 23:02
3681 次阅读|
2 个评论
这个话题相信很多嵌入式的同行都困惑过很长一段时间,其实说起来也不算复杂,借此机会,也把以前做过的bootloader方案说一下 先说怎么实现的,要知道bootloader本身其实也是一个应用程序,不过这个应用程序本身不会做太多的处理,他只负责告诉程序得往哪里走。 一般来说,需要以下几个操作, 地址跳转,需要跳转到某一个位置开始执行 中断向量表需要偏移 需要关闭总中断 需要注意一点是需要关闭看门狗,不然在app中没喂狗会重启 关于这个升级方案,有以下几种做法, 将芯片的flash分为几个部分,一部分用来存储升级数据app2,一部分用来存储正常运行的代码区app1,当有升级任务来的时候,mcu将数据先放到app2的区域,并在升级手法完成时候对数据进行校验,考虑到嵌入式设备的算力,建议用md5或者crc16.比较无误后在某个安全地址写入标志位后,重启设备 设备上电后会检测到有app2存在,将其数据更替到app1的区域,更新完成后跳到app1(此时存储的是app2的代码) 程序正常运行后擦除标志位 当本身空间不够的情况下,使用25q80等外设,增加一些成本,但这样可以做到更高的灵活性,比如针对刚才的情况,假如说程序运行失败了,升级固件失败了或者更新的固件达不到要求,这个时候需要回复出厂设置了,那该怎么处理呢?可以先把出厂时候的程序放在外置flash,等到比如检测到按键长按,这个时候就可以回复出厂设置了,程序从外置flash中将数据加载到app1的区域,加载完成便跳转。