HaaS100 Flash分割槽劃分說明

HaaS技術社群發表於2020-12-26

1、概述

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

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

如下圖是HaaS 100的分割槽表,圖中已標註各分割槽的起始地址、分割槽size以及各分介紹:

image

上圖的分割槽表與 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_BOOTLOADERbootloader晶片的起始地址(一般為0 )bootloader的跳轉地址與晶片起始地址的差值
HAL_PARTITION_APPLICATIONOS執行區Bootloader跳轉地址使用者根據實際需求劃分size
HAL_PARTITION_OTA_TEMPOTA下載韌體臨時儲存區os執行區的結束地址一般與os執行區size相等,如使用差分升級可根據差分包的情況縮小此分割槽
HAL_PARTITION_PARAMETER_1bootloader引數區OTA_TEMP結束地址一般是4KBytes(flash最小擦除單元)
HAL_PARTITION_PARAMETER_2kv儲存區PARAMETER1結束地址一般是8KBytes
HAL_PARTITION_PARAMETER_3使用者引數區PARAMETER2結束地址一般是4KBytes
HAL_PARTITION_PARAMETER_4安全相關引數區PARAMETER3結束地址一般是4KBytes

 

  • Bootloader 支援乒乓升級flash大小劃分方法;
分割槽名描述起始地址分割槽大小
HAL_PARTITION_BOOTLOADERbootloader晶片的起始地址(一般為0 )bootloader跳轉OS執行區A的地址(假設OS執行區A的起始地址小於OS執行區B的起始地址)與晶片起始地址的差值
HAL_PARTITION_APPLICATIONOS執行區ABootloader跳轉地址ABootloader跳轉地址B與Bootloader跳轉地址A差值(如果bootloader給出Flash的擦除範圍,以bootloader給出的size為主)
HAL_PARTITION_OTA_TEMPOS執行區BBootloader跳轉地址B一般與OS執行區A大小一致
HAL_PARTITION_PARAMETER_1bootloader引數區OTA_TEMP結束地址一般是4KBytes(flash最小擦除單元)
HAL_PARTITION_PARAMETER_2kv儲存區PARAMETER1結束地址一般是8KBytes
HAL_PARTITION_PARAMETER_3使用者引數區PARAMETER2結束地址一般是4KBytes
HAL_PARTITION_PARAMETER_4安全相關引數區PARAMETER3結束地址一般是4KBytes

 

以上是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號在如下圖的地方新增即可;
    image
  • 新增新增分割槽資訊
    假設定義使用者新增分割槽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,
},

然後將上面的分割槽資訊,按順序新增到如下圖處:
image

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

 

4、開發者技術支援

如需更多技術支援,可加入釘釘開發者群

更多技術與解決方案介紹,請訪問阿里雲AIoT首頁https://iot.aliyun.com/

相關文章