,,,,
(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]。
ISO 15765-3以ISO 14229-1定義的統一診斷服務(UDS)為基礎,規范了基于CAN總線的診斷服務(UDS on CAN)[5],既可以用于汽車CAN節點的下線檢測、故障診斷、功能配置,也可以用于汽車CAN節點的程序下載和軟件升級。CAN節點中實現應用程序下載和升級的程序稱為Bootloader,Bootloader響應診斷儀發起的UDS服務請求[6],接收診斷儀發送的應用程序指令數據,通過Flash驅動程序進行應用程序Flash地址空間的擦除和應用程序數據的燒寫。
Bootloader地址空間和應用程序地址空間分配如圖1所示。MCU的程序Flash同時存儲Bootloader和應用程序,運行在Bootloader地址空間上的程序將應用程序數據燒寫或更新到應用程序地址空間中[7]。圖中應用程序Flash地址空間包含若干分段,以分段1、分段2、…、分段n表示,n為分段數量。各個分段的首地址和截止地址在應用程序的鏈接文件中設定,在實際應用中,由于函數指令數據不能跨段存儲,因此,分段的實際尾地址小于或等于設定的截止地址。

圖1 程序Flash地址空間分配
應用程序編譯、鏈接后生成程序數據文件,本方法選擇大多數MCU都支持的S19文件。S19的全稱為Motorola format for EEPROM programming,是摩托羅拉公司為程序和數據文件定義的一種可打印的ASCII形式編碼的S格式文件,以實現在不同的計算機平臺之間傳輸程序代碼和數據[8]。
S19文件中的每一行數據為一條SRecord,以S0型SRecord開始,以S9型SRecord結束,以S2型SRecord存放Flash寫入地址、程序數據、程序數據長度信息[9]。
應用程序的每個分段都由多條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文件計算得出。
本方法不僅可以檢測產品生產下線階段程序Flash數據的一致性,還能夠檢測產品整個生命周期內因電磁干擾、空間輻射等效應對Flash數據造成的損壞。Flash數據一致性驗證的校驗信息為各分段尺寸和對所有Flash數據按照地址遞增的方式進行CRC32計算得出的校驗值。
在產品生產階段,首先通過燒錄器燒寫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尺寸累加,累加值為頁長度。
在產品運行階段,上電后,MCU首先跳入Bootloader的地址空間運行,檢查應用程序有效標志,如果讀取到的有效標志為0x55,MCU跳入應用程序的地址空間運行。在應用程序的初始化階段,讀取存儲在數據Flash中的校驗信息,根據校驗信息中的分段尺寸,讀取各個分段中的Flash數據,進行CRC32校驗,并將計算結果和校驗信息中的CRC32校驗值進行對比,如果數據一致,表明程序Flash數據沒有損壞,系統正常運行,如果不一致,表明程序Flash數據被損壞,進入跛行模式。具體流程如圖3所示。
