Bootloader基礎(chǔ):讓你的嵌入式設(shè)計(jì)具有前瞻性
掃描二維碼
隨時(shí)隨地手機(jī)看文章
世界上很少有什么項(xiàng)目能給嵌入式固件開發(fā)人員提供足夠多的開發(fā)時(shí)間。事實(shí)上,嵌入式固件開發(fā)就好像氣體一樣,會(huì)占據(jù)它所在的整個(gè)空間。而這往往意味著項(xiàng)目結(jié)束階段的測試和質(zhì)量評估承受壓力,進(jìn)而提高風(fēng)險(xiǎn)。項(xiàng)目經(jīng)理為如何跟上項(xiàng)目計(jì)劃進(jìn)度發(fā)愁,嵌入式設(shè)計(jì)人員和測試工程師也面臨開發(fā)時(shí)間和測試覆蓋質(zhì)量之間的矛盾。要是所有人都能實(shí)現(xiàn)自己的目標(biāo)該多好。要是硬件設(shè)計(jì)能在代碼完成前就進(jìn)一步推進(jìn)該多好。要是固件測試在生產(chǎn)構(gòu)造階段也能繼續(xù)進(jìn)行該多好。要是整個(gè)團(tuán)隊(duì)都能明確如果設(shè)計(jì)情況不好,他們總是能夠通過現(xiàn)場升級實(shí)現(xiàn)重大修改該多好。這樣,所有人晚上都能睡個(gè)安穩(wěn)覺,而通過適當(dāng)利用嵌入式引導(dǎo)加載程序(bootloader),這完全有可能實(shí)現(xiàn)。
首先我們先明確一下有關(guān)術(shù)語。引導(dǎo)加載程序是一段常駐微處理器中的代碼,有時(shí)也位于只讀存儲(chǔ)器(ROM)中(在工廠制造時(shí)編寫)或者位于板載閃存存儲(chǔ)器的預(yù)留區(qū)域。可加載引導(dǎo)代碼能載入內(nèi)存并作為正常工作期間在微處理器上運(yùn)行的主應(yīng)用代碼。可加載引導(dǎo)代碼可通過引導(dǎo)加載程序更新。產(chǎn)品固件的現(xiàn)場升級正是通過板載引導(dǎo)加載程序?qū)崿F(xiàn)的。
那么,什么是引導(dǎo)加載程序呢?引導(dǎo)加載程序就是位于給定微控制器上受保護(hù)程序存儲(chǔ)器中的一部分代碼。它通常是加電啟動(dòng)或重啟后運(yùn)行的第一個(gè)軟件,往往針對具體處理器和電路板。引導(dǎo)加載程序可視為一種“笨”代碼,因?yàn)樗⒉涣私庑枰獔?zhí)行什么應(yīng)用,甚至也不了解器件功能是什么。引導(dǎo)加載程序?qū)iT用來理解如果通過任意數(shù)量的通訊協(xié)議與外部進(jìn)行通訊(這些協(xié)議包括UART、I2C、SPI、CAN、以太網(wǎng)等),也可用來了解微控制器的存儲(chǔ)器映射。引導(dǎo)加載程序在發(fā)揮作用時(shí),負(fù)責(zé)與外部或主機(jī)進(jìn)行通訊;讀取主機(jī)發(fā)送的數(shù)據(jù)文件;更新它所在的微處理器,從而運(yùn)行所提供的最新應(yīng)用代碼。
圖1:典型的嵌入式硬件架構(gòu)。
引導(dǎo)加載程序可以在接收到人工操作員(也就是手動(dòng)重啟)或外設(shè)設(shè)備(即系統(tǒng)主機(jī))的啟動(dòng)信號后開始工作,視具體嵌入式系統(tǒng)而定。引導(dǎo)加載程序信號首先確認(rèn)引導(dǎo)加載程序本身是否有效,明確當(dāng)前器件應(yīng)用是否有效,與主機(jī)通訊并載入提交的新應(yīng)用,隨后根據(jù)指令執(zhí)行應(yīng)用閃存重寫。大多數(shù)現(xiàn)代微控制器都能對自己的閃存重新編程。典型的引導(dǎo)加載程序在幾微秒內(nèi)就能完成這一工作。不過,存儲(chǔ)器尺寸較大情況下,該時(shí)間就會(huì)大幅延長,有時(shí)甚至要花幾秒鐘才能完成一次更新。一旦完成加載引導(dǎo),引導(dǎo)加載程序必須確認(rèn)加載引導(dǎo)鏡像,并將控制權(quán)交給加載引導(dǎo)代碼。用于中斷矢量的指針也必須進(jìn)行設(shè)置。典型情況下,引導(dǎo)加載程序?qū)⑦M(jìn)行軟重啟,以便讓應(yīng)用掌握控制。圖2給出了引導(dǎo)加載程序的邏輯流程實(shí)例。
圖2:引導(dǎo)加載程序的邏輯流程。
由于引導(dǎo)加載程序是在制造過程中被編程到器件中,并且不是器件工作所必需的首要應(yīng)用,因此實(shí)際上可以把它看作是“開銷”代碼。項(xiàng)目經(jīng)理和嵌入式設(shè)計(jì)人員必須要考慮引導(dǎo)加載程序所帶來的風(fēng)險(xiǎn)保護(hù)功能與其所占用的代碼空間相比是否值得。由于這段代碼要占用空間,許多設(shè)計(jì)人員需要盡可能減小引導(dǎo)加載程序的存儲(chǔ)器占用量,從而將用于應(yīng)用代碼的存儲(chǔ)器空間實(shí)現(xiàn)最大化。引導(dǎo)加載程序至少應(yīng)提供:通訊通道、擦寫并重新編程閃存存儲(chǔ)器的方法以及確認(rèn)和執(zhí)行新應(yīng)用代碼的方法。
此外,引導(dǎo)加載程序應(yīng)該能夠檢測、報(bào)告和處理加載引導(dǎo)操作過程中出現(xiàn)的錯(cuò)誤,如斷電、通訊損失、閃存寫入錯(cuò)誤等。一般通過存儲(chǔ)應(yīng)用的校驗(yàn)和或循環(huán)冗余代碼(CRC)來實(shí)現(xiàn)閃存錯(cuò)誤保護(hù)功能。加載引導(dǎo)操作開始后,這些位就會(huì)被清空。如果新的應(yīng)用成功下載并安裝,校驗(yàn)和就會(huì)被更新。如果下載過程中出錯(cuò)(通訊損失、斷電等),那么引導(dǎo)加載程序會(huì)檢測無效的校驗(yàn)位,且不會(huì)開始應(yīng)用操作,而是與主機(jī)通訊,等待有效的加載引導(dǎo)操作。