HaaS100 Flash分區劃分說明

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_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結束地址 一般是4KBytes

 

  • Bootloader 支持乒乓升級flash大小劃分方法;
分區名 描述 起始地址 分區大小
HAL_PARTITION_BOOTLOADER bootloader 芯片的起始地址(一般爲0 ) bootloader跳轉OS運行區A的地址(假設OS運行區A的起始地址小於OS運行區B的起始地址)與芯片起始地址的差值
HAL_PARTITION_APPLICATION OS運行區A Bootloader跳轉地址A Bootloader跳轉地址B與Bootloader跳轉地址A差值(如果bootloader給出Flash的擦除範圍,以bootloader給出的size爲主)
HAL_PARTITION_OTA_TEMP OS運行區B Bootloader跳轉地址B 一般與OS運行區A大小一致
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結束地址 一般是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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章