天天看點

AliOS Things 二級bootloader方案介紹

1、概述

在嵌入式作業系統中,BootLoader是在作業系統核心運作之前運作的一段代碼。

他的作用就是為作業系統核心準備好運作環境,比如初始化必要的裝置硬體,建立記憶體映射圖等。

bootloader不一定隻有一個,有些作業系統有兩級的bootloader,第一級bootloader和第二級bootloader分别完成不同的功能。

二級bootloader功能如下:

1)提供OTA更新運作環境

OTA的差分及壓縮更新功能,需要一個與OS及APP隔離的運作環境,用于差分恢複運作區版本。該運作環境可以在一級bootloader中實作,但是一級bootloader通常是晶片或者模組廠商提供,而且很多晶片及模組廠商未提供bootloader的源碼,無法保證可以在所有的一級bootlaoder中實作。

2)充分利用記憶體空間

在二級bootloader運作時,OS還未啟動,二級bootloader可以使用全部的記憶體空間,用于差分解壓算法等比較耗記憶體的操作。OS啟動後,将整個系統記憶體重新初始化,也可以使用全部記憶體空間,二級bootloader使用了多少記憶體對OS無影響。這樣可以達到記憶體的充分利用。


           

3)版本自動復原

可以提供版本復原功能,版本更新後,如果啟動失敗,可以通過二級bootloader自動復原到更新前可正常運作的版本。

4)裝置本地更新。

可以支援裝置在不直接聯網的場景下,通過本地更新功能,作為子裝置更新。

2、二級bootloader總體架構

2.1、實體部署

AliOS Things 二級bootloader方案介紹

如上圖所示,二級bootloader介于一級bootloader與OS之間,與一級bootloader及OS共用FLASH空間,運作時獨享系統RAM空間。

2.2、二級bootloader對外功能

AliOS Things 二級bootloader方案介紹

1)UART驅動、FLASH驅動級Watchdog驅動,需要獨立運作,不能對一級bootloader及OS産生符号依賴。可以對一級bootloader有功能依賴,不能對OS有功能依賴。

2)FLASH分區表中二級boot相關的配置需要與OS的FLASH分區表二級boot相關的配置完全一緻。

3、二級bootloader詳細設計方案

3.1、二級bootloader啟動流程

3.1.1、二級bootloader加載啟動

對于一級bootloader來說,二級bootloader與OS一樣,是一個被引導啟動的application,是以二級bootloader編譯及啟動方式與OS基本相同。

由于每個MCU,bootloader啟動OS的方式不一樣,是以二級bootloader被一級bootloader引導啟動的方式也不盡相同。目前AliOS Things支援的MCU,通常有下面幾種啟動引導方式:

1)一級bootloader從固定位址跳轉到二級bootloader的入口執行。目前,mk3060及developerkit等采用的這種方式。

2)一級bootloader從固定位址讀取二級bootloader的入口函數位址,再跳轉到二級bootloader入口執行。目前,mk3080采用的是這種啟動方式。

3)有多個固定的FLASH啟動位址,一級bootloader根據FLASH中的固定參數,決定從哪個FLASH位址啟動。developerkit等STM32系列的MCU均是該方式啟動。

注:mk3080的一級bootloader實際也有選擇啟動位址的過程,選擇完後,再按照步驟2啟動。

下面詳述一下一級bootloader加載啟動二級bootloader的流程。

二級bootloader加載啟動流程

AliOS Things 二級bootloader方案介紹

二級bootloader加載啟動流程2

AliOS Things 二級bootloader方案介紹

FLASH排列規則如下:

注:部分MCU是一級bootloader實作,一級bootloader會将二級bootloader的data段資料拷貝到RAM中。目前mk3060,是二級bootloader自己拷貝的data段資料;mk3080是一級bootloader加載二級bootloader前完成。

該流程,由一級bootloader完成,二級bootloader本身不需要操作,隻需要按照MCU要求OS的編譯連結方式生成bin檔案即可。

3.1.2、二級bootloader記憶體初始化

将data段資料拷貝到RAM中對應位址

該操作,需要在FLASH中找到data段的起始位址和結束位址,以及在RAM中的起始位址和結束位址,然後将FLASH中的data資料拷貝到RAM中。

對于大部分CPU,data段的起始和結束位址,定義在連結腳本中,代碼通過extern變量方式擷取。少量MCU,如mk3080,需要按照特殊方式擷取(3080的特殊方式,可以參加3080二級bootloader加載啟動流程章節)。

bss段資料清0

該操作需要在RAM中找到bss段的起始位址和結束位址,然後将RAM中對應位址的資料清0。

所有的MCU,bss段的起始和結束位址,都可以直接定義在連結腳本中,代碼通過extern變量方式擷取。

動态記憶體管理

二級bootloader在運作OTA差分功能時,需要使用動态記憶體申請及釋放功能。是以要求二級bootloader中支援動态記憶體管理。

二級bootloader中,使用的動态記憶體範圍在二級bootloader的連結腳本中定義,從二級bootloader的bss段結束,到recovery棧空間開始的範圍。記憶體管理使用與OS相同的動态記憶體管理算法。

3.2、二級bootloader引導啟動OS流程

3.2.1、OS啟動流程

二級bootloader引導啟動OS的流程,基本與一級bootloader引導啟動二級bootloader的流程相同。基本也分2種方式:固定位址跳轉和從固定位址讀取入口函數位址跳轉,詳見二級bootloader啟動流程種的描述。

下面以mk3060和mk3080為列,詳述一下二級bootloader加載啟動OS的流程。

AliOS Things 二級bootloader方案介紹

二級bootloader加載啟動OS流程

AliOS Things 二級bootloader方案介紹

