跳转至

Flash 与 RAM


存储布局概述

WS53 的存储布局包括 Flash 分区和 RAM 内存分配:

  • Flash:保存掉电后仍需保留的引导镜像、应用镜像和数据,按用途划分分区。
  • RAM:承载程序运行时的代码、数据、栈、堆及共享缓冲区,由链接配置和运行时分配共同组织。

默认 Flash 布局由 src/build/config/target_config/ws53/param_sector/param_sector.json 描述,使用 4 MiB 空间。按地址从低到高,主要分为五部分:

  1. 引导与基础参数区:保存根公钥、SSB、出厂配置、NV 备份和两份 FlashBoot。
  2. APP 镜像区:保存 Ccore、Acore 镜像;分区表中的 0x20 范围包含 0x21。
  3. 升级镜像或数据区:0x22 对应 Acore_imageB / FOTA data,具体使用方式由升级方案决定。
  4. 客户预留区:默认只有 0x30 分配了 28 KiB,其他客户预留条目尚未分配空间。
  5. 诊断与 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 为:

["0x21", "0x0005D000", "0x00213000"]

长度为分区占用的字节数。本节使用分区配置中的 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、设备模式和诊断模式等配置会改变内存边界。

参考