随着特斯拉将OTA的功能引入到汽车中,汽车行业发生了新的范式革命,智能汽车相比传统汽车成为新物种的存在,OTA不仅是汽车不断成长的“生命通道”,更是成为了车企新商业模式的“黄金通道”。
OTA到底对控制器做了什么?
现如今整车OTA是一个非常热门的话题,无论是新势力还是传统主机厂都极力宣传自己的OTA能力,但目前市面上所有的OTA都是不够彻底的OTA,我们称之为半OTA。
当厂家说OTA时,他在说什么?
OTA:空中升级(ON THE AIR)是通过无线通讯网络,实现对汽车控制器MCU里的软件进行更新。
这里面有一个许多人搞混淆的问题,OTA更新MCU哪一部分的软件?要想回答这个问题需要我们首先得知道汽车控制器是什么?
汽车控制器本质上就是一个嵌入式系统的单片机MCU,可以完整实现特定的功能。
嵌入式单片机MCU的最大特点是,它的硬件结构会根据实现功能的差异而进行裁剪。
与强大的个人计算机(PC)不同的是,结构简单功能单一的控制器单片机的内部软件代码有两大类,一部分是操作系统、用户数据、标定数据等代码,统称为应用程序(App),另一部分则是运行引导程序(Bootloader)。
Bootloader是一段独立的代码(这段Boot代码一般是出厂预置,或使用编程器烧录的,通常只有1k或4k,占用一块独立的Block,当系统上电之后,Bootloader可以进行关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等一系列初始化动作,然后再将操作系统内核复制到内存中运行。
简单地说,Bootloader就是一小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核进入工作。与之对应的是PC中的BIOS。
由于Bootloader保存在Flash的首地址,MCU上电后,默认从Flash开始的第一个读取栈指针,第二个字就是复位中断的入口,并根据该指针进度复位处理函数中执行相应的函数,由于中断向量表1寻找复位中断处理函数指向Bootloader,所以必然首先进入Bootloader程序中执行,进行初始化设置,然后再进入下一个中断向量表2中执行APP程序的复位中断处理函数。
Bootloader和APP应用程序在嵌入式存储器中的位置如下:
由于我们所有的操作系统和用户数据都放在APP程序中,通过更改这部分数据可以优化控制器的使用体验,所以许多汽车厂家所谓对MCU进行固件更新(FOTA)实际上就是对MCU内存中的APP存储区域进行刷写。
如何对存储区进行刷写?
刷写(在线编程)目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。
ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。ISP和IAP很相似,都是不需要把芯片从板子上拔出来,就达到了用PC-MCU的编程接口(JTAG、串口、双绞线、SPI等)搞定新版本的升级目的,但是又有着很大不同。
IAP技术从结构上将Flash存储器中APP程序运行区映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。支持在应用编程(IAP)的芯片会将内存分3个程序区:1、引导程序区Bootloader,2、APP程序运行区,3、下载区。芯片通过串口接收到下载命令,进入引导区运行引导程序,在引导程序下将new code内容下载到下载区,下载完毕并校验通过后,Bootloader控制擦除原程序并将下载区内容复制到2区,运行复位程序,则IAP完成。
IAP优势:在不改变引导程序区的前提下,对APP程序运行区进行编程,从而优化应用层的软件体验。
为了方便实现IAP刷写,ISO发布了统一诊断标准UDS(ISO14229),用于诊断仪(客户端)和MCU(服务器)之间的会话控制、安全访问、例程控制、DTC读取,MCU软件刷写(软件下载)等服务。
其中在编程会话模式下(Programming Session),先通过$31 01 FF 00指令将Flash中的APP数据擦除,再通过$34+$36服务指令可将软件数据写入到单片机的RAM中,再通过$31 01 02服务指令对内存进行确认,最后重新启动MCU就完成了刷写。
需要指出的是在数据传输层面,根据传输协议的不同分为基于控制局域网的诊断DoCAN(ISO15765)或者基于以太网的诊断DoIP(ISO13400)。
目前车辆的OTA的大致流程是:
1、云端服务器TSP通过无线通讯协议(DDS/MQTT)将要刷新的软件发送给车辆网联模块T-BOX;
2、车辆网联模块T-BOX通过CAN或者Ehe.NET传输协议发给车辆网关GATEWAY;
3、将车辆网关GATEWAY作为上位机,通过UDS诊断服务对MCU进行IAP刷写;
4、刷写完成后,重新启动,MCU运行新的APP软件。
而ISP一般是通过单片机专用的串行编程接口直接对单片机内部的Flash存储器进行编程。也就是将PC编译完成的MCU可运行的二进制代码文件通过寻址直接编程入MCU内相应的程序存储器中。ISP刷写不仅可以对APP程序进行在线编程,还可以对引导程序区Bootloader进行在线编程。
ISP刷写的硬线连接框图
由于不同MCU的Bootloader支持的刷写方式以及MCU支持的通讯协议不同,导致ISP刷写工具千花百样。比如飞思卡尔嵌入式单片机常用P&E的Multilink刷写工具,一端通过USB串口与上位机连接,一端通过SWD串口与单片机通讯,进入BDM模式刷写。
P&G Mutilink刷写工具
OTA的短板是无法对控制器的Bootloader进行刷写
嵌入式单片机的最大特点是,它的硬件结构会根据实现功能的差异而进行裁剪。
Bootloader的实现严重依赖于具体硬件,在嵌入式系统中硬件配置千差万别,即使是相同的CPU,它的外设(比如Flash)也可能不同,所以不可能有一个Bootloader支持所有的CPU、所有的电路板。即使是支持CPU架构比较多的U-Boot,也不是直接可以使用的,需要进行移植。
目前整车上的控制器是由不同的供应商来提供,每个供应商都会根据自己控制器的功能特点,选择最合适的嵌入式系统硬件。在产品的开发阶段,工程师使用专用烧录工具对MCU的程序进行烧录;然而到了产品的生产阶段或者售后阶段,进行应用程序烧录或升级操作的往往是生产线上的工人,他们不易掌握程序烧录器的使用方法,贸然对Bootloader刷写可能会造成MCU程序崩溃。因此,在控制器开发完成以后,往往会把控制器的JTAG调试口封住以防软件被窥视。
在OTA中,由于每个控制器的Bootloader不同,上位机(一般是网关)是不支持对所有控制器的Bootloader进行刷新的,只能基于CAN或者Ethernet通讯,使用UDS协议对MCU中的APP软件进行刷写。
例如在Bootloader程序中,要求在编程模式下支持UDS的$14清除故障码的服务,就必须修改Bootloader程序,通过OTA就无法实现此功能。
未来,随着域控制器或者中央控制器的发展,汽车控制器数量会减少,硬件配置则向个人电脑PC看齐,如果整车MCU能像PC那样使用一套标准的配置主板,那么通过OTA对Bootloader进行刷写有望成为现实!