久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

超完整,講解單片機(jī)的BootLoader

 新用戶62592529 2023-08-20 發(fā)布于四川

對于一個復(fù)雜的單片機(jī)項目來說,,有一個 BootLoader(以下簡稱BL)是非常重要的,。它可以使得你的應(yīng)用程序代碼維護(hù)和升級更加便捷。

本篇文章,,帶你了解為什么要設(shè)計 Bootloader,,以及如何設(shè)計 Bootloader。爭取做到知其然,、知其所以然,。

通過對 BL 進(jìn)行詳細(xì)的講解,希望讓大家可以體會到它的重要性,。

1,、燒錄方式的更新迭代

古老的燒錄方式
單片機(jī)誕生于20世紀(jì)80年代,以 51 為代表開始廣泛應(yīng)用于工業(yè)控制,、家電等很多行業(yè)中,。起初對于單片機(jī)的燒錄,也就是將可執(zhí)行的程序?qū)懭氲狡鋬?nèi)部的ROM中,,不是一件容易的事情,,而且成本不低,因為需要依賴于專門的燒錄設(shè)備,。由于受到半導(dǎo)體技術(shù)與工藝的限制,,對于ROM的燒寫大多需要高壓,。這種境況一直持續(xù)到2000年左右,如圖所示,。

圖片

ISP與ICP燒錄方式
隨著低壓電可擦寫ROM的成熟,,單片機(jī)開始集成可通過數(shù)字電平直接讀寫的存儲介質(zhì)。
其最大的優(yōu)勢在于可實現(xiàn)在系統(tǒng)或在電路直接燒錄程序,,而無需像以前一樣把單片機(jī)芯片從電路中拿出來,,放到編程器上,這種燒錄方式就是 ISP(In System Programming) 或 ICP(In Circuit Programming),,如圖所示,。

圖片

有人問過這樣一個問題:“ISP和ICP我都聽說過,都說是可以在電路板上直接燒錄程序,,而無需拿下芯片,那ISP和ICP有什么區(qū)別,?”
從廣義上來說,,兩者沒有區(qū)別,平時我們把其意義混淆也毫無問題,。非要刨根問底的話,,那可以這樣來理解:
ISP要求單片機(jī)中駐留有專門的程序,用以與上位機(jī)進(jìn)行通信,,接收固件數(shù)據(jù)并燒錄到自身的ROM中,,很顯然ISP的單片機(jī)是需要可運(yùn)行的,即要具備基本的最小系統(tǒng)電路(時鐘和復(fù)位),。
而 ICP 可以理解為 MCU 就是一塊可供外部讀寫的存儲電路,,它不需要預(yù)置任何程序,也不需要單片機(jī)芯片處于可運(yùn)行的狀態(tài),。
支持 ISP 或 ICP 的芯片,,以AT89S51最為經(jīng)典,當(dāng)時從 AT89C51 換成 S51,,多少人因此不再依賴燒錄器而大呼爽哉,。這種并口下載線非常流行,如圖3.3,,網(wǎng)上還有各種ISP小軟件,,可以說它降低了很多人入門單片機(jī)的門檻,讓單片機(jī)變得喜聞樂見,。一臺電腦,、一個S51最小系統(tǒng)板、一條并口ISP下載線,,齊了,!

圖片

更方便的ISP燒錄方式

串口ISP
后來我們發(fā)現(xiàn)帶有并口的電腦越來越少。那是在2005年前后,STC單片機(jī)開始大量出現(xiàn),,在功能上其實與S51相差無幾,,甚至比同期的一些高端51單片機(jī)還要遜色。但是它憑借一個優(yōu)勢讓人們對它愛不釋手,,進(jìn)一步降低了單片機(jī)的學(xué)習(xí)門檻,。
這個優(yōu)勢就是--串口ISP,這是真正意義上的 ISP,,如圖所示,。

圖片

圖片

