RO、RW和ZI数据解析
Keil编译成功的最后会有如下信息,便是程序代码的数据信息:
相关概念:Code,RO_data,RW_data,ZI_data,RO,RW,常出现在嵌入式程序编译完成后的统计,例如MDK,IAR,ARM GCC。
Code:即代码域,它指的是编译器生成的机器指令。
RO_data:ReadOnly data,即只读数据域,它指程序中用到的只读数据,全局变量,例如C语言中const关键字定义的全局变量就是典型的RO-data。
RW_data:ReadWrite data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如全局变量或者静态变量,且定义时赋予“非0值”给该变量进行初始化。
ZI_data:ZeroInitialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW_data的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。包括未初始化的全局变量,和初始化为0的全局变量。
RO:只读区域,包括RO_data和code。
映像文件(image)的组成
映像文件就是指烧录到ROM中的bin文件,也称为image文件。以下用Image文件来称呼它。
Image文件包含了RO和RW数据。
之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。而之所以image文件中必须包含RO和RW数据是因为RO中的指令和常量以及RW中的初始化过的变量不会像ZI那样无中生有
因此要烧录到芯片中的image文件和实际运行的程序之间是不能划等号的!
当程序执行时, RW_data和 ZI_data在RAM中,RO_data和code视cpu架构(51、arm、x86)不同处于ROM或者RAM中。其中ZI_data对应了BSS段,RW_data对应数据段,code对应代码段, RO_data对应数据段。
一个程序本质上都是由bss段、data段、text段三个组成的。
**bss段:**bss段属于静态内存分配。 bss是英文Block Started by Symbol的简称。 BSS段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0,所以,未初始的全局变量在程序执行之前已经成0了。特点是:可读写的,
**data段:**数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
**text段:**代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
**堆(heap):**堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
**栈(stack):**栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出(FIFO)特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
RO、RW和ZI数据解析相关推荐
- ARM中的RO、RW和ZI DATA
一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将 ...
- stm32 ARM中的RO、RW和ZI DATA
一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将 ...
- KEIL MDK中的RO、RW和ZI
KEIL MDK中的RO.RW和ZI DATA理解及KEIL中ROM和RAM使用大小计算 (2013-12-25 09:33:06) 转载▼ 标签: it 分类: 嵌入式相关 本文来源与网络 http ...
- stm32 RO RW ZI
1.RO段包括只读代码段(code段/.text段)和常量段(RO Data段/.constdata段). 2.RW段(.data段)指已被初始化成非0值的变量段. 3. ZI段(.bss段)指 ...
- CODE RO RW ZI
一直以来对于ARM体系 中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该 有不少人也有和我同样的困惑,因 ...
- CODE RO RW ZI的区别
一直以来对于ARM体系 中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该 有不少人也有和我同样的困惑,因 ...
- RO,RW,ZI,FLASH,RAM前世今生
好久没写博客,-.-. 因为接触两个新的平台,芯翼和OPL,又发现对内存和flash分布的一些疑问,或许是自己根基不够稳吧,如果要搞清楚这些的意义,需要以下几个步骤: 2.RO,RW,ZI 是什么 3 ...
- 了解RO、RW、ZI和.text .bss .data
了解RO,RW和ZI 1.RO段包括只读代码段(code段/.text段)和常量段(RO Data段/.constdata段). 2.RW段(.data段)指已被初始化成非0值的变量段. 3. ...
- 堆栈、BSS段、代码段、数据段/RO、RW、ZI
嵌入式_堆栈.BSS段.代码段.数据段/RO.RW.ZI 提示:这里只针对ARM嵌入式系统所说,PC端和其他系统不议 文章目录 嵌入式_堆栈.BSS段.代码段.数据段/RO.RW.ZI 前言 一.代码 ...
- Keil编译产生的RO,RW和ZI是什么
转载自: http://sdjntl.spaces.eepw.com.cn/articles/article/item/80656 要了解RO,RW和ZI需要首先了解以下知识: 1.ARM程序的组成: ...
最新文章
- Xcode中的NSLog详解
- python将控制台输出保存至文件
- 5G 信令流程 — MM 定时器
- c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...
- Python中使用pip安装库时提示:远程主机强迫关闭了一个现有的连接
- 阿里云MVP乔帮主:五大类型负载均衡的原理场景详解(文末赠书)
- 开机更新配置怎么关闭计算机,Win7关闭开关机的Windows Update配置()制作方法
- 人工智能兼职讲师内训讲师叶梓对sony技术部进行CV计算机视觉培训
- 算法导论第八章练习参考答案
- Socket编程之聊天室
- Andriod Studio创建数据库并查看自己创建的数据库
- 快速翻译整篇pdf外文文献
- 下等人薄情,中等人深情,上等人……
- kubectl认证 授权 准入控制
- 抖音三农号创作者具体应该如何做?
- css背景图铺满整个屏幕
- 银河移民PHP面试,移民香港,我真的“后悔死了”
- 集成电路专业术语简介
- 影像测量—摄影测量和RTK原理
- 《软件测试》读书笔记(持续更新)
热门文章
- PAT乙级真题 1092 最好吃的月饼 C++实现
- java:输入小写字母转为大写字母
- 独孤求败剑学考证 zz
- Python计算贝塔系数和夏普比率
- 开水团2023届实习笔试
- 中国 2017 Google 开发者大会来了!
- Excel计算个人所得税公式
- 实用:python字符编码之间的转化(来猜猜博主的真实姓名)
- python 绘制损失函数曲线_绘制loss曲线
- 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8