嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)

2024-01-07 04:28

本文主要是介绍嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

嵌入式C语言–ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)

ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)

  • 嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)
    • 一. ROM(Read Only Memory)
    • 二. RAM (Random Access Memory)
    • 三. FLASH存储器
    • 四. ROM, FLASH和RAM的区别
    • 五. 单片机存储构成
      • 1)Code
      • 2)RO-data(Read Only data)
      • 3)RW-data(Read Write data)
      • 4)ZI-data(Zero Initialie data)
      • 5)ZI-data的栈空间(Stack)
      • 6)ZI-data 的堆空间(Heap)
    • 六. RW-data 和ZI-data区分
    • 七. 总结

一. ROM(Read Only Memory)

ROM全称Read Only Memory,又叫程序存储器,顾名思义,就是用来存储程序代码的。因ROM中所存数据稳定,一旦存储数据就再也无法将之改变或者删除,断电后所存数据也不会消失。一些关键数据也会存储ROM中。

二. RAM (Random Access Memory)

RAM又称随机存取存储器,存储单元的内容可按照需要随机取出或存入,且存取的速度与存储单元的位置无关。这种存储器在断电时,将丢失其存储内容,所以主要用于存储短时间使用的程序。它主要用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量(包括全局变量、局部变量、堆栈段等),都存储在RAM中。

三. FLASH存储器

Flash 存储器(FLASH EEPROM)又称闪存,快闪。它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。它于EEPROM的最大区别是,FLASH按扇区(block)操作,而EEPROM按照字节操作。FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因此适合用于做程序存储器。例如STM32的程序存储器大都是FLASH存储器。

四. ROM, FLASH和RAM的区别

对于RAM, ROM以及FLASH的区别,简单地说,在计算机中,RAM和ROM都是数据存储器。RAM是随机存取存储器,它的特点是易挥发性,即掉电失忆。ROM通常指固化存储器(一次写入,反复读取),它的特点与RAM 相反。ROM又分一次性固化、光擦除和电擦除重写两种类型。在应用中,常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据

五. 单片机存储构成

ROM大小=Code+RO-data+RW-data
RAM大小=RW-data+ZI-data,程序实际在单片机RAM中运行的数据大小。
简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code + RO-Data + RW -Data。
程序运行的时候,芯片内部RAM使用的空间为: RW-Data + ZI-Data

1)Code

Code是代码占用的空间;Code Section表示执行的代码,程序中所有的函数,存储在ROM中

2)RO-data(Read Only data)

RO-data是Read Only只读常量的大小,如const型;该区域可以用来存放Flash数据。
程序中所定义的全局常量数据,这个section存储在ROM中
C语言中const关键字定义的变量就是典型的RO-data。

3)RW-data(Read Write data)

RW-data是(Read Write) 初始化了的可读写变量的大小;
它指初始化为“非0 值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如C语言中使用定义的全局变量,且定义时赋予“非0 值”给该变量进行初始化。

4)ZI-data(Zero Initialie data)

ZI-data是没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化;
即0初始化数据,它指初始化为“0 值”的可读写数据域,它与RW-data 的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data 来对待,初始化为0)

5)ZI-data的栈空间(Stack)

栈一般存放局部变量和函数参数,从RAM的高地址,向下生长
•临时创建的局部变量存放在栈区
•函数调用时,其入口参数存放在栈区。
•函数返回时,其返回值存放在栈区。•const定义的局部变量存放在栈区。

6)ZI-data 的堆空间(Heap)

从RAM的低地址,向上生长
堆区用于存放程序运行中被动态分布的内存块,可增可减。他们的释放编译器不去管,由我们的应用程序去控制。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

六. RW-data 和ZI-data区分

RW-data和ZI-data它们仅仅是初始值不一样而已,为什么编译器非要把它们区分开?这就涉及到程序的存储状态了,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行的时候它在存储器中的表现是不一样的。

七. 总结

一个程序包含三个部分,RO段,RW段和ZI段。
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量
映像文件包含了RO和RW数据,但不包含ZI数据。是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

只有单片机的实际Flash容量大于等于程序编译后的Total ROM Size值,且单片机的实际RAM容量大于等于编译后的Total RW Size值,程序才能在单片机中正常运行。
编译器所干的事情就是把我们写的源文件按照上面说的类别分解、组合成一个个这样的块,专业词汇section(.o),链接器接下来再将这些块按照以上类别再进行组合,最后按照链接文件定义的地址信息给这些块加地址信息生成最终的elf文件,elf文件经过格式转换生成镜像。

这篇关于嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578721

相关文章

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)