再后來,9針串口都很少見了,,只有USB,。這促使一個燒錄和調(diào)試神器炙手可熱 -- USB TTL串口。這下232轉(zhuǎn)換芯片省掉了,,直接通過USB進(jìn)行燒錄,。這種方式造福了無數(shù)的單片機(jī)學(xué)習(xí)者和工程師。
多年來,,在串口與單片機(jī)的交互上,,我動了很多腦筋,這也是我樂于開發(fā) Bootloader 的一個原因,。我希望“USB串口在手,,一切全有!”
STC 并不是第一個使用串口 ISP 燒錄程序的,,但它是最成功和最深入人心的,。與之同期的很多單片機(jī),包括時至今日仍然應(yīng)用最廣泛的 STM32 全系列也都支持了串口 ISP,,它成為了一種標(biāo)配的,、非常普遍的程序燒錄手段。
各種USB ISP
串口ISP固然方便,,但是下載速度是它的硬傷,,當(dāng)固件體積比較大的時候,比如一些大型嵌入式項目的固件動輒幾百K,,甚至幾M,,再用串口ISP就未免太慢了。所以一些單片機(jī)配有專門的USB ISP下載器,。以下列舉幾種比較主流單片機(jī)及其USB ISP下載器,。
1) AVR
AVR 單片機(jī)曾經(jīng)盛極一時,但經(jīng)歷了 2016 年的缺芯風(fēng)波之后,,加之 STM32 的沖擊,,開始變得一蹶不振,,鮮有人用了。與之配套的USB ISP下載器非常多樣,,有些是官方發(fā)布的,,更多的是愛好者開源項目的成果,如圖所示,。

圖片

2) C8051F

圖片

3) MSP430

圖片

我們會發(fā)現(xiàn),,一個具體良好生態(tài)的主流單片機(jī),一定有配套的高效便捷的燒錄下載工具,??梢娨环N好的燒錄方式,對單片機(jī)開發(fā)是多么重要,。
不論是串口 ISP 還是各種專用的 ISP 下載器,,都有一些共同的弊端。

1,、依賴于專門的上位機(jī)或下載器硬件,,不能作到統(tǒng)型;

2,、下載器價格仍然比較高,尤其是原廠的,,這也是為什么有些單片機(jī)催生出很多第三方的下載器,,比如 AVR;
3,、下載的時候通常需要附加額外的操作,,比如STC要重新上電、STM32需要設(shè)置BOOT引腳電平等等,。這些額外的操作都增加了燒錄的復(fù)雜性,。尤其是在產(chǎn)品形態(tài)下要去重新燒錄程序,比如嵌入式升級,,就要打開外殼,,或?qū)⒏郊有盘栆龅綒ね狻_@都是非常不高效,,不友好的作法,。
如果有一種燒錄方法,對于任何一種單片機(jī):

1,、通信方式統(tǒng)一(比如一律都用串口)),;

2、提供一個友好的操作界面(比如命令行方式),;

3,、高效快速,,沒有附加操作,最好一鍵自動化燒錄,;

4,、另外再增加一些嵌入式固件管理的功能(比如固件版本管理)。

這一定會讓我們事半功倍,。Bootloader 就能實現(xiàn)上述的這一切,!

關(guān)于Bootloader

Bootloader的基本形態(tài)

直接看圖

圖片

可以看到BL就是一段存儲在ROM中的程序,它主要實現(xiàn)4個功能:

1,、通過某種途徑獲取要燒錄的固件數(shù)據(jù),;

2、將固件數(shù)據(jù)寫入到ROM的APP區(qū)中,;

3,、跳轉(zhuǎn)到APP區(qū)運(yùn)行,將燒錄進(jìn)去的用戶程序引導(dǎo)起來,;

4,、在此過程中,提供必要而友好的人機(jī)交互界面,。
這么說可能不好理解,,我們還是通過實例來進(jìn)行講解。

Bootloader的兩個設(shè)計實例

下面的兩個實例,,用于說明BL的實際應(yīng)用形態(tài),,不涉及具體的實現(xiàn)細(xì)節(jié),旨在讓大家了解 BL 實際是如何運(yùn)行的,。
帶Shell命令行的串口BL

基本的操作邏輯如下:

1,、通過超級終端、SecureCRT 或 Xshell 之類的串口終端輸入命令 program,;

2,、BL 接收到命令后,開始等待接收固件文件數(shù)據(jù),;

