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/

相关文章
|
存储 芯片
ESP-IDF Modbus从站例子
ESP-IDF Modbus从站例子
269 1
|
网络协议 安全 网络安全
DDoS有什么有效预防措施
抵御DDoS攻击的方法包括:使用高性能网络设备和硬件防火墙;避免NAT以保持通信效率;确保充足网络带宽;升级服务器硬件;采用静态或伪静态网页;增强OS的TCP/IP栈;安装专业防火墙;备份网站并使用CDN。考虑云服务商的高防IP服务以提升防护级别。综合应用这些策略可有效防止DDoS攻击。
1392 1
|
数据可视化 前端开发 JavaScript
本来不想分享的,但这套可视化大屏确实不错
本来不想分享的,但这套可视化大屏确实不错
|
机器学习/深度学习 人工智能 自然语言处理
AWS宣布提供Claude 3模型访问
【2月更文挑战第16天】AWS宣布提供Claude 3模型访问
248 2
AWS宣布提供Claude 3模型访问
|
存储 数据采集 边缘计算
Link Edge 介绍| 学习笔记
快速学习 Link Edge 介绍
1018 0
|
前端开发
SpringBoot+vue实现文件下载
SpringBoot+vue实现文件下载
598 0
|
存储 缓存 前端开发
Android 架构之 MVI 雏形 | 响应式编程 + 单向数据流 + 唯一可信数据源(下)
Android 架构之 MVI 雏形 | 响应式编程 + 单向数据流 + 唯一可信数据源
592 1
|
存储 C# Windows
C#基础知识入门:从零起步学习C#语言
C#基础知识入门:从零起步学习C#语言
405 1
|
SQL IDE API
PyCharm 发布了新版,支持最新 Python 3.11 和 PyScript 框架
PyCharm 发布了新版,支持最新 Python 3.11 和 PyScript 框架
|
Oracle 关系型数据库
Oracle实例启动失败 ORA-27300 ORA-27301 ORA-27302 新增一个实例,信号量就不够了
我们在一个客户上进行恢复完成后,在RAC的第二个节点,Oracle实例启动失败,有下面的提示信息
319 0

热门文章

最新文章