Bootloader程序Flash数据的一致性验证方法*

2019-01-17 03:11,,,,
单片机与嵌入式系统应用 2018年12期
关键词:诊断仪校验应用程序

,,,,

(1.齐鲁工业大学(山东省科学院),济南 250353;2.山东省科学院自动化研究所;3.山东省汽车电子技术重点实验室)

引 言

在中小型嵌入式系统形式的汽车电子产品中,一般由MCU内部的NOR Flash存储并运行系统程序,NOR Flash支持片内运行(Excute In Place),不必把代码读到系统RAM中。作为一种CMOS工艺的集成电路芯片,随着其工作频率越来越快、集成度越来越高、工艺尺寸越来越小,MCU及其内部Flash越来越容易受到辐射效应的影响[1]。辐射效应可能会造成NOR Flash数据的破坏,从而使得基于程序指令运行的嵌入式系统的应用逻辑发生混乱。汽车电子产品的寿命一般都在10年以上,NOR Flash的数据一致性对产品整个生命周期内的功能稳定性和数据安全性尤为重要,有必要研究一种方法来检验汽车电子产品程序Flash数据的一致性。

在中小型嵌入式系统中,MCU程序Flash地址空间被划分为若干扇区,扇区大小一般为16 KB或32 KB,有效程序数据一般被划分为若干个分段(Segment),分段位于扇区内,尺寸不固定,但都小于扇区长度,对于中小型嵌入式系统而言,几个分段就能够满足程序存储要求。

参考文献[2]提出了一种判断程序数据块写入是否正确的方法,在程序数据写入过程中提取标识信息,与程序数据块已知的验证信息进行对比,标识信息和验证信息一致表明数据块写入正确。这种方法仅用于判断烧写数据时是否发生错误,没有考虑系统整个生命周期内Flash存储数据发生破损的情况。参考文献[3]提出了一种对软件程序数据进行校验的方法,在软件程序加载阶段对程序各个模块进行哈希计算,将计算结果发回服务器端进行对比。这种方法不适合嵌入式系统程序Flash数据的校验,而且没有说明校验信息的生成方法。

本文设计了一种基于CAN总线的Bootloader,在产品生产阶段通过CAN总线下载并烧录应用程序,保证了下载数据的一致性,在产品运行阶段,对应用数据进行校验对比,保证了产品生命周期内的数据一致性[4]。

1 基于CAN总线的Bootloader

ISO 15765-3以ISO 14229-1定义的统一诊断服务(UDS)为基础,规范了基于CAN总线的诊断服务(UDS on CAN)[5],既可以用于汽车CAN节点的下线检测、故障诊断、功能配置,也可以用于汽车CAN节点的程序下载和软件升级。CAN节点中实现应用程序下载和升级的程序称为Bootloader,Bootloader响应诊断仪发起的UDS服务请求[6],接收诊断仪发送的应用程序指令数据,通过Flash驱动程序进行应用程序Flash地址空间的擦除和应用程序数据的烧写。

1.1 Flash地址空间

Bootloader地址空间和应用程序地址空间分配如图1所示。MCU的程序Flash同时存储Bootloader和应用程序,运行在Bootloader地址空间上的程序将应用程序数据烧写或更新到应用程序地址空间中[7]。图中应用程序Flash地址空间包含若干分段,以分段1、分段2、…、分段n表示,n为分段数量。各个分段的首地址和截止地址在应用程序的链接文件中设定,在实际应用中,由于函数指令数据不能跨段存储,因此,分段的实际尾地址小于或等于设定的截止地址。

图1 程序Flash地址空间分配

1.2 程序数据文件

应用程序编译、链接后生成程序数据文件,本方法选择大多数MCU都支持的S19文件。S19的全称为Motorola format for EEPROM programming,是摩托罗拉公司为程序和数据文件定义的一种可打印的ASCII形式编码的S格式文件,以实现在不同的计算机平台之间传输程序代码和数据[8]。

S19文件中的每一行数据为一条SRecord,以S0型SRecord开始,以S9型SRecord结束,以S2型SRecord存放Flash写入地址、程序数据、程序数据长度信息[9]。

1.3 应用程序分段