3,、串口終端通過某種文件數(shù)據(jù)傳輸協(xié)議(例如  X/Y/Zmodem協(xié)議)將固件數(shù)據(jù)傳給BL;

4,、BL 將固件數(shù)據(jù)寫入到 ROM 的 APP 區(qū)中,;

5、BL 將 APP 區(qū)中的程序引導(dǎo)運(yùn)行起來,。
更具體的示意如圖所示,。

圖片

這里把操作邏輯說得很簡單,實際實現(xiàn)起來卻并不容易,,我們放在后面去細(xì)究其具體實現(xiàn),。
插SD卡即燒錄的BL

基本的操作邏輯如下:

1,、將待燒錄的固件拷貝到SD卡中;

2,、將SD卡插入到卡槽中,;

3、BL 檢測到 SD 卡插入,,搜索卡中 BIN 文件,;

4、將 BIN 文件數(shù)據(jù)讀出寫入到 ROM 的 APP 區(qū)中,;

5,、BL 將 APP 區(qū)中的程序引導(dǎo)運(yùn)行起來。
如圖所示,。

圖片

通過這兩個設(shè)計實例,,大家應(yīng)該已經(jīng)了解BL是什么了吧。有沒有感受到 BL 是比 ISP 燒錄器更通用,、更靈活,、更友好、功能更強(qiáng)大的固件燒錄和管理手段呢,?
有人可能知道 Linux 下的 Uboot,,它就是一個強(qiáng)大的 BL,它提供非常強(qiáng)大的刷機(jī)(燒錄操作系統(tǒng)鏡像)的功能以及完備而靈活的Shell界面,,如圖所示,。其實我們電腦的BIOS也是一種廣義的BL。

圖片

那如何實現(xiàn)一個BL呢,?別急,,要實現(xiàn)BL是需要滿足一些基本要求的,。

BL實現(xiàn)的要點

首先要說,,并不是任何一個單片機(jī)都可以實現(xiàn)BL的,要滿足幾個要點,。
芯片體系架構(gòu)要支持
來看圖

圖片

我們知道單片機(jī)程序的最開頭是中斷向量表,,包含了程序棧頂?shù)刂芬约癛eset程序入口,通過它才能把程序運(yùn)行起來,。很顯然在從BL向APP跳轉(zhuǎn)的時候,,APP程序必須有自己的中斷向量,并且而且單片機(jī)體系架構(gòu)上要允許中斷向量表的重定向,。
傳統(tǒng)51單片機(jī)的中斷向量表只允許放到ROM開頭,,而不能有偏移量,所以傳統(tǒng)51單片機(jī)是不能支持BL的,。
有人要問“你這不是自相矛盾嗎,?你前面說STC的51單片機(jī)是支持串口ISP的,,那它應(yīng)該內(nèi)置有ISP程序,我理解它應(yīng)該和BL是一個道理,?!?/span>
沒錯,它內(nèi)置的 ISP 程序就是一種 BL,。STC 之所以可以實現(xiàn) BL 功能,,是因為宏晶半導(dǎo)體公司對它的硬件架構(gòu)進(jìn)行了改進(jìn),請看圖

圖片

可以看到,,STC51 單片機(jī)多出了一塊專門存放 BL 的 ROM,,稱為 BOOTROM。
網(wǎng)上有一位叫 shaoziyang 的網(wǎng)友為 AVR 單片機(jī)寫了一個 BL,,還配套開發(fā)了一款叫 AVRUBD 的上位機(jī),,如圖。(AVRUBD是很有用的,,它可以讓我們實現(xiàn)隔空燒錄),,實現(xiàn)了AVR單片機(jī)的串口燒錄,讓很多人擺脫了對USBISP之類ISP下載器的依賴(雖然ISP下載器已經(jīng)很方便了,,但它畢竟還需要銀子嘛),。

圖片

AVR 在硬件架構(gòu)上與 STC51 是一個套路,如圖所示,。

圖片

通過配置AVR的熔絲位可以控制復(fù)位入口地址以及BOOT區(qū)的大小和開始地址,,如圖所示。

圖片

