飞道的博客

HaaS100 Flash分区划分说明

317人阅读  评论(0)

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[]分区表,创建新增的分区信息,如下代码:

  
  1. [HAL_PARTITION_USER_TEST] =
  2. {
  3. .partition_owner = HAL_FLASH_EMBEDDED,
  4. .partition_description = "USER TEST", //for KV module
  5. .partition_start_addr = 0xFFD000,
  6. .partition_length = 0x1000, //4K bytes
  7. .partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_EN,
  8. },

然后将上面的分区信息,按顺序添加到如下图处:

完成上面两步骤完成用户自定义的分区划分;

 

4、开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/


转载:https://blog.csdn.net/HaaSTech/article/details/111715175
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场