嵌入式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

相关文章

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存