概 述
作為高性能、低功耗的嵌入式MCU產(chǎn)品,先楫半導(dǎo)體的HPM6000 系列產(chǎn)品廣泛應(yīng)用于多個(gè)領(lǐng)域。在嵌入式系統(tǒng)的開發(fā)中,Bootloader 常常是開發(fā)者可能會(huì)遇到的第一個(gè)技術(shù)難點(diǎn)。應(yīng)用程序運(yùn)行環(huán)境能否正確構(gòu)建,內(nèi)核能否啟動(dòng)成功,都取決于Bootloader 能否正確工作。一個(gè)功能完善的嵌入式系統(tǒng),還需要Bootloader 能夠?qū)崿F(xiàn)系統(tǒng)OTA更新升級(jí)的能力,即除了usb燒錄、串口燒錄等方式外,還預(yù)留給客戶通過以太網(wǎng)等方式實(shí)現(xiàn)快捷固件升級(jí)的窗口。
本文以HPM6450為例,基于HPM6000 系列產(chǎn)品嵌入式系統(tǒng)的硬件平臺(tái)和RT—thread 軟件平臺(tái),描述系統(tǒng)引導(dǎo)程序Bootloader 的設(shè)計(jì)思路,闡述了設(shè)計(jì)時(shí)需要考量的因素和遇到的技術(shù)難點(diǎn)及操作,希望能給大家一些啟發(fā)。
二級(jí)boot方案思路分析
(圖1:整體思路分析)
如上圖所示,整個(gè)方案涉及3個(gè)部分:
FLASH空間的分區(qū)
二級(jí)boot
APP固件
因本次我們討論的重點(diǎn)是“二級(jí)boot”,所以下文內(nèi)容僅涉及前兩部分。
1
FLASH空間的分區(qū)
HPM6700/6400系列的單片機(jī)和我們常用的stm32、at32這類的單片機(jī)最大的不同是該系列MCU 是通過 xpi 總線外掛外部FLASH,即代碼存儲(chǔ)在外部FLASH。
查閱芯片用戶手冊(cè)可知,該系列MCU支持通過 XPI0 或XPI1外掛FLASH(FLASH外掛方式,如圖2所示)。
其中xpi0映射的地址空間是0x80000000,xpi1映射的地址空間是 0x90000000, CPU可對(duì)這兩塊地址空間直接尋址并運(yùn)行代碼(如圖3所示)。
(圖2:外部FLASH掛載于xpi0原理圖)
(圖3:地址空間映射關(guān)系)
為實(shí)現(xiàn)固件升級(jí),F(xiàn)LASH空間需要進(jìn)行合理的劃分,如Bootloader分區(qū)、用戶程序分區(qū)、OTA升級(jí)分區(qū)、用戶數(shù)據(jù)分區(qū)等。在RT-Thread上,F(xiàn)AL組件提供了方便的分區(qū)劃分機(jī)制。
本文分享的兩種方案均以W25Q256為例,該FLASH大小為32MB,掛載于XPI0外設(shè)上,首地址為0x80000000,通過FAL組件對(duì)FLASH的分區(qū)詳情如下圖所示:
(圖4:Flash 分區(qū)表)
注意,其中:
boot分區(qū)表示二級(jí)boot,該分區(qū)預(yù)留了1MB的存儲(chǔ)空間,為未來的功能升級(jí)留足了空間。
app 分區(qū)可根據(jù)實(shí)際需要來分配大小,本方案中預(yù)留了1MB的空間。
download分區(qū)用于下載固件,在APP執(zhí)行過程中,新固件通過OTA下載于該分區(qū),并在重啟后由boot分區(qū)的bootloader完成合法性檢驗(yàn)和新固件升級(jí)操作。
Filesystem 分區(qū)用于實(shí)現(xiàn)文件系統(tǒng),在此分區(qū)上面可以掛載littelfs格式文件系統(tǒng),可以避免因頻繁掉電導(dǎo)致數(shù)據(jù)丟失的問題。
Easyflash 分區(qū)可用于存儲(chǔ)一些簡(jiǎn)單的參數(shù)等。
2
二級(jí)boot
二級(jí)boot由芯片BootROM引導(dǎo),從芯片的用戶手冊(cè)可知:HPM6700系列支持多種啟動(dòng)方式,可到先楫半導(dǎo)體官網(wǎng)上查看“HPM6700/6400用戶手冊(cè)”的19.1內(nèi)容部分,如下:
(圖5:官方代碼啟動(dòng)描述)
由上可知當(dāng)從串行nor flash啟動(dòng)的時(shí)候,可支持“原地代碼執(zhí)行”和“拷貝到內(nèi)部RAM”執(zhí)行?!皢?dòng)方式一” 表示代碼存儲(chǔ)在外部flash,并由CPU直接在flash上執(zhí)行代碼;“啟動(dòng)方式二” 表示代碼存在flash里面,然后通過BootROM復(fù)制代碼到內(nèi)存后再執(zhí)行。
受BootROM支持的兩類啟動(dòng)方式的啟發(fā),筆者經(jīng)過分析以及與官方的技術(shù)支持討論得出如下結(jié)論:
采用FLASH原地執(zhí)行的方式,系統(tǒng)可支持更大尺寸的應(yīng)用程序,如支持GUI的應(yīng)用。在cache的加持下,該方式可實(shí)現(xiàn)成本和執(zhí)行速度的平衡。(需要注意的是:由于FLASH固有屬性的限制(多數(shù)FLASH不支持RWW),在需要支持FLASH擦寫的應(yīng)用中,用戶代碼需要做一些防止產(chǎn)生RWW場(chǎng)景的保護(hù)。)
采用拷貝到RAM中執(zhí)行的方式,可實(shí)現(xiàn)如下優(yōu)勢(shì):
用戶代碼以更高的性能執(zhí)行(RAM的隨機(jī)訪問性能優(yōu)于FLASH)
規(guī)避了FLASH不支持RWW的限制,由于代碼執(zhí)行于RAM,在需要FLASH擦寫的應(yīng)用中邏輯會(huì)更簡(jiǎn)單。
考慮到HPM6700/HPM6400系列有高達(dá)2MB連續(xù)空間的RAM,若用戶代碼及代碼所需要的RAM所占用的空間總和小于或等于2MB,“啟動(dòng)方式二” 是一種值得考慮的選擇。
由于二級(jí)boot 同時(shí)支持以上兩種啟動(dòng)方案,接下來,我們將針對(duì)每種方案分別進(jìn)行討論。
方案一:FLASH原地執(zhí)行
在該方案下,app 在FLASH里執(zhí)行。如上所述,app 存儲(chǔ)于FLASH 1MB偏移處,需要將鏈接腳本中的FLASH首地址改為0x80100000。
需要注意的是,由于app是被二級(jí) Bootloader 引導(dǎo),因此應(yīng)用程序中不應(yīng)再攜帶用于 BootROM 引導(dǎo)識(shí)別的啟動(dòng)頭(boot header)。
Boot 的 FLASH 腳本不改,最終跳轉(zhuǎn)邏輯為:
Boot啟動(dòng)
檢查download分區(qū)是否有新固件,如果有則拷貝到APP
關(guān)閉中斷
跳轉(zhuǎn)到0x80100000地址,就啟動(dòng)了APP。
這樣就完成了二級(jí)boot的設(shè)計(jì)。
這里最關(guān)鍵的就是如何修改連接腳本。
(圖6:?jiǎn)?dòng)地址修改)
修改好app的鏈接腳本后,需要在boot里面進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)代碼參考如下:
(圖7:Boot 里跳轉(zhuǎn))
其中app_addr 為跳轉(zhuǎn)偏移地址,如下:
(圖8:偏移地址計(jì)算)
二級(jí)boot完成App跳轉(zhuǎn)后,App在FLASH中原地執(zhí)行。該方案的優(yōu)勢(shì)是與復(fù)制到RAM相比,應(yīng)用的尺寸可以大至數(shù)十MB??紤]到FLASH的固有限制(隨機(jī)訪問性能稍弱,不支持RWW等),當(dāng)應(yīng)用程序執(zhí)行于FLASH上, 開發(fā)者需要注意以下幾點(diǎn):
對(duì)于需要高頻執(zhí)行的、對(duì)性能有要求的代碼,用戶程序需要將其復(fù)制到RAM中執(zhí)行,否則會(huì)影響程序的效率(若cache未命中)。
若需要執(zhí)行FLASH擦寫操作,需要保證在FLASH擦寫期間,沒有程序或者其他外設(shè)訪問FLASH(具體的實(shí)現(xiàn)方式有:關(guān)全局中斷、關(guān)調(diào)度器等)。
完成FLASH擦寫操作后,用戶代碼需要保證cache 一致性,否則可能會(huì)導(dǎo)致未預(yù)期的后果(如讀到錯(cuò)誤代碼/數(shù)據(jù))。
方案二:內(nèi)存執(zhí)行
若用戶代碼加代碼所需的RAM總和小于2M,基于HPM6700/HPM6400有高達(dá)2MB的連續(xù)RAM,為規(guī)避FLASH固有限制帶來的不便,產(chǎn)品可采用方案二,即:App本身在RAM中執(zhí)行。啟動(dòng)過程中,二級(jí)boot將App復(fù)制到RAM中并中轉(zhuǎn)到APP的目標(biāo)地址執(zhí)行。
(圖9:內(nèi)存系統(tǒng)描述)
采用該方案時(shí),需要注意以下三點(diǎn):
二級(jí)boot所使用的RAM不應(yīng)和用戶App所在RAM區(qū)域重疊,否則在拷貝中會(huì)產(chǎn)生錯(cuò)誤。
二級(jí)boot在跳轉(zhuǎn)到用戶App前需要恢復(fù)中斷到默認(rèn)狀態(tài)(關(guān)閉中斷)。
boot采用flash link的編譯方式,APP要采用ram link的編譯方式,即APP是通過內(nèi)存方式的鏈接腳本,因此APP編譯后無法通過下載到flash的方式調(diào)試,必須使用USB或者其他的方式下載固件到0x80100000處。
(圖10:工作示意圖)
以下為boot里面的鏈接修改,供大家參考:
(圖11:Boot鏈接腳本參考)
(圖12:App ram link方式鏈接文件參考)
在方案二中,二級(jí)boot需要做的操作比flash boot的方式多了一個(gè)步驟,需要先將APP分區(qū)的代碼拷貝至內(nèi)存,然后再跳轉(zhuǎn)至內(nèi)存執(zhí)行。
(圖13:代碼拷貝至內(nèi)存)
(圖14:代碼跳轉(zhuǎn)至內(nèi)存執(zhí)行)
注意跳轉(zhuǎn)前,需要關(guān)閉各種中斷。
(圖15:運(yùn)行效果示意圖)
3
注意事項(xiàng)
選擇鏈接腳本時(shí),要注意看左側(cè)的鏈接腳本是否正確,如下圖所示:
(圖16:鏈接腳本示意圖)
如果鏈接腳本不能執(zhí)行,請(qǐng)檢查下圖的設(shè)置。
(圖17:勾選newlib-nano)
編譯的時(shí)候,需要把nerlib-nano勾選上,否則當(dāng)使用memcpy的時(shí)候,有可能會(huì)出現(xiàn) “非法指令” 的錯(cuò)誤。
-
mcu
+關(guān)注
關(guān)注
146文章
16885瀏覽量
349916 -
半導(dǎo)體
+關(guān)注
關(guān)注
334文章
26855瀏覽量
214308 -
嵌入式
+關(guān)注
關(guān)注
5059文章
18973瀏覽量
302029 -
先楫半導(dǎo)體
+關(guān)注
關(guān)注
10文章
214瀏覽量
2050
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論