新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 海可枯石可爛,程序存儲的空間也會變

??煽菔蔂€,程序存儲的空間也會變

作者:馬步 時間:2019-11-08 來源:電子產(chǎn)品世界 收藏

在這個薄情的世界上,沒有什么東西是不會變的。

本文引用地址:http://www.butianyuan.cn/article/201911/406878.htm

曾經(jīng)的情比金堅,愛意綿綿,到如今一刀兩斷,愛情的小船翻了船,高調(diào)秀過的恩愛被無情地打臉。曾經(jīng)的義結(jié)金蘭,并肩向前,也架不住權(quán)力游戲?qū)γ篮眯撵`的摧殘,昨日推杯換盞,今日一拍兩散,說翻臉就翻臉,陰謀刺激堪稱政變。

1573198018308442.jpg

海也沒有枯,石也沒有爛,但是倔強(qiáng)的時間一往無前,將說好的永遠(yuǎn)打得凌亂。

謎一樣的人類就是這么靠不住,所以有人說:“人類靠得住,母豬會上樹”!

相比之下,外在的物質(zhì)世界就穩(wěn)當(dāng)多了。

古巴比倫王頒布了漢謨拉比法典,刻在黑色的玄武巖,距今已經(jīng)三千七百多年。杰倫說,“幾十個世紀(jì)后出土發(fā)現(xiàn),泥板上的字跡依然清晰可見。”

萬里長城跨越一座座高山,迎來送往過一次次的刀鋒雪劍,至今仍在接待全球各地笑意冉冉的旅行團(tuán)。金字塔歷經(jīng)五千年的歲月輪轉(zhuǎn),走過王朝更替的狼煙,依然在如血的殘陽中傲然矗立,默默無言。

但是,時代畢竟發(fā)展了。以前的時間很慢很慢,一封家書都要走上小半年,現(xiàn)在的時間變得很快很快,瞇一會兒就從塞北來到了江南。

所以,現(xiàn)如今,基本上所有的東西都打上了一個叫做“保質(zhì)期”的標(biāo)簽。在電子產(chǎn)品那里,有一個更為專業(yè)一點(diǎn)的術(shù)語,叫做“產(chǎn)品生命周期”。

1

電子產(chǎn)品的“生命周期”或者說壽命可長可短,作為一個物件,它當(dāng)然有被自然規(guī)律支配的客觀一面,同時,作為人類的一種工具,它還取決于人類主人隨性隨機(jī)的主觀意愿。

就拿手機(jī)來說吧,小青年們基本上一年一換,像我這種老朽也撐不過三年,從主觀層面上來說,平均壽命不過兩年。但是,從客觀上來說,電池不行了換電池,屏幕不好了換個屏,或者主觀思想停留在上個世紀(jì),不怕卡頓,不嫌難看,手機(jī)的壽命興許可以到十年。

手機(jī)用上十年當(dāng)然很恐怖,但是對于一般的嵌入式產(chǎn)品而言,十年卻是小菜一碟。試問你那開了十年、跑了二十萬公里的愛車?yán)?,有多少電子控制部件沒有更換過?

說起來,嵌入式產(chǎn)品是個耐用品,只要硬件不壞,軟件支持升級,用個十年八年實(shí)屬稀松平常。但是,天畢竟有不測風(fēng)云,有的時候,它就壞上那么一點(diǎn)點(diǎn),就這么一點(diǎn)點(diǎn),你就得跟它說再見。

比如,存儲空間的二進(jìn)制數(shù)據(jù)暴走,發(fā)生突變。

2

各位看官可能納了悶了,二進(jìn)制數(shù)據(jù)在存儲空間里呆得好好的,一直做著安靜的美男子,竟也會發(fā)生突變的么?

一般情況下自然是不會的。但是,二般情況下呢?

1573198063384851.jpg

就像向身體倍棒、看著能活到兩百歲的你推銷保險的那些人,他們經(jīng)常帶著對人生偶然性的深刻關(guān)切向你拋出直擊靈魂深處的一問:你能保證永遠(yuǎn)不生病嗎?

為了說明二進(jìn)制的暴走,照例,先給大家簡單地科下普。說句題外話,對于很多看官來說,灑家的科普都是“禿子頭上的虱子明擺著的事”,但是為了擴(kuò)大受眾,灑家還是要多言幾句。

“在很多嵌入式電子產(chǎn)品中,都是由微控制器里的Nor Flash存儲并運(yùn)行系統(tǒng)程序,Nor Flash的特點(diǎn)是Excute In Place,即不必把程序代碼讀到系統(tǒng)中,程序可以直接在Flash內(nèi)運(yùn)行。當(dāng)然,如果有需要,你也可以把它讀到中運(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ā)生混亂,帶來不可意料的問題?!?/em>

毋庸多言,程序數(shù)據(jù)的一致性對產(chǎn)品整個生命周期內(nèi)的功能穩(wěn)定性和數(shù)據(jù)安全性尤為重要,而電子產(chǎn)品的壽命一般都在10年以上,那是夜也長夢也多,做為產(chǎn)品設(shè)計人員,不能沒心沒肺地對程序數(shù)據(jù)可能的破壞視而不見。

所以,得設(shè)計一種方法,檢驗(yàn)電子產(chǎn)品程序Flash數(shù)據(jù)的一致性。

3

可是,程序數(shù)據(jù)那么多,不同產(chǎn)品的程序規(guī)模又不一致,怎么設(shè)計一個盡量通用的方法,驗(yàn)證程序空間數(shù)據(jù)的一致性呢?

要回答這個問題,先要搞明白程序數(shù)據(jù)長什么樣子。

大家都知道,現(xiàn)在的IDE把應(yīng)用程序編譯、鏈接后會生成幾種格式的程序數(shù)據(jù)文件,有elf格式、bin格式、s19格式。每種格式都有自己的歷史淵源和用武之地,灑家分享的方法里用到的是S19文件格式。

說到S19,那是孩子沒娘說來話長,但是咱們長話短說。

“S19的全稱為Motorola format for EEPROM programming,是摩托羅拉公司為程序和數(shù)據(jù)文件定義的一種可打印的ASCII形式編碼的s格式文件,以實(shí)現(xiàn)在不同的計算機(jī)平臺之間傳輸程序代碼和數(shù)據(jù)。

S19文件中的每一行數(shù)據(jù)為一條SRecord,以S0型SRecord開始,以S9型SRecord結(jié)束,以S2型SRecord存放Flash寫入地址、程序數(shù)據(jù)、程序數(shù)據(jù)長度信息。”

聰明的小伙伴是不是發(fā)現(xiàn)了什么?

1573198096216660.jpg

對滴,程序數(shù)據(jù)就在S19文件里的S2型SRecord里面,我們可以用一個PC端的軟件很容易地把程序數(shù)據(jù)的地址、內(nèi)容、長度解析出來。篇幅有限,解析方法就不再贅述,小伙伴們可以自行腦補(bǔ)。

解析出來以后呢?當(dāng)然是做某種運(yùn)算,用這個運(yùn)算結(jié)果來“標(biāo)識”程序數(shù)據(jù)了。

這個套路是不是很熟悉?想想編程的本質(zhì)是什么?就是數(shù)據(jù)+運(yùn)算呀!

運(yùn)算是一種模式pattern,你盡可以自由選擇,可以對數(shù)據(jù)累加求和,或者求異或同或,也可以進(jìn)行加密運(yùn)算,當(dāng)然,也可以選擇用得非常之廣的CRC32運(yùn)算。

4

妥了,程序數(shù)據(jù)解析出來了,標(biāo)識這個程序完整性的CRC32結(jié)果也出來了,這些信息提取工作都是在PC端進(jìn)行的,電子產(chǎn)品的MCU端怎么辦?

這就要借助一個叫做bootloader的東西了。

Bootloader在linux中用得非常普遍,它做好板級初始化后把數(shù)據(jù)導(dǎo)到里,然后加載操作系統(tǒng)。但是在這里的bootloader不是這種概念。

這里的bootloader是獨(dú)立于應(yīng)用程序的一段代碼,它用來接收應(yīng)用程序數(shù)據(jù),把程序數(shù)據(jù)寫入到相應(yīng)地址的地址處,然后把程序完整性標(biāo)識-CRC32結(jié)果存儲下來,標(biāo)記應(yīng)用程序的有效性。

有了bootloader之后,你就可以從PC端下載應(yīng)用程序了,這里指的是第一臺產(chǎn)品。換句話說,第一臺產(chǎn)品是不能用燒寫器來下載的,要通過專屬的協(xié)議來下載,后面的產(chǎn)品可以完全復(fù)制第一臺產(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)用 driver把程序數(shù)據(jù)存到程序地址空間中,說句題外話,S19文件實(shí)際包括好幾段,每個段都有多條SRecord,bootloader要把分段信息提取出來并存儲。

解析并存儲的過程中,bootloader同時對程序數(shù)據(jù)做著CRC32運(yùn)算,下載完程序后,上位機(jī)把CRC32結(jié)果發(fā)下來,兩相對照,兩者一致則表明應(yīng)用程序燒錄正確,然后在MCU內(nèi)部數(shù)據(jù)Flash中存儲校驗(yàn)信息,并將應(yīng)用程序有效標(biāo)志置為0x55,存入數(shù)據(jù)Flash中。

程序存好了,完整性標(biāo)識-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)用程序的初始化階段,讀取存儲在數(shù)據(jù)Flash中的校驗(yàn)信息,根據(jù)校驗(yàn)信息中的分段尺寸,讀取各個分段中的Flash數(shù)據(jù),進(jìn)行CRC32校驗(yàn),并將計算結(jié)果和校驗(yàn)信息中的CRC32校驗(yàn)值進(jìn)行比對,如果數(shù)據(jù)一致,表明程序Flash數(shù)據(jù)沒有損壞,系統(tǒng)正常運(yùn)行,如果不一致,表明程序Flash數(shù)據(jù)被損壞,進(jìn)入跛行模式。

5

掰扯了半天,里面的知識點(diǎn)不少,不知道各位看官有沒有完全理解。怎奈篇幅有限,不能鋪展太過。灑家的本意當(dāng)然是:“緊緊地握住您的手,熱情的話兒說不完。”

當(dāng)然,說一千道一萬,灑家只是想提醒諸位:??煽菔蔂€,程序存儲的空間也會變!



關(guān)鍵詞: RAM flash 程序

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