一种经典的ECU Flash空间划分方法及软件更新过程

发布于 2022-04-19 17:03:48

引言
作为ECU软件程序和标定数据的存储方法,自从Flash存储技术被引入到MCU的设计之后,ECU软件更新的大门正式开启,Flash存储器结束了早期采用ROM存储技术时,要更新ECU功能只能将原有ECU从车上拆卸下来,使用新的ECU替换的历史,大大节约了成本。目前仍然是MCU上存储ECU软件程序和标定数据的主要载体。

经典的ECU Flash空间划分

为了缩短软件更新的时间,减少Flash的擦写次数而延长MCU使用寿命,行业领先的ECU供应商根据Flash存储器的特点,很早就设计了一种经典的ECU Flash空间划分方法,至今仍在广泛应用。如下图所示。
image.png

其中启动模块指MCU出厂时内部自带的程序(参考#Infineon Tricore系列芯片自带启动软件运行逻辑分析 ),它通常采用ROM存储,用户不可修改。我们重点看下后面的三个Flash片段。

  • 引导模块(A):包含了用户自己所定义的系统初始化操作、软件更新驱动及更新协议所定义的服务,即通常所说的Flash Bootloader;
  • 程序版本(B):ECU软件程序的主体,包括应用软件和基础软件生成的指令和常量,不包括标定数据,即Flash片段C;
  • 数据版本(C):ECU标定数据,这是一种特殊的常量,具体可参考“ECU测量与标定”相关介绍文章。

这种设计至少有以下三个优点:

  1. 程序版本可由引导模块进行更新,而无需依靠自己,有助于节省更新时所需的备份空间,降低控制器成本;
  2. 标定数据可单独更新,而无需和程序版本绑定在一起,大幅降低因标调数据变化而进行软件更新所需的时间,这对于实车开发阶段标定工程师的工作效率提升意义重大;
  3. 引导模块可独立实现软件更新功能,可方便的记录更新过程中出现的中断或异常,提升软件更新的可靠性;

包含引导模块自更新的软件更新全过程

针对程序版本和标定数据的ECU软件更新过程各家OEM都有自己的企标,业内很多人已相对比较熟悉,然而对于引导模块的自更新的方法通常介绍较少,而这一需求是软件更新时为保证可靠性所必须具备的,因此本文重点对这部分进行描述。

简单来说,在更新引导模块时,必须先对引导模块进行备份,将其复制到Flash中的另一块地址。这样,即使软件过程出现失败,也可重新启动软件更新过程,而不至于变成“砖头”。不过,这也意味着需要对启动模块进行重定向(Relocate),而这需要MCU芯片特性的支持,如Tricore系列芯片提供的ABM启动模式(参考#Infineon Tricore系列芯片自带启动软件运行逻辑分析 )。

下图展示了启动模块自更新的具体过程:
image.png

主要有三个步骤:

  • Step1: 将老的启动模块复制到空闲的RAM区域中
  • Step2: 从RAM中运行老的启动模块,并然后通过旧的启动模块将新的启动模块下载并写入到Flash片段C中的临时位置。这其中需要先擦除Flash片段C,并在写入新的启动模块后进行签名验证,确保启动模块的正确性和合法性。以上操作中任何地方发生异常导致软件更新过程中断时,Flash片段A中依然有效的老的引导模块可用于重新启动软件更新过程。
  • Step3:将Flash片段C中新的启动模块复制到片段A中。这其中需要先擦除Flash片段A,并在写入新的启动模块后进行签名验证。以上操作中任何地方发生异常导致软件更新过程中断时,Flash片段C中依然有效的新的引导模块可用于重新启动软件更新过程。

完成启动模块的自更新后,就可以对程序版本和标定数据进行更新了,这部分较为常规,不在赘述。

以上方法是本文参考资料《汽车软件工程》中介绍的,实际开发过程中,不一定完全照搬,可根据实际情况进行设计,比如可以先将旧的启动模块被分到Flash片段C,而不是备份新的启动模块,同样的,也不一定要备份到Flash片段C,备份到其它位置也未尝不可。

参考资料:

《汽车软件工程——原理,过程,方法,工具》,【德】,张聚等译

0 条评论

发布
问题