ARM固件小白入门:RO、RW、ZI到底是什么?
2026/6/26 15:30:08 网站建设 项目流程

ARM固件小白入门:RO、RW、ZI到底是什么?

每次Keil编译完都会看到这几个东西:

Code: 50480 RO-data: 8280 RW-data: 456 ZI-data: 12340

RO、RW、ZI到底是什么意思?用大白话讲清楚。


一、两个仓库

嵌入式芯片有两种存储:

  • Flash— 像书柜。断电后内容还在,但读写慢。
  • RAM— 像白板。断电就擦干净了,但读写快。

程序运行的时候,代码和数据分别放在这两个地方。


二、RO — 只读数据

RO 就是Read-Only,只读的意思。

包括你的代码常量,比如:

const int max = 100;

这些东西上电后就放在 Flash 里,CPU 直接读。只占 Flash,不占 RAM。


三、RW — 有初值的变量

RW 就是Read-Write,可读可写。

比如这种给了初始值的全局变量:

int score = 0;

Flash 里存一个模板:"score 的初值是 0"。

上电的时候,把这个模板抄到 RAM 里去。之后程序在 RAM 里改 score = 99。

Flash 和 RAM 都占。


四、ZI — 没初值的变量

ZI 就是Zero-Initialized,初始化为零。

比如这种没给初始值的全局变量:

int temp;

Flash 里只记一条:"给 temp 留个位置"。

上电的时候在 RAM 里圈一块地,全部写成 0。

只占 RAM,不占 Flash。


五、上电启动流程

芯片上电 │ ▼ 1. 把 RW 的初值从 Flash 拷贝到 RAM 2. 把 ZI 的区域在 RAM 里全部清零 │ ▼ 3. 跳转到 main() 开始执行你的代码

六、怎么算空间

Flash 占用 = RO + RW RAM 占用 = RW + ZI

举个例子,STM32F407(1MB Flash,192KB RAM):

RO = 200KB,RW = 10KB,ZI = 50KB

Flash 用了 200 + 10 = 210KB,还剩很多

RAM 用了 10 + 50 = 60KB,也够


七、总结

什么意思举个例子占 Flash?占 RAM?
RO只读代码、const 常量不占
RW有初值的变量int x = 5
ZI没初值的变量int y不占

记住两句话:

RW 是 Flash 和 RAM 都占的,最费资源。

RAM 不够先查 ZI,Flash 不够先查 RO。


有问题欢迎评论区交流。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询