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/