講到這里,,有人會說:“那有沒有一種單片機(jī),,程序放在ROM的任何位置都可以運(yùn)行起來,也就是中斷向量表可以重定位,?”
當(dāng)然有,,這種單片機(jī)還很多,其中最典型的就是 STM32,。它的程序之所以可以放之各地皆可運(yùn)行,,是因為在它的 NVIC 控制器中提供了中斷向量表偏移量的相關(guān)配置,這個后面我們再詳細(xì)說,。
ROM 要支持 IAP
這也是需要單片機(jī)硬件支持的,。很好理解,在 BL 獲取到固件數(shù)據(jù)之后,,需要將它寫入到 ROM 的 APP 區(qū)中,,所以說單片機(jī)需要支持 IAP 操作,所謂 IAP 就是 In Application Programming,,即在應(yīng)用燒錄,。也就是在程序運(yùn)行過程中,,可以對自身ROM進(jìn)行擦除和編程操作。
大家仔細(xì)想想是不是這樣,?似乎支持串口ISP的單片機(jī)都支持IAP功能,。STC還把這一功能包裝成了它的一大特色,可以用內(nèi)部ROM來充當(dāng)EEPROM的功能,,可以在運(yùn)行時記錄一些掉電不丟失的參數(shù)信息,。
STM32 的 ROM 擦寫在配套的固件庫(標(biāo)準(zhǔn)庫或HAL庫)中已經(jīng)有實現(xiàn),大家可以參考或直接使用,。
APP程序的配套修改
為了讓BL可以順利的將APP程序引導(dǎo)運(yùn)行起來,,APP 程序在開發(fā)的時候需要配合BL作出相應(yīng)的修改。最重要的就是 APP 程序的開始地址(即中斷向量表的開始地址)以及對中斷控制器的相應(yīng)配置,。
對于51,、AVR這類單片機(jī)APP程序不用修改,具體原因大家應(yīng)該明白,。這里主要對 STM32 APP程序如何修改進(jìn)行詳細(xì)講解,。
我們依然是結(jié)合實例,請看圖所示,。

圖片

假設(shè)我們所使用的 STM32 的 ROM 總大小為 128KB,,BL程序的體積是16K,APP程序緊鄰BL,,那么APP區(qū)的開始地址為0X08004000,,也就是APP程序的中斷向量表偏移地址為0X4000。
如果我們使用MDK作為開發(fā)環(huán)境的話,,需要修改這里,,如圖所示。

圖片

而如果我們使用的是 gcc 的話,,則需要對 link.ld 鏈接文件進(jìn)行修改,,如圖3.18。

圖片

然后我們還需要對NVIC的中斷向量表相關(guān)參數(shù)進(jìn)行配置,,主要是中斷向量表的偏移量,,如下代碼,。

#define VECT_TAB_OFFSET 0x4000

OK,,經(jīng)過修改后的程序,我們把它放到 ROM 的 0X08004000 開始地址上,,然后再讓BL跳轉(zhuǎn)到這個地址,,我們的程序就能運(yùn)行起來了。
有人又會問:“BL中的跳轉(zhuǎn)代碼怎么寫,?”別急,,這是我們要講的下一個要點,。
BL中的跳轉(zhuǎn)代碼
跳轉(zhuǎn)代碼是 BL 要點中的關(guān)鍵,直接關(guān)系到 APP 程序能否正常運(yùn)行,,如圖

圖片

我直接給出 STM32 的 jump_app 函數(shù)代碼,。

typedef void (*iapfun)(void);

iapfun jump2app;

void MSR_MSP(u32 addr)
{
  __ASM volatile('MSR MSP, r0');   //set Main Stack value*
  __ASM volatile('BX r14');*
}


void load_app(u32 appxaddr)
{
  if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)//**檢查棧頂?shù)刂泛戏?
  {

    //**用戶代碼區(qū)第二個字為程序開始地址(**復(fù)位地址)
    jump2app=(iapfun)\*(vu32\*)(appxaddr+4);

    //**初始化APP**堆棧指針(**用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
    MSR_MSP(*(vu32*)appxaddr);  

    jump2app();   //**跳轉(zhuǎn)到APP.
  }
}