应用程序的每个分段都由多条S2型SRecord组成,分段内SRecord的Flash写入地址连续,每条SRecord的程序数据长度相等。记分段内第n条SRecord的Flash写入地址为Addr(n),第(n+1)条SRecord的Flash写入地址为Addr(n+1),SRecord的程序数据长度为Len_s,三者满足以下关系:

Addr(n+1)=Addr(n)+Len_s

(1)

假设该分段由m条SRecord组成,记分段首地址为Seg_s,分段尾地址为Seg_e,分段尺寸为Seg_len,则

Seg_s=Addr(1)

(2)

Seg_e=Addr(m)+Len_s-1

(3)

Seg_len=m*Len_s

(4)

Seg_s、Seg_e、Seg_len同时满足以下关系:

Seg_len=Seg_e-Seg_s+1

(5)

应用程序的链接文件指定了程序各个分段的首地址[10],它不会随应用程序的修改而变化,分段尾地址和分段尺寸可以通过编译链接生成的S19文件计算得出。

2 Flash数据一致性验证

本方法不仅可以检测产品生产下线阶段程序Flash数据的一致性,还能够检测产品整个生命周期内因电磁干扰、空间辐射等效应对Flash数据造成的损坏。Flash数据一致性验证的校验信息为各分段尺寸和对所有Flash数据按照地址递增的方式进行CRC32计算得出的校验值。

2.1 生产阶段一致性验证

在产品生产阶段,首先通过烧录器烧写Bootloader,然后通过诊断仪软件,基于UDS on CAN协议将应用程序下载到产品中,通过Bootloader进行烧写。下载应用程序Flash数据的过程中,诊断仪解析S19文件,计算出各分段的尺寸和应用程序Flash数据的CRC32校验值,并将之作为验证信息发送给Bootloader。Bootloader在烧写应用程序的过程中同样计算各分段尺寸和应用程序Flash数据的CRC32校验值,烧写完成后,Bootloader比较诊断仪计算的验证信息和自身计算的校验信息,两者一致,则表明应用程序烧录正确,然后在MCU内部数据Flash中存储校验信息,并将应用程序有效标志置为0x55,存入数据Flash中。

诊断仪根据S19文件中各分段内SRecord的Flash写入地址连续的特性计算分段尺寸,具体计算方法为:

① 读取分段首行SRecord,提取Flash写入地址和程序数据长度,分段首地址赋值为Flash写入地址,分段尾地址初始值赋值为Flash写入地址+程序数据长度-1。然后进入步骤②;

图3 Flash数据一致性验证

② 读取下一行SRecord,提取Flash写入地址和程序数据长度,如果Flash写入地址等于分段尾地址+1,进入步骤③,否则进入步骤④;

③ 将分段尾地址累加,累加值为程序数据长度,判断该行是否为S19文件最后一行,如果是,进入步骤⑤,否则,进入步骤②;

④ 按照式(5)计算分段尺寸,将该行视为下一个分段首行SRecord,进入步骤①;

⑤ 按照式(5)计算分段尺寸,退出分段尺寸的计算过程。

图2 分段尺寸计算

具体计算流程如图2所示。Bootloader根据Flash写入地址计算分段尺寸,Flash的烧写以页(Page)为单位,如果烧写地址属于分段i,将分段i尺寸累加,累加值为页长度。

2.2 运行阶段一致性验证

在产品运行阶段,上电后,MCU首先跳入Bootloader的地址空间运行,检查应用程序有效标志,如果读取到的有效标志为0x55,MCU跳入应用程序的地址空间运行。在应用程序的初始化阶段,读取存储在数据Flash中的校验信息,根据校验信息中的分段尺寸,读取各个分段中的Flash数据,进行CRC32校验,并将计算结果和校验信息中的CRC32校验值进行对比,如果数据一致,表明程序Flash数据没有损坏,系统正常运行,如果不一致,表明程序Flash数据被损坏,进入跛行模式。具体流程如图3所示。

结 语

猜你喜欢
诊断仪校验应用程序
日立EUB 8500E彩色超声诊断仪的维修与升级
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
炉温均匀性校验在铸锻企业的应用
马纯栋:维修技术人员应提高诊断仪的利用率
蔡鹏:优质诊断仪为现代汽修打开便利之门
大型电动机高阻抗差动保护稳定校验研究
基于加窗插值FFT的PMU校验方法
锅炉安全阀在线校验不确定度评定
光声成像宫颈癌诊断仪