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