HaaS100 Flash分区划分说明

简介: HaaS100是一款针对IoT场景的公板,除了有前面介绍的丰富的外设外,其存储空间也很大,内部Flash空间有16MBytes;HaaS 100的存储空间是通过分区表来管理的,这张表包括一级bootloader区、二级bootloader区、OS运行A区、OS 运行B区以及相关parameters区。
来源 | HaaS技术社区

1、概述

HaaS100是一款针对IoT场景的公板,除了有前面介绍的丰富的外设外,其存储空间也很大,内部Flash空间有16MBytes;

HaaS 100的存储空间是通过分区表来管理的,这张表包括一级bootloader区、二级bootloader区、OS运行A区、OS 运行B区以及相关parameters区。

如下图是HaaS 100的分区表,图中已标注各分区的起始地址、分区size以及各分介绍:

image.png

上图的分区表与 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.png

  • 添加新增分区信息

假设定义用户新增分区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.png

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

4、开发者技术支持

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

image.png

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

相关文章
|
1月前
|
存储 Go 文件存储
M.2移动硬盘打造Win To Go系统:高效分区存储文件全攻略
【10月更文挑战第12天】本文详细介绍了如何使用M.2移动硬盘制作Win To Go系统。首先,需准备合适容量与接口类型的M.2硬盘及硬盘盒,并获取Windows镜像文件和分区工具。接着,通过Rufus软件将镜像写入硬盘。文中还提供了分区策略,包括系统分区(约80-120GB)、软件分区(根据需求设定)和数据分区(剩余空间),并指导如何使用DiskGenius或Windows自带工具进行分区。最后,强调了对各分区文件的有效管理和定期备份的重要性。
|
6月前
|
存储 Linux 内存技术
嵌入式linux下获取flash分区大小
嵌入式linux下获取flash分区大小
72 0
|
存储 芯片 内存技术
STM32速成笔记(十二)—Flash闪存
本文简单介绍了什么是Flash。针对STM32F1的Flash做了详细介绍,介绍了操作Flash的步骤,并且给出了程序设计。最后,介绍了一些注意事项。
147 0
STM32速成笔记(十二)—Flash闪存
|
存储 Ubuntu Linux
嵌入式Linux系列第5篇:Nand Flash根文件系统制作
嵌入式Linux系列第5篇:Nand Flash根文件系统制作
|
安全 Unix Linux
关于嵌入式Linux系统flash分区设计及文件系统格式选择的一些浅见
嵌入式系统应用程序升级是比较频繁的,对于flash的合理划分与文件系统选型就显得尤为关键。
367 0
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
359 0
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
|
编译器 Linux C语言
PCI配置空间简介
一、PCI配置空间简介 PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。
3151 0
下一篇
无影云桌面