【STM32】Keil MDK 中的 Code、RO-data、RW-dat、ZI-data 是什么?分别放在哪里?

文章详细介绍了C语言程序在STM32单片机中如何被划分为Code、RO-data、RW-data和ZI-data段,以及它们在ROM和RAM中的存储位置。Code段包含执行代码,存储在ROM;RO-data为只读数据,如const变量和全局常量,也存于ROM;RW-data是可读写且初始化的变量,存在于RAM;ZI-data是未初始化或初始化为0的数据,也在RAM中,且在启动时由ROM拷贝到RAM。文章强调了在选择单片机时需确保ROM和RAM的大小能容纳这些段的总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          C语言中有栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。

  • Code存放在ROM
  • RO-data存放在ROM
  • RW-dat存放在RAM
  • ZI-data存放在RAM

单片机初始化时RW-data从flash拷贝到RAM

生成的map文件位于list文件夹下 (KEIL)

  • Total RO  Size (Code + RO Data)            
  • Total RW  Size (RW Data + ZI Data)             
  • Total ROM Size (Code + RO Data + RW Data)  

Code:通常是指编译器生成的机器指令,也就是程序的执行代码,这些内容会被存储到ROM区

RO-data:它指程序中用到的只读数据,因而程序不能被修改的内容,这些数据被存储在ROM区。 RO-data区典型:
例1、C语言中const关键字定义的变量。
例2、C语言中定义的全局常量。
例3、C语言中定义的字符串。

RW-data:即可读写数据区域,一定是初始化为“非0值”的可读写数据,而且应用程序可以修改其内容,这些数据被存储在RAM区
RW-data区典型:
例1、C语言中定义的全局变量,且初始化为“非0值”。
例2、C语言中定义的静态变量。且初始化为“非0值”。

ZI-data的栈空间 (Stack) 及堆空间 (Heap):编译器给出的 ZI-data 占用的空间值中包含了堆栈的大小 (经实际测试,若程序中完全没有使用 malloc 动态申请堆空间,编译器会优化,不把堆空间计算在内)。 可读写数据区域,一定是未初始化或初始化为“0值”的可读写数据,应用程序同样可以修改其内容,这些数据被存储在RAM区
ZI-data区典型:
例1、C语言中定义的数组,只定义了数组的大小,并没有给每个成员赋非0值。

以下数据节选于程序的.map文件结尾。

      Code (inc. data)      RO Data    RW Data    ZI Data      Debug   

     26260       1882        312           236             36628        656971   Grand Totals
     26260       1882        312           236             36628        656971   ELF Image Totals
     26260       1882        312           236             0                0             ROM Totals

=========================================================================

    Total RO  Size (Code + RO Data)                          26572 (  25.95kB)
    Total RW  Size (RW Data + ZI Data)                      36864 (  36.00kB)
    Total ROM Size (Code + RO Data + RW Data)      26808 (  26.18kB)

=========================================================================

总结: 在拿到一款单片机的时候,一定要明确单片机的ROM大小和RAM大小。
ROM的最小空间一定要大于: Code + RO Data + RW Data的总和;
RAM的最小空间一定要大于: RW Data + ZI Data之和

注意:
ROM就是单片机的FLASH大小
RAM就是单片机的运行内存大小
以STM32G070为例,ROM = 128kB;RAM = 36kB

————————————————
参考链接:https://blog.youkuaiyun.com/zhai17863966493/article/details/125311733

Keil 中的Code, RO-data , RW-data, ZI-data - 扁桃体也发言 - 博客园

这篇文章也不错,可以看看

http://t.csdn.cn/IdQ7Vicon-default.png?t=N176http://t.csdn.cn/IdQ7V

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值