注意:FLASH燒寫,需要4K對齊,是以需要從0x1C000開始燒寫。而OS的起始FLASH位址需要從0x1C01C開始,是以需要在OS的bin檔案頭部補充0x1C byte的填充資料。

AliOS Things 二級bootloader方案介紹

3.2.2、中斷向量表

二級bootloader本身不進行中斷,全程禁止中斷運作(序列槽中斷除外),但是在OS啟動後,需要将中斷送給OS。目前有幾種實作方式,如下:

采用逐級中斷向量表跳轉方式,硬體産生中斷後,先進入一級bootloader,一級bootloader轉給二級bootloader,二級bootloader轉給OS。

AliOS Things 二級bootloader方案介紹

OS啟動後,直接将中斷注冊給MCU SDK提供的中斷機制。

硬體觸發中斷後,直接調用中斷處理回調函數。
           
AliOS Things 二級bootloader方案介紹

直接修改中斷向量表入口位址

OS啟動後,設定MCU硬體寄存器,将中斷向量表位址設定為OS内部中斷向量表位址。硬體産生中斷後,直接進入OS的中斷向量表。developerkit目前采用的這種方式。
           
AliOS Things 二級bootloader方案介紹

3.3、二級bootloader運作流程

3.3.1、運作流程

AliOS Things 二級bootloader方案介紹

說明:1)在recovery中,也會初始化序列槽。

2)一旦進入recovery流程,不能再傳回啟動OS的流程,需要重新開機後再進入。

     3)一旦進入指令行模式,不能再傳回啟動OS的流程,需要重新開機後進入。

     4)部分MCU,OS的啟動入口位址是寫死的,不需要動态擷取。


           

3.4、指令行功能

指令行功能,運作開發者通過序列槽輸入指令方式,查詢版本資訊、進行本地更新等操作。

3.4.1、進入流程

在判斷是否需要進入指令行模式時,會持續讀序列槽100ms,如果讀到字元'w',就會進入指令行模式。

進入後,會列印二級bootloader版本号,以及指令提示資訊。然後等待使用者進一步輸入序列槽指令。

3.4.2、支援指令

1)列印運作區版本号及備份區版本号。

2)Xmodem讀寫flash

3)Ymodem讀寫flash

4)USB更新

5)Canbus更新

6)版本回退到備區

7)reboot

說明,上面指令,支援配置項配置,通過配置項決定是否支援對應功能。

3.5、異常處理

二級bootloader中發生異常時,直接reset。

4、現有系統影響分析

4.1、FLASH空間

4.1.1、FLASH空間消耗增多

增加二級bootloader功能後,相對于沒有實作二級bootloader以及差分更新的裝置,會增加36k的FLASH消耗。對于已經實作差分更新的裝置,會增加16k的FLASH消耗。

增加的FLASH消耗主要是由下面幾方面導緻:

1)增加了二級bootloader的處理邏輯,代碼需要消耗FLASH空間。

2)增加了指令行處理功能,相關代碼需要消耗FLASH空間。

3)增加雙備份及復原功能,相關代碼需要消耗FLASH空間。

4)增加了任意時刻斷點續傳功能,增加了8K的備份資料區。

4.1.2、FLASH空間規劃發生變化

增加二級boot及差分功能後,會導緻FLASH空間規劃發生變化。原因如下:

1)二級bootloader在FLASH中的位置,需要位于一級bootloader之後,OS之前。

2)增加了一個8K備份區,用于備份二級bootloader及差分參數,一級備份斷點續傳資料。

4.2、版本燒寫方式

4.2.1、目前燒寫方式

目前燒寫方式歸納一下,存在下面2種燒寫方式:

OS的bin檔案單獨燒寫。

OS與bootloader的bin作為一個檔案一起燒寫。

4.2.2、增加二級bootloader後燒寫方式

增加二級bootloader後,有下面3種方式:

AliOS Things 二級bootloader方案介紹
AliOS Things 二級bootloader方案介紹

可行方案:

1)對于一級bootloader可以燒寫的裝置

将二級bootloader與一級bootloader合并成一個bin檔案,單獨燒寫。OS的bin檔案單獨燒寫。

2)對于一級bootloader不可以燒寫(或者不需要燒寫)的裝置

将二級bootloader單獨燒寫。OS的bin檔案單獨燒寫。

4.3、啟動時間

由于需要支援指令行模式,在每次啟動時,會有100ms的等待按鍵輸入的時間。導緻每次啟動會慢100ms。

5、移植說明

5.1、概述

二級bootloader實作,依賴UART驅動、FLASH驅動、WatchDog驅動,需要能夠被一級bootloader啟動,需要能夠加載啟動OS的bin。

5.2、啟動引導

啟動引導,需要實作下列功能:

1)能夠被一級bootloader引導啟動

2)能夠找到OS的data段在flash中的位置,以及在RAM中的位置,啟動OS前,将data段拷貝到RAM中。

2)能夠找到OS的入口位址,啟動OS。

3)能夠将中斷和異常轉給OS。

5.3、UART驅動移植

UART驅動,需要提供下列功能:

AliOS Things 二級bootloader方案介紹

5.4、FLASH驅動移植

FLASH驅動,需要提供下列功能:

AliOS Things 二級bootloader方案介紹

5.5、WatchDog驅動移植

WatchDog驅動,需要提供下列内容:

AliOS Things 二級bootloader方案介紹

5.6、記憶體管理

記憶體管理,主要需要提供動态管理記憶體的起始位址和結束位址,方式如下:

AliOS Things 二級bootloader方案介紹

5.7、複位及延時

需提供如下接口:

AliOS Things 二級bootloader方案介紹

繼續閱讀