内存布局
本文档描述 WS63 芯片的 Flash 分区和 RAM 内存分配方案。
Flash 分区布局
分区表定义在 build/config/target_config/ws63/param_sector/param_sector.json。Flash 基址 0x200000、总大小 8 MB,定义在 drivers/boards/ws63/evb/memory_config/include/memory_config_common.h。以下地址均为绝对地址。
Flash 基址: 0x200000, 总容量: 8 MB
绝对地址 分区 (ID)
0x200000 ┌──────────────────────────┐
│ Root public key (0x03) │ 2 KB
0x202000 ├──────────────────────────┤
│ SSB (0x00) │ 24 KB
0x208000 ├──────────────────────────┤
│ Customer factory (0x08) │ 16 KB
0x20C000 ├──────────────────────────┤
│ NV Backup (0x09) │ 16 KB
0x210000 ├──────────────────────────┤
│ FlashBoot backup (0x02) │ 64 KB
0x220000 ├──────────────────────────┤
│ FlashBoot (0x01) │ 64 KB
0x230000 ├──────────────────────────┤
│ │
│ imageA (App) (0x20) │ ~2.25 MB
│ │
0x470000 ├──────────────────────────┤
│ │
│ fota data (0x21) │ ~1.5 MB
│ │
0x5FB000 ├──────────────────────────┤
│ Crash info (0x11) │ 4 KB
0x5FC000 ├──────────────────────────┤
│ NV DATA (0x10) │ 16 KB
0x600000 └──────────────────────────┘
| 分区 ID | 分区名称 | 绝对地址 | 大小 | 说明 |
|---|---|---|---|---|
| 0x03 | Root public key | 0x200000 |
2 KB | 安全启动根公钥 |
| 0x00 | SSB | 0x202000 |
24 KB | Secure Secondary Boot |
| 0x08 | Customer factory | 0x208000 |
16 KB | 客户出厂配置 |
| 0x09 | NV Backup | 0x20C000 |
16 KB | NV 数据备份 |
| 0x02 | FlashBoot backup | 0x210000 |
64 KB | FlashBoot 备份区 |
| 0x01 | FlashBoot | 0x220000 |
64 KB | 引导程序 |
| 0x20 | imageA (App) | 0x230000 |
~2.25 MB | 主应用程序固件 |
| 0x21 | fota data | 0x470000 |
~1.5 MB | OTA 固件下载区 |
| 0x11 | Crash info | 0x5FB000 |
4 KB | 死机信息保存区 |
| 0x10 | NV DATA | 0x5FC000 |
16 KB | 非易失性数据存储 |
双镜像(A/B)布局使用
param_sector_double.json,分区偏移和大小有所不同。
RAM 内存分配
WS63 的 SRAM 划分为多个功能区域:
+------------------+ SRAM_END
| 系统栈(MSP) | 主栈指针使用的栈空间
+------------------+
| 应用堆 | malloc / free 使用的动态内存
+------------------+
| 中间件内存池 | Wi-Fi / BLE / SLE 协议栈专用内存池
+------------------+
| 内核对象池 | 任务 TCB / 信号量 / 队列等内核对象
+------------------+
| 用户任务栈 | 各应用任务的独立栈空间
+------------------+
| .bss / .data | 全局变量(初始化和未初始化)
+------------------+ SRAM_BASE
关键内存池
| 内存区域 | 配置项 | 说明 |
|---|---|---|
| 内核堆 | CONFIG_KERNEL_HEAP_SIZE |
LiteOS 内核动态分配用 |
| Wi-Fi 内存池 | CONFIG_WIFI_MEM_POOL_SIZE |
Wi-Fi 协议栈收发缓冲 |
| BLE 内存池 | CONFIG_BLE_MEM_POOL_SIZE |
BLE 协议栈连接管理和数据缓冲 |
| SLE 内存池 | CONFIG_SLE_MEM_POOL_SIZE |
星闪协议栈专用内存 |
| 应用堆 | CONFIG_APP_HEAP_SIZE |
用户代码 malloc 可用空间 |
| 用户任务栈 | CONFIG_APP_TASK_STACK_SIZE |
每个用户任务的独立栈 |
内存使用原则
栈溢出保护
- 每个任务的栈大小在创建时指定,创建前务必估算栈使用量
- 开启
CONFIG_STACK_OVERFLOW_CHECK可在栈溢出时触发异常 - 避免在任务函数内定义大数组(应使用堆分配或静态分配)
内存池优先级
当系统内存紧张时,按以下优先级缩减:
- 先检查应用层是否有内存泄漏
- 缩减文件系统的缓冲区
- 缩减 Wi-Fi / BLE / SLE 内存池(会影响吞吐量)
- 减少任务栈大小(需评估确认不溢出)
如何查看内存使用
// 查看当前堆使用情况
LOS_MemInfo *info = LOS_MemInfoGet(m_aucSysMem0);
printf("total: %u, used: %u, free: %u\n",
info->uwTotalUsedSize + info->uwTotalFreeSize,
info->uwTotalUsedSize,
info->uwTotalFreeSize);
// 查看指定任务的栈使用峰值
UINT32 peak = LOS_TaskStackPeakUsed(g_taskID);
printf("task stack peak: %u bytes\n", peak);