Keil MDK 编译输出内存分段详解
Program Size: Code=12976 RO-data=252 RW-data=4 ZI-data=1004

这是 ARM 单片机(Keil)标准内存统计,对应 Flash、RAM 两大块存储。

1. 各字段对应存储段

Code = 12976

只读程序代码段(.text)

  • 存放:所有函数指令、if/for/while 逻辑、中断服务函数
  • 存储位置:Flash(ROM),掉电不丢失
  • 单位:字节,这里占用 12976 字节 Flash

RO-data = 252

只读常量数据段(.rodata)RO = Read Only 存放:

  1. const全局 / 静态常量
  2. 字符串字面量(你代码里LOG("val= %d\n")这类字符串)
  3. 只读数组常量
  • 存储位置:Flash
  • 只读,运行中不可修改

RW-data = 4

已初始化全局 / 静态变量(.data)RW = Read Write 存放:全局 /static 局部、初始值≠0的变量 例:

c

运行

int g_a = 100; static int s_b = 5;
  • 编译时:初始值存在 Flash;
  • 上电启动时:拷贝到 RAM 中运行;
  • 占用:Flash 存初始值 4 字节,RAM 占用 4 字节。

ZI-data = 1004

零初始化数据段(.bss)ZI = Zero Initialized 存放两类:

  1. 全局 /static 局部变量,未初始化 或 初始值 = 0
  2. 全局大数组、静态缓冲区 上电后启动代码自动全部清 0,Flash 不占用空间,只占用 RAM 1004 字节

2. RAM 总占用计算公式

运行时芯片 RAM 总开销 = RW-data + ZI-data 这里:4 + 1004 =1008 字节 RAM

3. Flash 总占用计算公式

固件烧录 Flash 总大小 = Code + RO-data + RW-data 12976 + 252 + 4 =13232 字节 Flash

4. 补充区分

  1. 函数内普通局部变量(unsigned int val=100;):栈 Stack
    • 不计入 Code/RO/RW/ZI,栈是运行时动态分配,编译统计不体现;
  2. static unsigned int val=100;:计入 RW-data;
  3. static unsigned int val;:计入 ZI-data;
  4. const char str[]="abc";:计入 RO-data。

5. 总结

  • Flash 固件大小:13232 字节
  • 全局静态变量占用 RAM:1008 字节
  • 代码 + 常量字符串:12976+252 字节存在 Flash
  • RW=4:只有 4 字节带初始值的全局静态变量
  • ZI=1004:大量未初始化全局 / 静态数组、变量