天天看點

HaaS100 Flash分區劃分說明

來源 | HaaS技術社群

1、概述

HaaS100是一款針對IoT場景的公闆,除了有前面介紹的豐富的外設外,其存儲空間也很大,内部Flash空間有16MBytes;

HaaS 100的存儲空間是通過分區表來管理的,這張表包括一級bootloader區、二級bootloader區、OS運作A區、OS 運作B區以及相關parameters區。

如下圖是HaaS 100的分區表,圖中已标注各分區的起始位址、分區size以及各分介紹:

HaaS100 Flash分區劃分說明

上圖的分區表與 AliOS-Things/platform/board/haas100/config/partition_config.c 相對應;

HaaS100采用的是乒乓更新(AB分區更新)方式,是以OS既可以運作在OS_A分區也可以運作在OS_B分區,兩個分區互為備份;

2、分區劃分規則

HaaS100搭載的是AliOS Things, 這裡介紹一下AliOS Things的分區表劃分規則:

2.1、擷取晶片平台的Flash空間大小

首先需要擷取所使用晶片平台的存儲空間大小,如HaaS100 Flash空間為16MBytes,進而知道分區表的位址範圍是多少;

2.2、擷取bootloader資訊

在劃分區表之前,需要從晶片手冊或者平台供應商等地方,擷取bootloader支援的更新類型(單分區還是乒乓)、bootloader跳轉位址(如果是乒乓會有兩個跳轉位址);如HaaS100支援的是乒乓更新,其bootloader支援兩個位址跳轉;

2.3、根據以上擷取的資訊,劃分整個Flash

AliOS Things 的分區表,每個分區都有對應的分區ID,分區ID号的定義在AliOS-Things/include/aos/hal/flash.h。

結合分區ID将劃分分區方法歸納如下兩類:

  • Bootloader支援單分區更新flash大小劃分方法;
分區名 描述 起始位址 分區大小
HAL_PARTITION_BOOTLOADER bootloader 晶片的起始位址(一般為0 ) bootloader的跳轉位址與晶片起始位址的內插補點
HAL_PARTITION_APPLICATION OS運作區 Bootloader跳轉位址 使用者根據實際需求劃分size
HAL_PARTITION_OTA_TEMP OTA下載下傳固件臨時存儲區 os運作區的結束位址 一般與os運作區size相等,如使用差分更新可根據差分包的情況縮小此分區
HAL_PARTITION_PARAMETER_1 bootloader參數區 OTA_TEMP結束位址 一般是4KBytes(flash最小擦除單元)
HAL_PARTITION_PARAMETER_2 kv存儲區 PARAMETER1結束位址 一般是8KBytes
HAL_PARTITION_PARAMETER_3 使用者參數區 PARAMETER2結束位址 一般是4KBytes
HAL_PARTITION_PARAMETER_4 安全相關參數區 PARAMETER3結束位址
  • Bootloader 支援乒乓更新flash大小劃分方法;
bootloader跳轉OS運作區A的位址(假設OS運作區A的起始位址小于OS運作區B的起始位址)與晶片起始位址的內插補點
OS運作區A Bootloader跳轉位址A Bootloader跳轉位址B與Bootloader跳轉位址A內插補點(如果bootloader給出Flash的擦除範圍,以bootloader給出的size為主)
OS運作區B Bootloader跳轉位址B 一般與OS運作區A大小一緻

以上是AliOS Things的劃分Flash的基本流程和思路,在實際應用中,需要使用者結合自己的使用場景按照實際需求劃分,根據需要添加或減少分區;

如HaaS 100 增加了二級bootloader分區、二級bootloader參數區以及晶片廠家的參數區等;

名詞解釋:

單分區更新:系統隻能從一個位址啟動,在做固件更新時,隻能把固件先下載下傳到一個OTA臨時存儲區;

然後通過bootloader把固件從OTA存儲區copy到OS運作區,這種方式的更新叫單分區更新或者原地更新;

乒乓更新:系統支援從兩個位址啟動,以這兩個位址為起點劃分出兩個區域假設為A區和B區,則系統可以運作在A區也可以運作在B區。

系統做固件更新時,隻需要把固件放到A或者是B區,bootloader隻需要切換跳轉位址就可以實作新程式的運作,不需要copy固件。

這種更新方式為乒乓更新或者AB分區更新;

注意:

已經劃分好并且在使用的分區表盡量不要修改,否則可能會造成資料丢失;

其中不能更改bootloader相關分區,如一級bootloader,二級bootloader,以及其對應的參數區。

另外,也不能更改os運作區以及ota存儲區的起始位址;

如果客戶需要添加自定義分區,分區ID号需要在分區表索引定義的尾部順次添加不能中間插入;

新添加的分區,需要考慮分區起始位址及分區大小是否與其他分區有重疊;

3、使用者自定義分區

了解到上面的分區規則,以HaaS100為例,使用者可根據自己需求,劃分自己的分區;

通過概述了解到HaaS100已經将16MBytes的flash全部劃分完成,如果再劃分使用者的自定義分區,且不影響所有存儲的資料,可以考慮從KV分區劃分出來;

假設使用者需要4KBytes Flash空間,已知KV分區size為52k,結束位址為:0xFFE000;為了保護KV已存資料,新分區應從尾部劃分;

即:新分區起始位址為:0xFFE000 - 0x1000 = 0xFFD000;size = 0x1000;接下來在代碼添加分區,操作如下:

  • 添加分區ID

分區ID号為枚舉值,具體在AliOS-Things/include/aos/hal/flash.h34行 hal_partition_t 中,新增的分區ID号在如下圖的地方添加即可;

HaaS100 Flash分區劃分說明
  • 添加新增分區資訊

假設定義使用者新增分區ID号枚舉名稱為HAL_PARTITION_USER_TEST,參考AliOS-Things/platform/board/haas100/config/partition_config.c檔案中第4行的hal_partitions[]分區表,建立新增的分區資訊,如下代碼:

[HAL_PARTITION_USER_TEST] =
{
        .partition_owner          = HAL_FLASH_EMBEDDED,
        .partition_description    = "USER TEST", //for KV module
        .partition_start_addr     = 0xFFD000,
        .partition_length         = 0x1000, //4K bytes
        .partition_options        = PAR_OPT_READ_EN | PAR_OPT_WRITE_EN,
},           

然後将上面的分區資訊,按順序添加到如下圖處:

HaaS100 Flash分區劃分說明

完成上面兩步驟完成使用者自定義的分區劃分;

4、開發者技術支援

如需更多技術支援,可加入釘釘開發者群,或者關注微信公衆号

HaaS100 Flash分區劃分說明

更多技術與解決方案介紹,請通路阿裡雲AIoT首頁

https://iot.aliyun.com/

繼續閱讀