跳转至

内存布局

本文档描述 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 可在栈溢出时触发异常
  • 避免在任务函数内定义大数组(应使用堆分配或静态分配)

内存池优先级

当系统内存紧张时,按以下优先级缩减:

  1. 先检查应用层是否有内存泄漏
  2. 缩减文件系统的缓冲区
  3. 缩减 Wi-Fi / BLE / SLE 内存池(会影响吞吐量)
  4. 减少任务栈大小(需评估确认不溢出)

如何查看内存使用

// 查看当前堆使用情况
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);

参考