這段代碼大家自行研究,如果展開講就屬于贅述了,。
到這里BL相關(guān)的要點就介紹完了,,大家應(yīng)該有能力去完成一個簡單的BL了?;?STM32 設(shè)計的一個小實驗,,大家有興趣可以小試牛刀一下,如圖

圖片

我們將 BL 程序用 Jlink 燒錄到 0X08000000 位置,,而把 APP 程序燒錄到 0X08002000 開始位置,,然后復(fù)位,如果串口打印了 hello world 或流水燈亮起來了,,就說明我們的 BL 成功了,。

把Bootloader玩出花

上面我所講的都是BL最基礎(chǔ)的一些內(nèi)容,是我們實現(xiàn)BL所必須了解的,。BL真正的亮點在于多種多樣的固件數(shù)據(jù)獲取方式,。

BL的實現(xiàn)與延伸(串口傳輸固件)

前面我講到過兩個BL應(yīng)用的實例,一個是串口傳輸固件文件,,一個是SD卡拷貝固件文件,。它們是在實際工程中經(jīng)常被用到的兩種BL形式。

這里著重對前一個實例的實現(xiàn)細(xì)節(jié)進(jìn)行講解剖析,,因為它非常具有典型意義,,如圖

圖片

這個流程圖提出了3個問題:
  • 串口通信協(xié)議是如何實現(xiàn)的?
  • 為什么獲取到上位機(jī)傳來的固件數(shù)據(jù),,不是直接寫入到APP區(qū),,而是先暫存,還要校驗,?
  • 對固件數(shù)據(jù)是如何實現(xiàn)校驗的,?

第一個問題,串口通信協(xié)議以及文件傳輸實現(xiàn)的相關(guān)內(nèi)容略顯繁雜,,在以后的文章會專門進(jìn)行講解,。

第二個問題:經(jīng)過串口傳輸最終由單片機(jī)接收到的固件數(shù)據(jù)是可能出現(xiàn)差錯的,而有錯誤的固件冒然直接寫入到APP區(qū),,是一定運(yùn)行不起來的,。所以,我們要對數(shù)據(jù)各幀進(jìn)行暫存,等全部傳輸完成后,,對其進(jìn)行整體校驗,,以保證固件數(shù)據(jù)的絕對正確。

針對第三個問題,,我們要著重探討一下,。

一個文件從發(fā)送方傳輸?shù)浇邮辗剑绾未_定它是否存在錯誤,?

通常的做法在文件中加入校驗碼,,接收方對數(shù)據(jù)按照相同的校驗碼計算方法計算得到校驗碼,將之與文件中的校驗碼進(jìn)行對比,,一致則說明傳輸無誤,,如圖。

圖片

上圖是對固件文件的補(bǔ)齊以及追加校驗碼的示意,。

為什么要對文件補(bǔ)齊,?嵌入式程序經(jīng)過交叉編譯生成的可燒錄文件,比如 BIN,,多數(shù)情況下都不是128,、256、512或1024的整數(shù)倍,。這就會導(dǎo)致在傳輸?shù)臅r候,,最后一幀數(shù)據(jù)的長度不足整幀,就會產(chǎn)生一個數(shù)據(jù)尾巴,。

取整補(bǔ)齊是解決數(shù)據(jù)尾巴最直接的方法,。這一操作是在上位機(jī)上完成的,通常是編寫一個小軟件來實現(xiàn),。這個小軟件同時會將校驗碼追加到固件文件末尾,。這個校驗碼可以使用校驗和(Checksum)或者 CRC,一般是 16 位或 32 位,,如圖,,通過一個小軟件實現(xiàn)對固件文件補(bǔ)齊和添加校驗碼。

圖片

又有人會問:“要把整個固件暫存下來,,再作校驗,,那得需要額外的存儲空間吧,外擴(kuò)ROM(FlashROM或EEPROM),?

是的,。如果想節(jié)省成本,我們也可以不暫存,,傳輸時直接燒寫到APP區(qū),。這是有風(fēng)險的,但是一般來說問題不大(STC和STM32的串口ISP其實也都是實時燒寫,,并不暫存),。

