HaaS100 Flash分割槽劃分說明
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.h
34行 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/
相關文章
- 配置FLASH分割槽
- Seven 儲存結構與磁碟劃分 主分割槽交換分割槽的作用!
- hive分割槽分桶Hive
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- Zabbix系統MySQL資料庫分割槽表的設定--精簡說明MySql資料庫
- AliosThings的Flash劃分規則iOS
- MySql分表、分庫、分片和分割槽MySql
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Apache Spark:分割槽和分桶 - NiveditaApacheSpark
- Linux分割槽方案、分割槽建議Linux
- hive分割槽和分桶你熟悉嗎?Hive
- GIT分支管理規劃說明Git
- oracle分割槽表和分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- win10硬碟分割槽怎麼分_win10系統如何對硬碟分割槽Win10硬碟
- Linux 分割槽擴容(根分割槽擴容,SWAP 分割槽擴容,掛載新分割槽為目錄)Linux
- win10分割槽好了怎麼刪除_win10分割槽完後如何刪除Win10
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- Oracle11gR2 Smart Flash Cache測試說明Oracle
- win10分割槽使用mbr好還是gpt好_win10系統gpt分割槽和mbr分割槽的區別Win10GPT
- win10系統硬碟分割槽怎麼分 win10硬碟分割槽教程圖解Win10硬碟圖解
- oracle分割槽表和非分割槽表exchangeOracle
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- hive 分割槽表和分桶表區別Hive
- oracle分割槽表的分類及測試Oracle
- 資料分頁說明
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- 分割槽Partition
- lvs 分割槽
- openGauss 分割槽
- Kafka 分割槽Kafka
- mysql 分割槽MySql
- Linux 新增LVM分割槽及LVM分割槽擴容LinuxLVM
- MySql資料分割槽操作之新增分割槽操作MySql
- Hive的靜態分割槽與動態分割槽Hive
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle