首页 > 其他分享 >数据段和代码段相关

数据段和代码段相关

时间:2024-05-12 11:08:32浏览次数:22  
标签:初始化 RW ZI data 代码段 相关 RO 数据

1、实际上,对于在STM32F103这类资源紧缺的单片机芯片中:

  • 代码段保存在Flash上,直接在Flash上运行(当然也可以重定位到内存里)
  • 数据段暂时先保存在Flash上,然后在使用前被复制到内存里(只读数据段(RO data)不复制)
  • 函数入口地址、函数参数、临时变量、const修饰的局部常量在运行到对应代码的时候放入栈中。

2、

C语言的内存管理

C语言程序分为映像和运行两种状态,经过编译连接后形成的映像由:代码段(text) 数据段(data 包括RO data ,RW data), 其他段(调试的段,动态库共享库链接表的段)组成。
可执行文件在内存运行时由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成。

KEIL编译输出信息

KEIL工程的编译提示输出信息中有一个语句“Program Size:Code=xx RO-data=xx RW-data=xx ZI-data=xx”,它说明了程序各个域的大小。

  1. Code:即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。

  2. RO-data:Read Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。例如C语言中const关键字定义的变量就是典型的RO-data。

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

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

  5. ZI-data的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。

RW-data和ZI-data它们仅仅是初始值不一样而已,为什么编译器非要把它们区分开?因为ZI-data也是需要从flash复制到ram,可以节省flash空间。

3、STM32硬件相关

ROM(FLASH) = Code + RO-data +RW-data;
RAM size = RW-data + ZI-data;
Code运行的时候把函数地址、函数参数、函数返回值、局部变量、const修饰的局部变量放入栈内。

 



                        

 

标签:初始化,RW,ZI,data,代码段,相关,RO,数据
From: https://www.cnblogs.com/icaowu/p/18187581

相关文章

  • H2 数据库介绍(1)--简介
    H2是一个使用Java编写的数据库,支持内存、文件等数据存储模式,可用于测试及Demo应用;本文主要介绍其基本概念及安装。1、H2特点速度很快、开源、JDBCAPI嵌入式和服务器模式;基于磁盘或内存的数据库事务支持,多版本并发基于浏览器的控制台应用程序加密数据库全文搜索纯......
  • [转帖]openGauss数据库性能调优
    https://www.modb.pro/db/29135 概述本文描述了openGauss数据库基于Taishan服务器,在openEuler操作系统上,为了达到数据库的极致性能,所依赖的关键系统级调优配置。硬件规格:CPU:鲲鹏-920(1620)ARMaarch6464核*2内存:>=512G磁盘:NvmeSSD*4(每块大于1TB)网卡:......
  • USB 设备相关的注册表项通常存储在 Windows 操作系统的注册表数据库中。这些注册表项
    USB设备相关的注册表项通常存储在Windows操作系统的注册表数据库中。这些注册表项包含有关连接到计算机上的USB设备的配置信息。以下是一些常见的USB设备相关的注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB:这个键包含有关已连接到计算机的USB......
  • java MySQL的in查询两个字段同时相等的多个数据查询
    在Java中想进行下面的查询,不想写循环一条条查selectid,name,address,age fromuserswherename='A' and address='addr1'selectid,name,address,age fromuserswherename='B' and address='addr2'selectid,name,address,age fromusers......
  • 分布式存储故障导致数据库无法启动故障处理---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:分布式存储故障导致数据库无法启动故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]国内xx医院使用了国外医疗行业龙头的pacs系统,由于是一个历史库,存放在分布式存储中,由于......
  • 在 Kubernetes 上运行 Apache Spark 进行大规模数据处理的实践
    在刚刚结束的KubernetesCommunityDay上海站,亚马逊云科技在云原生分论坛分享的“在Kunernets上运行ApacheSpark进行大规模数据处理实践”引起了现场参与者的关注。开发者告诉我们,为了充分利用Kubernetes的高可用设计、弹性,在越来越多的应用场景中,他们选择从Yarn迁移到......
  • 数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGB
    全文链接:https://tecdat.cn/?p=34434原文出处:拓端数据部落公众号分析师:ShilinChen离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。解决方案任务/目标采用分类这一方法构建6种模型对职......
  • MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|
    原文链接:http://tecdat.cn/?p=26318原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于长短期记忆(LSTM)神经网络的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络对序列数据的每个时间步长进行分类。要训​​练深度神经网络对序列数据......
  • 【视频】R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险|数据分享|附代码数据
    原文链接:http://tecdat.cn/?p=22410 最近我们被客户要求撰写关于逻辑回归的研究报告,包括一些图形和统计输出。本文介绍了逻辑回归并在R语言中用逻辑回归(Logistic回归)模型分类预测病人冠心病风险数据逻辑回归是机器学习借用的另一种统计分析方法。当我们的因变量是二分或二元时......
  • 数据结构学习笔记-递归求解森林高度
    森林的高度递归求解问题描述:设计算法求解森林的高度【算法设计思想】两个函数,一个用于计算单个二叉树的高度,另一个用于计算二叉树森林(即一组二叉树)的最大高度。下面是对两个函数的详细解释:1.treeHeight函数这个函数用于计算单个二叉树的高度。二叉树的高度定义为从根节点到......