因為在傳輸?shù)倪^程中,傳輸協(xié)議對數(shù)據(jù)的正確性是有一定保障的,,它會對每一幀數(shù)據(jù)進(jìn)行校驗,,失敗的話會有重傳,連續(xù)失敗可能會直接終止傳輸,。所以說,,一般只要傳輸能夠完成,基本上數(shù)據(jù)正確性不會有問題,。

但是,,仍然建議對固件進(jìn)行整體校驗,在成本允許的情況下適當(dāng)擴(kuò)大ROM容量,。同時,,固件暫存還有一個另外的好處,在APP區(qū)中的固件受到損壞的時候,,比如固件意外丟失或IAP時不小心擦除了APP區(qū),,此時我們還可以從暫存固件恢復(fù)回來(完備的BL會包含固件恢復(fù)的功能)。

其實也不必非要外擴(kuò)ROM,,如果固件體積比較小的話,,我們可以把單片機(jī)的片上ROM砍成兩半來用,用后一半來作固件暫存,。將片上ROM劃分為3部分:

圖片

我們將片上ROM劃分為3部分,,分別用于存儲 BL、APP 固件以及暫存固件,。比如我們使用 STM32F103RBT6,,它一共有128KB 的 ROM,可以劃分為 16K/56K/56K,。

有些產(chǎn)品對成本極為敏感,。我就有過這樣的開發(fā)經(jīng)歷,當(dāng)時使用的單片機(jī)是 STM32F103C8T6,,片上ROM總?cè)萘繛?4K,,固件大小為48K,BL為12K,。在通過BL進(jìn)行固件燒寫時根本沒有多余的ROM進(jìn)行固件暫存,。我使用了一招“狗尾續(xù)貂”,如圖

圖片

我無意中了解到 STM32F103C8T6 與 RBT6 的晶元是同一個,。只是因為有些芯片后 64KB 的ROM性能不佳或有瑕疵,,而被限制使用了,。我實際測試了一下,確實如此,。

但是后 64K ROM 的使用是有前提的,,也就是需要事先對其好壞進(jìn)行驗證。如果是好的,,則暫存校驗,,再寫入APP區(qū);而如果是壞的,,那么就直接在固件傳輸時實時寫入APP區(qū)(這個辦法我屢試不爽,,還沒有發(fā)現(xiàn)后64K有壞的)。

以上振南所介紹的是一種“騷操作”,,根本上還是有一定的風(fēng)險的,,ST 官方有聲明過,對后 64K ROM 的質(zhì)量不作保證,,所以還是要慎用,。

10米之內(nèi)隔空燒錄

這個“隔空燒錄”源于我的一個 IoT 項目,它是對空調(diào)的外機(jī)進(jìn)行工況監(jiān)測,。大家知道,,空調(diào)外機(jī)的安裝那可不是一般人能干的,它要不就在樓頂,,要不就在懸窗上,。這給硬件升級嵌入式程序帶來很大的困難。

所以,,我實現(xiàn)了“隔空燒錄”的功能,,其實它就是串口BL應(yīng)用的一個延伸,如圖所示,,通過藍(lán)牙串口模塊實現(xiàn)“隔空燒錄”,。

圖片

“隔空燒錄確實牛,但是總要抱著一個電腦,,這不太方便吧,。”確實是,!還記得前面我提過的AVRUBD通信協(xié)議嗎,?它的上位機(jī)軟件是有手機(jī)版的。這樣我們只要有手機(jī),,就能“隔空燒錄”了,,如圖,手機(jī)連接藍(lán)牙串口模塊實現(xiàn)“手機(jī)隔空燒錄”,。

圖片

“哪個APP,?快告訴我名字”,,別急,藍(lán)牙串口助手安卓版,,下圖是正在傳輸固件的界面,。

圖片

AVRUBD其實是對 Xmodem 協(xié)議的改進(jìn),這個我們放在專門的文章進(jìn)行詳細(xì)講解,。

BL的分散燒錄

我們知道BL的核心功能其實就是程序燒錄,。那你有沒有遇到過比較復(fù)雜的情況,,如圖所示,,一個系統(tǒng)(產(chǎn)品)中有多個部件需要燒錄固件。

圖片

