Flash 与 RAM
存储布局概述
WS53 的存储布局包括 Flash 分区和 RAM 内存分配:
- Flash:保存掉电后仍需保留的引导镜像、应用镜像和数据,按用途划分分区。
- RAM:承载程序运行时的代码、数据、栈、堆及共享缓冲区,由链接配置和运行时分配共同组织。
默认 Flash 布局由 src/build/config/target_config/ws53/param_sector/param_sector.json 描述,使用 4 MiB 空间。按地址从低到高,主要分为五部分:
- 引导与基础参数区:保存根公钥、SSB、出厂配置、NV 备份和两份 FlashBoot。
- APP 镜像区:保存 Ccore、Acore 镜像;分区表中的
0x20范围包含0x21。 - 升级镜像或数据区:
0x22对应 Acore_imageB / FOTA data,具体使用方式由升级方案决定。 - 客户预留区:默认只有
0x30分配了 28 KiB,其他客户预留条目尚未分配空间。 - 诊断与 NV 数据区:Flash 尾部保存死机信息和非易失性数据。
分区 ID 与地址的关系
分区 ID 用于标识分区用途,不表示地址或偏移。 分区 ID 的枚举定义见 partition_ids_t,其中 PARTITION_APP_IMAGE = 0x21 表示 Acore 应用镜像。分区存储位置通过分区表查询。
Flash 分区 ID 仅用于 Flash 分区,不用于标识 RAM 中的链接段。
分区配置文件 param_sector.json 中,Partition_Tbl 对象下的 param_info 数组记录各分区参数,每项依次包含三个字段:
| 字段 | 含义 | Acore 应用镜像示例 |
|---|---|---|
| 分区 ID | 用于区分分区用途 | 0x21 |
| 起始偏移 | 相对于 Flash 起点的位置,单位为字节 | 0x0005D000 |
| 长度 | 分区占用的字节数 | 0x00213000 |
对应的 JSON 为:
长度为分区占用的字节数。本节使用分区配置中的 Flash 偏移,CPU 映射地址见后文。
Flash 偏移结束位置(不含)= Flash 起始偏移 + 长度
以 ID 0x21 为例:
起始偏移 0x05D000,长度 0x213000
Flash 偏移结束位置 = 0x05D000 + 0x213000 = 0x270000
实际 Flash 偏移范围为 [0x05D000, 0x270000),最后一个字节的偏移是 0x26FFFF
完整枚举定义见 src/middleware/chips/ws53/partition/include/partition_resource_id.h 中的 partition_ids_t。软件通过 ID 查找分区信息,相关接口见分区管理 API。
Flash 默认分区布局
默认分区 ID 清单
长度为零的条目不占用 Flash。
| 分区 ID | 名称 | Flash 起始偏移 | CPU 映射起始地址 | 大小 | 默认用途或状态 |
|---|---|---|---|---|---|
0x00 |
SSB | 0x002000 |
0x402000 |
24 KiB | 二级安全引导 |
0x01 |
FlashBoot | 0x020000 |
0x420000 |
64 KiB | 引导程序 |
0x02 |
FlashBoot backup | 0x010000 |
0x410000 |
64 KiB | FlashBoot 备份 |
0x03 |
Root public key | 0x000000 |
0x400000 |
2 KiB | 安全启动根公钥;其后有 6 KiB 间隙 |
0x08 |
Customer factory | 0x008000 |
0x408000 |
16 KiB | 客户出厂配置 |
0x09 |
NV Backup | 0x00C000 |
0x40C000 |
16 KiB | NV 数据备份 |
0x10 |
NV DATA | 0x3FC000 |
0x7FC000 |
16 KiB | 非易失性数据 |
0x11 |
Crash info | 0x3FA000 |
0x7FA000 |
8 KiB | 死机信息 |
0x20 |
Ccore_imageA | 0x030000 |
0x430000 |
2304 KiB | 表中范围覆盖整个 APP 镜像区,包含 0x21 |
0x21 |
Acore_imageA | 0x05D000 |
0x45D000 |
2124 KiB | Acore 应用镜像 |
0x22 |
Acore_imageB / FOTA data | 0x270000 |
0x670000 |
1548 KiB | 用途由升级配置决定 |
0x30 |
rsv0 for customer | 0x3F3000 |
0x7F3000 |
28 KiB | 客户预留区 |
0x31 |
rsv1 | 0x000000 |
— | 0 | 未分配空间 |
0x32 |
rsv2 | 0x000000 |
— | 0 | 未分配空间 |
0x33 |
rsv3 | 0x000000 |
— | 0 | 未分配空间 |
0x34 |
预留条目 | 0x000000 |
— | 0 | 未分配空间;当前枚举无同名项 |
分区表状态:
0x23(PARTITION_CCPU_IMAGE_BACKUP/ Ccore_imageB)在枚举和 JSON 说明中有定义,但不在当前配置文件的param_info数组中,默认没有分配空间。0x31~0x34存在于当前表中,但长度为零;其中0x34尚无对应的具名枚举。- 分区管理数量为 16,当前表包含 16 项;客户预留 ID 为
0x30~0x34。
CPU 映射地址
Flash 映射基址为 0x400000,CPU 地址换算如下:
CPU 映射起始地址 = 0x400000 + Flash 起始偏移
CPU 映射结束地址(不含)= 0x400000 + Flash 偏移结束位置
ID 0x21 → CPU 映射范围 [0x45D000, 0x670000)
按地址排列的布局
0x400000 ┌──────────────────────────────┐
│ Root public key 2 KiB │ ID 0x03
0x400800 ├──────────────────────────────┤
│ 未分配间隙 6 KiB │ 无分区 ID
0x402000 ├──────────────────────────────┤
│ SSB 24 KiB │ ID 0x00
0x408000 ├──────────────────────────────┤
│ Customer factory 16 KiB │ ID 0x08
0x40C000 ├──────────────────────────────┤
│ NV Backup 16 KiB │ ID 0x09
0x410000 ├──────────────────────────────┤
│ FlashBoot backup 64 KiB │ ID 0x02
0x420000 ├──────────────────────────────┤
│ FlashBoot 64 KiB │ ID 0x01
0x430000 ├──────────────────────────────┤
│ Ccore_imageA │ ID 0x20, 2.25 MiB
0x45D000 │ ┌ Acore_imageA │ ID 0x21,与 ID 0x20 重叠
│ │ │
0x670000 ├─┴────────────────────────────┤
│ Acore_imageB / FOTA data │ ID 0x22
0x7F3000 ├──────────────────────────────┤
│ Customer reserve 28 KiB │ ID 0x30
0x7FA000 ├──────────────────────────────┤
│ Crash info 8 KiB │ ID 0x11
0x7FC000 ├──────────────────────────────┤
│ NV DATA 16 KiB │ ID 0x10
0x800000 └──────────────────────────────┘
APP 镜像区的包含关系
默认表中 0x20 名为 Ccore_imageA,范围是 [0x430000, 0x670000);0x21 名为 Acore_imageA,范围是 [0x45D000, 0x670000)。
memory_config_common.h 中的 Ccore 镜像范围从 0x430000 起、长度为 0x2D000,Acore 镜像范围从 0x45D000 起、长度为 0x213000;两者程序区域的定义还会扣除 CODE_INFO_OFFSET 等镜像头部或启动区开销。分区表描述镜像存放范围,链接配置进一步描述其中程序可使用的区域。
调整分区容量:调整 Flash 分区
RAM 内存分配
以下数值取自当前 src/output/ws53/acore/ws53_liteos_app/application.map;不同 Kconfig、SDK 版本和业务组件会改变实际占用。
RAM 总体布局
| 地址范围 | 分配大小 | 当前使用情况 | 区域内容 |
|---|---|---|---|
0x00019C00~0x0001FFFF |
25 KiB | ROM 固定区域 | Acore ROM 符号和固化代码 |
0x00020000~0x0002FFFF |
64 KiB | 当前使用到 0x0002F8CB,剩余 1844 B |
App ITCM (Instruction Tightly Coupled Memory) 代码 |
0x20010000~0x2005FFFF |
320 KiB | 固定段使用 34288 B,系统堆 293392 B | App DTCM (Data Tightly Coupled Memory) 数据、固定栈和 LiteOS 堆 |
0x20060000~0x20063FFF |
16 KiB | 平台共享区 | Acore 与 Ccore 共享内存 |
0x20067F00~0x20067FFF |
256 B | .preserve 使用 252 B |
复位或异常流程保留的诊断数据 |
0x52006000~0x520067F3 |
2036 B | .cputrace_mem 使用 2028 B |
CPU Trace 缓冲区 |
App DTCM 详细分配
| 起始地址 | 大小 | 链接段或区域 | 说明 |
|---|---|---|---|
0x20010000 |
2 KiB | .stacks |
启动及固定栈区域 |
0x20010800 |
184 B | .plt_sramdata |
平台 SRAM 初始化数据 |
0x200108C0 |
1064 B | .plt_flashdata |
平台 Flash 初始化数据 |
0x200111A0 |
440 B | .bth_flashdata |
蓝牙 Host 初始化数据 |
0x20011358 |
572 B | .data |
普通初始化数据 |
0x20011598 |
924 B | .plt_srambss |
平台零初始化数据 |
0x20011938 |
24829 B | .wifi_flashbss |
Wi-Fi 相关零初始化数据 |
0x20017A38 |
3000 B | .bss |
普通 BSS 数据 |
0x200185F0 |
293392 B | LiteOS 系统堆 | 任务栈、OSAL 动态对象和运行时缓冲区从此申请 |
任务栈与动态缓冲区
普通 LiteOS 任务栈没有固定链接地址,由系统堆在运行时分配。g_app_tasks[] 中平台任务的栈申请大小如下;任务是否存在取决于对应编译条件。
| 任务 | 栈申请大小 | 编译条件 |
|---|---|---|
app |
2 KiB(0x800) |
始终创建 |
app_sample |
2 KiB(0x800) |
CONFIG_SAMPLE_ENABLE |
log |
2 KiB(0x800) |
非设备模式且使用非压缩日志 |
cmd_loop |
4 KiB(0x1000) |
TEST_SUITE |
bt_sdk |
2 KiB(0x800) |
BTH_TASK_EXIST 与 BTH_SDK_TASK_SUPPORT |
bt_service |
2.5 KiB(0xA00) |
BTH_TASK_EXIST |
at |
4 KiB(0x1000) |
AT_COMMAND |
wifi |
8 KiB(0x2000) |
CONFIG_SUPPORT_WIFI |
ohos_start |
4 KiB(0x1000) |
CONFIG_SUPPORT_OHOS_SUPPORT |
LiteOS 内核任务、工作队列和中间件自行创建的任务也会占用系统堆。CONFIG_MCU_MODE_2、CONFIG_MCU_MODE_3、CONFIG_MCU_MODE_4、设备模式和诊断模式等配置会改变内存边界。