本文主要介绍不同的Boot-App升级架构。
每个tire1或者OEM都会有自己的一套或者几套刷写方案,可能方案不尽相同。简单来说,就是如何让ECU能够更新App或者Boot。实现这种功能的方式有很多种,开发初期即根据芯片内存以及刷写需求等因素设计刷写方案。
下文中App简称为A,Boot简称为B。
1. 最简单的BA架构
最简单的架构如下图所示,一个boot分区,一个app分区,支持boot跳转app,支持boot更新app,暂且称为BA架构模式。若在更新app过程中意外更新失败,那么ECU会因为app被擦除而无法正常工作。
BA架构模式的工作原理如下图:
上图描述了BA架构中ECU的上电启动时序。在APP模式下,使⽤了两种不同的诊断会话模式:默认会话和扩展会话。在Boot模式下,使⽤了三种不同的诊断会话模式:默认会话,扩展会话和编程会话 。
如果ECU收到刷写指令10 02,将外部重编程请求标志设置为valid,并执⾏ECU 复位。 上电复位后,ECU⾸先进入Boot,若检查外部重编程请求标志位为valid,那么停留在Boot的编程会话模式中,等待更新App软件,将外部重编程请求标志位置为Invalid。
上电复位后,ECU⾸先进入Boot,若检查外部重编程请求标志位为Invalid,则检查App有效标志位: 若App有效标志位是valid,则程序跳转到App区域运行;若App有效标志位是Invalid,ECU停留在Boot下。
2. BAA架构/BAA'架构
一般车厂都要求ECU支持OTA功能,但是BA架构存在更新失败App无法恢复的问题,为了解决这个问题,产生了BAA架构,BAA'架构。
BAA架构
App既能运行在A分区(图中bank A),也能运行在B分区(图中bank B),软件中通过APP Slot分区有效标志来判断当前激活的有效分区。刷写时软件会下载到非激活分区。下载并校验成功后再切换分区。
上电复位后,ECU⾸先进入Boot,若检查外部重编程请求标志位为Invalid,则继续检查APP Slot分区有效标志,通过APP Slot标志判断当前激活的分区: 若App A bank激活,则程序跳转到App A bank运行;若App B bank激活,则程序跳转到App B bank运行。
如果ECU在A bank运行时收到刷写指令10 02,则将外部重编程请求标志设置为valid,并执⾏ECU 复位。 ECU复位后,⾸先进入Boot,检查外部重编程请求标志位为valid,则停留在Boot等待更新程序。此时将软件成功写入App B bank并设置App B bank为有效分区。当ECU再次复位时通过检查APP Slot分区有效标志即可切成功换到App B bank运行。如果一个bank更新软件失败,ECU仍能在另一个bank运行。
BAA'架构
这种架构,App只能运行在一个分区(图中的bank A),无法运行在App备份区。ECU在boot中更新软件时,会先将软件写入到App备份区。等待App备份区软件下载完成并校验通过,再将App备份区的程序copy到App可运行分区。
如果下载过程中意外中断也不会影响到App可运行分区。
如果检测到App备份区无效,可以将App可运行分区 copy到备份区。
如果检测到App可运行分区无效,可以将App备份区 copy到可运行分区。
总之,两个区域互相备份,保证App不会意外丢失。
3. 支持更新boot升级的架构
如果在开发过程中,由于boot存在bug或者boot需求变更,导致ECU需要更新boot。那么牛马们该如何实现boot的刷写更新呢 ?
首先引入preboot的概念,⽤于引导Boot启动升级的最底层程序,不会运⾏重编程流程。
PreBoot-BBA架构
这种架构专门为boot增加了一个分区用于boot更新。boot下载失败还能恢复,App下载中断就无法恢复了......