1、概述
HaaS100是一款針對IoT場景的公板,除了有前面介紹的豐富的外設外,其存盤空間也很大,內部Flash空間有16MBytes;
HaaS 100的存盤空間是通過磁區表來管理的,這張表包括一級bootloader區、二級bootloader區、OS運行A區、OS 運行B區以及相關parameters區,
如下圖是HaaS 100的磁區表,圖中已標注各磁區的起始地址、磁區size以及各分介紹:

上圖的磁區表與 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號在如下圖的地方添加即可;
- 添加新增磁區資訊
假設定義用戶新增磁區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,
},
然后將上面的磁區資訊,按順序添加到如下圖處:
完成上面兩步驟完成用戶自定義的磁區劃分;
4、開發者技術支持
如需更多技術支持,可加入釘釘開發者群

更多技術與解決方案介紹,請訪問阿里云AIoT首頁https://iot.aliyun.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240892.html
標籤:其他
