??煽菔蔂€,程序存儲的空間也會變
在這個薄情的世界上,沒有什么東西是不會變的。
本文引用地址:http://www.j9360.com/article/201911/406878.htm曾經的情比金堅,愛意綿綿,到如今一刀兩斷,愛情的小船翻了船,高調秀過的恩愛被無情地打臉。曾經的義結金蘭,并肩向前,也架不住權力游戲對美好心靈的摧殘,昨日推杯換盞,今日一拍兩散,說翻臉就翻臉,陰謀刺激堪稱政變。
海也沒有枯,石也沒有爛,但是倔強的時間一往無前,將說好的永遠打得凌亂。
謎一樣的人類就是這么靠不住,所以有人說:“人類靠得住,母豬會上樹”!
相比之下,外在的物質世界就穩當多了。
古巴比倫王頒布了漢謨拉比法典,刻在黑色的玄武巖,距今已經三千七百多年。杰倫說,“幾十個世紀后出土發現,泥板上的字跡依然清晰可見?!?/p>
萬里長城跨越一座座高山,迎來送往過一次次的刀鋒雪劍,至今仍在接待全球各地笑意冉冉的旅行團。金字塔歷經五千年的歲月輪轉,走過王朝更替的狼煙,依然在如血的殘陽中傲然矗立,默默無言。
但是,時代畢竟發展了。以前的時間很慢很慢,一封家書都要走上小半年,現在的時間變得很快很快,瞇一會兒就從塞北來到了江南。
所以,現如今,基本上所有的東西都打上了一個叫做“保質期”的標簽。在電子產品那里,有一個更為專業一點的術語,叫做“產品生命周期”。
1
電子產品的“生命周期”或者說壽命可長可短,作為一個物件,它當然有被自然規律支配的客觀一面,同時,作為人類的一種工具,它還取決于人類主人隨性隨機的主觀意愿。
就拿手機來說吧,小青年們基本上一年一換,像我這種老朽也撐不過三年,從主觀層面上來說,平均壽命不過兩年。但是,從客觀上來說,電池不行了換電池,屏幕不好了換個屏,或者主觀思想停留在上個世紀,不怕卡頓,不嫌難看,手機的壽命興許可以到十年。
手機用上十年當然很恐怖,但是對于一般的嵌入式產品而言,十年卻是小菜一碟。試問你那開了十年、跑了二十萬公里的愛車里,有多少電子控制部件沒有更換過?
說起來,嵌入式產品是個耐用品,只要硬件不壞,軟件支持升級,用個十年八年實屬稀松平常。但是,天畢竟有不測風云,有的時候,它就壞上那么一點點,就這么一點點,你就得跟它說再見。
比如,程序存儲空間的二進制數據暴走,發生突變。
2
各位看官可能納了悶了,二進制數據在程序存儲空間里呆得好好的,一直做著安靜的美男子,竟也會發生突變的么?
一般情況下自然是不會的。但是,二般情況下呢?
就像向身體倍棒、看著能活到兩百歲的你推銷保險的那些人,他們經常帶著對人生偶然性的深刻關切向你拋出直擊靈魂深處的一問:你能保證永遠不生病嗎?
為了說明二進制程序的暴走,照例,先給大家簡單地科下普。說句題外話,對于很多看官來說,灑家的科普都是“禿子頭上的虱子明擺著的事”,但是為了擴大受眾,灑家還是要多言幾句。
“在很多嵌入式電子產品中,都是由微控制器里的Nor Flash存儲并運行系統程序,Nor Flash的特點是Excute In Place,即不必把程序代碼讀到系統RAM中,程序可以直接在Flash內運行。當然,如果有需要,你也可以把它讀到RAM中運行。微控制器及其片內的Nor Flash是基于CMOS工藝的集成電路芯片,隨著工作頻率越來越快、集成度越來越高、工藝尺寸越來越小,微控制器及其內部Flash越來越容易受到輻射效應的影響。輻射效應可能造成Nor Flash數據的破壞,從而使得基于程序指令運行的嵌入式系統的應用邏輯發生混亂,帶來不可意料的問題。”
毋庸多言,程序數據的一致性對產品整個生命周期內的功能穩定性和數據安全性尤為重要,而電子產品的壽命一般都在10年以上,那是夜也長夢也多,做為產品設計人員,不能沒心沒肺地對程序數據可能的破壞視而不見。
所以,得設計一種方法,檢驗電子產品程序Flash數據的一致性。
3
可是,程序數據那么多,不同產品的程序規模又不一致,怎么設計一個盡量通用的方法,驗證程序空間數據的一致性呢?
要回答這個問題,先要搞明白程序數據長什么樣子。
大家都知道,現在的IDE把應用程序編譯、鏈接后會生成幾種格式的程序數據文件,有elf格式、bin格式、s19格式。每種格式都有自己的歷史淵源和用武之地,灑家分享的方法里用到的是S19文件格式。
說到S19,那是孩子沒娘說來話長,但是咱們長話短說。
“S19的全稱為Motorola format for EEPROM programming,是摩托羅拉公司為程序和數據文件定義的一種可打印的ASCII形式編碼的s格式文件,以實現在不同的計算機平臺之間傳輸程序代碼和數據。
S19文件中的每一行數據為一條SRecord,以S0型SRecord開始,以S9型SRecord結束,以S2型SRecord存放Flash寫入地址、程序數據、程序數據長度信息?!?/p>
聰明的小伙伴是不是發現了什么?
對滴,程序數據就在S19文件里的S2型SRecord里面,我們可以用一個PC端的軟件很容易地把程序數據的地址、內容、長度解析出來。篇幅有限,解析方法就不再贅述,小伙伴們可以自行腦補。
解析出來以后呢?當然是做某種運算,用這個運算結果來“標識”程序數據了。
這個套路是不是很熟悉?想想編程的本質是什么?就是數據+運算呀!
運算是一種模式pattern,你盡可以自由選擇,可以對數據累加求和,或者求異或同或,也可以進行加密運算,當然,也可以選擇用得非常之廣的CRC32運算。
4
妥了,程序數據解析出來了,標識這個程序完整性的CRC32結果也出來了,這些信息提取工作都是在PC端進行的,電子產品的MCU端怎么辦?
這就要借助一個叫做bootloader的東西了。
Bootloader在linux中用得非常普遍,它做好板級初始化后把flash數據導到RAM里,然后加載操作系統。但是在這里的bootloader不是這種概念。
這里的bootloader是獨立于應用程序的一段代碼,它用來接收應用程序數據,把程序數據寫入到相應地址的flash地址處,然后把程序完整性標識-CRC32結果存儲下來,標記應用程序的有效性。
有了bootloader之后,你就可以從PC端下載應用程序了,這里指的是第一臺產品。換句話說,第一臺產品是不能用燒寫器來下載的,要通過專屬的協議來下載,后面的產品可以完全復制第一臺產品里的程序數據用燒寫器下載。
什么樣的專屬協議呢?這就要看你的產品上有什么接口了。RS232-RS485-CAN都行,總之,在下載應用程序Flash數據的過程中,上位機解析S19文件,把一條條SRecord發給下位機,bootloader解析出來地址和數據,調用flash driver把程序數據存到程序地址空間中,說句題外話,S19文件實際包括好幾段,每個段都有多條SRecord,bootloader要把分段信息提取出來并存儲。
解析并存儲的過程中,bootloader同時對程序數據做著CRC32運算,下載完程序后,上位機把CRC32結果發下來,兩相對照,兩者一致則表明應用程序燒錄正確,然后在MCU內部數據Flash中存儲校驗信息,并將應用程序有效標志置為0x55,存入數據Flash中。
程序存好了,完整性標識-CRC32運算結果也存好了,應用程序標志為有效了,接下來,就萬事俱備只欠東風了-MCU上電后要做程序一致性驗證了!
在產品運行階段,上電后,MCU首先跳入Bootloader的地址空間運行,檢查應用程序有效標志,如果讀取到的有效標志為0x55,MCU跳入應用程序的地址空間運行。
在應用程序的初始化階段,讀取存儲在數據Flash中的校驗信息,根據校驗信息中的分段尺寸,讀取各個分段中的Flash數據,進行CRC32校驗,并將計算結果和校驗信息中的CRC32校驗值進行比對,如果數據一致,表明程序Flash數據沒有損壞,系統正常運行,如果不一致,表明程序Flash數據被損壞,進入跛行模式。
5
掰扯了半天,里面的知識點不少,不知道各位看官有沒有完全理解。怎奈篇幅有限,不能鋪展太過。灑家的本意當然是:“緊緊地握住您的手,熱情的話兒說不完?!?/p>
當然,說一千道一萬,灑家只是想提醒諸位:??煽菔蔂€,程序存儲的空間也會變!
評論