這種情況是有可能遇到的,。主 MCU+CPLD+通信協(xié)處理器+采集協(xié)處理器就是典型的復(fù)雜系統(tǒng)架構(gòu),。這種產(chǎn)品在批量生產(chǎn)階段,燒錄程序是非常繁瑣的,。首先需要維護(hù)多個固件,,再就是需要一個個給每一個部件進(jìn)行燒寫,燒寫方式可能還不盡相同,。所以我引入了一個機(jī)制,,叫“BL的分散燒錄”。

首先,,我們將所有的固件拼裝成一個大固件(依次數(shù)據(jù)拼接),,并將這個大固件預(yù)先批量燒錄到外擴(kuò) ROM 中,比如spiFlash,;再將主MCU預(yù)先燒錄好BL,;然后進(jìn)行SMT焊接。

PCBA生產(chǎn)出來之后,,只要一上測試工裝(首次上電),,BL會去外擴(kuò)ROM中讀取大固件,并從中分離出各個小固件,,分別以相應(yīng)的接口燒錄到各個部件中去,。配合工裝的測試命令,直接進(jìn)行自檢,。

這樣做,,批量化生產(chǎn)是非常高效的。當(dāng)然,,這個 BL 開發(fā)起來也會有一定難度,,最大問題可能還是各個部件燒錄接口的實現(xiàn)(有些部件的燒錄協(xié)議是比較復(fù)雜的,比如 STM32 的 SWD 或者 ESP8266 的 SLIP),。

BL沒有最好的,,只有最適合自己的,。通常來說,我們并不會把BL設(shè)計得非常復(fù)雜,,原則上它應(yīng)該盡量短小精煉,,以便為APP區(qū)節(jié)省出更多的ROM空間。畢竟不能喧賓奪主,,APP才是產(chǎn)品的主角,。

不走尋常路的BL

Bootpatcher

我來問大家一個問題:“Bootloader在 ROM 中的位置一定是在 APP 區(qū)前面嗎?”很顯然不是,,AVR 就是最好的例子,。那如果我們限定是 STM32 呢?似乎是的,。上電復(fù)位一定是從0X08000000位置開始運(yùn)行的,,而且BL一定是先于APP運(yùn)行的。

在某些特殊的情況下,,如果 APP 必須要放在0X08000000位置上的話,,請問還有辦法實現(xiàn)BL串口燒錄嗎?要知道APP在運(yùn)行的時候,,是不能 IAP 自己的程序存儲器的(就是自己能自己擦出重新燒錄新固件),。請看圖,BL位于APP之后稱之為Bootpatcher,。

圖片

APP運(yùn)行時,,想要重新燒錄自身,它可以直接跳轉(zhuǎn)到后面的BL上,,BL運(yùn)行起來之后開始接收固件文件,,暫存校驗OK之后,將固件寫入到前面的APP區(qū),。然后跳轉(zhuǎn)到 0X08000000,,或者直接重啟。這樣新的APP就運(yùn)行起來了,。

這個位于 APP 后面的 BL,,我們稱之為 Bootpatcher(意為啟動補(bǔ)丁),。但是這種作法是有風(fēng)險的,,一旦 APP 區(qū)燒錄失敗,那產(chǎn)品就變磚了,。所以這種方法一般不用,。

APP反燒BL

前面我們都是在講BL燒錄APP,那如果BL需要升級怎么辦呢,?用 JLINK,。不錯,,不過有更直接的方法,如圖,,APP燒錄BL區(qū),。

圖片

這是一種逆向思維,我們在 APP 程序中也實現(xiàn)接收固件文件,,暫存校驗,,然后將其燒錄到 BL 區(qū)。這種作法與Bootpatcher 同理,,也是有一定風(fēng)險的,,但一般都沒有問題。

最后

OK,,本系列文章對BL進(jìn)行了詳盡的剖析講解,,應(yīng)該做到了深入淺出,,包含基本的原理,,以及實例的實現(xiàn),還有一些知識的擴(kuò)展,。希望能夠?qū)Υ蠹耶a(chǎn)生啟發(fā),,在實際的工作中將這些知識付諸實踐。

作者/來源:一起學(xué)嵌入式

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多