FLASH,SRAM与Program Size: Code=46286 RO-data=1698 RW-data=560 ZI-data=39960关系

当涉及到嵌入式系统或者微控制器的程序大小时,通常会涉及到不同类型的数据以及它们在内存中的存储方式。这些指标对于程序员和系统设计者来说非常重要,因为它们有助于了解程序在特定硬件环境下的内存使用情况。

Code:指的是程序代码的总大小,通常存储在FLASH等非易失性存储器中,用于存储程序的执行代码。在这个例子中,代码大小为46286字节。

RO-data:指只读数据,包括程序中的常量数据和只读变量等,它们在程序运行期间不会被修改。这些数据通常存储在FLASH等存储器中。在这个例子中,只读数据大小为1698字节。

RW-data:指读写数据,即在程序运行期间可以修改的数据,通常存储在RAM中。在这个例子中,读写数据大小为560字节。

ZI-data:指零初始化数据,这部分数据在程序加载时会被初始化为零值或空值。它们通常存储在RAM中。在这个例子中,零初始化数据大小为39960字节。

这些数据大小可以帮助开发者了解程序在存储器中的分布情况,有助于优化程序以减少内存占用,并确保程序在给定的硬件环境下正常运行。优化代码大小和内存使用可以提高系统性能,并确保在资源受限的嵌入式系统中有效地运行。


eg:
256K Flash >= Code(程序代码) + RO-data(常量和只读变量)

64K SRAM >= RW-data(可以修改的数据,变量) + ZI-data(初始化为0,null的变量)


常量和只读变量在概念上有些微妙的区别,尽管它们都表示在程序运行期间值不会改变的数据,但在C语言中,这两个概念有着不同的实现方式和使用方式:

常量(Constants)
#define 或 const 声明的值:常量是指在程序中一经定义后,其值在整个程序运行期间都不会改变的数据。可以使用 #define 预处理指令或 const 关键字来定义常量。
文本替换或编译时计算:#define 创建的常量是在编译器预处理阶段进行简单的文本替换,而 const 声明的常量会被编译器视为一个具有确定值的变量。
全局替换:#define 常量是全局替换,而 const 常量在编译器中可能会有一些内存空间。
不具备类型:#define 常量通常不具有特定的类型信息,而 const 常量会根据其声明的类型而被编译器识别。
常量是在程序执行过程中其值不能改变的量。在C语言中,有两种方式定义常量:

使用 #define 预处理指令:通过 #define 定义常量,这种常量在程序中会被编译器进行简单的文本替换。例如:

#define PI 3.14159

这里的 PI 被定义为常量,其值为3.14159。在程序中所有出现 PI 的地方都会被替换为 3.14159。


只读变量(Read-only Variables)
使用 const 关键字声明:只读变量是使用 const 关键字声明的变量,它们在定义后不可再修改其值。
变量性质:尽管在概念上看起来像常量,但只读变量本质上仍然是变量,占用内存空间,而且具有特定的类型信息。
更多类型检查:由于是变量,只读变量拥有更多的类型信息和编译时检查,因此更安全。
在实践中,常量和只读变量的选择取决于程序的需要。常量适用于那些在编译时就已经确定并且在整个程序中不会改变的值,而只读变量则更适合表示在程序运行时期间不能修改的值,但需要更多类型检查和更精确的定义。

“只读变量”通常指的是在程序运行时其值不能被修改的变量。在C语言中,通过使用关键字 const 可以创建只读变量。这样的变量一经赋值就不能被修改。

const int readOnlyVar = 10;

在上面的例子中,readOnlyVar 被声明为一个只读变量,它的值被初始化为10,并且在程序的其余部分不能再被修改。这种变量通常被用于存储程序中的常量值或者一些在程序执行期间不应该改变的数据。


什么是RW-data(Read-Write Data)
RW-data(Read-Write Data)是指在程序执行期间可以读取和写入的数据段。这些数据通常存储在RAM(随机存取存储器)中,并且可以在程序的执行过程中进行读写操作。

在C语言中,包括全局变量、静态变量和局部变量在内的大部分变量都属于RW-data。这些变量的内存空间在程序运行时被分配,可以进行读写操作,其值可以随着程序的执行而改变。

例如:

int globalVar=3; // 全局变量,属于RW-data,可以被读取和写入
void someFunction() {static int staticVar=4; // 静态变量,属于RW-data,可以被读取和写入int localVar=5; // 局部变量,也存在于堆栈中,属于RW-data,可以被读取和写入// ...
}

在这个例子中,globalVar 是一个全局变量,staticVar 是一个静态变量,localVar 是一个局部变量,它们都属于RW-data。这些变量的值可以在程序运行期间被读取和修改。RW-data中的数据是可变的,程序可以在执行过程中对这些变量进行读写操作。


什么是ZI-data
在程序运行期间,ZI(Zero-Initialized)数据段用于存储在程序加载时被初始化为零值或空值的变量。这些变量在程序开始执行前就被初始化,因此称为“零初始化”数据。

在C语言中,全局范围内声明的静态变量(或全局变量)如果没有显式初始化,会被默认初始化为零值(0 或 NULL,具体取决于变量的类型)。这些变量所占用的存储空间在程序启动时会被分配,并且初始值会被设为零。

int globalVar; // 全局范围内声明的int类型变量,会被初始化为0(ZI-data)

在上述例子中,globalVar 是一个全局变量,如果没有被显式初始化,它将会被初始化为零值,即ZI-data。ZI-data在程序加载时被操作系统或加载器初始化,这确保了这些变量在程序启动时具有确定的初始状态。

ZI-data通常存储在RAM的BSS(Block Started by Symbol)段中,这个段在程序加载时会被操作系统或加载器清零并分配内存。这个段中的变量在程序运行期间可以被修改,但它们在程序开始执行前已经具有默认的零值。


区别:

在典型的C语言中,全局变量(比如 int globalVar)既可以属于RW-data(可读写数据),也可以属于ZI-data(零初始化数据),这取决于变量是否在定义时被显式地初始化。

如果全局变量在定义时没有被显式地初始化,则它将被默认认为是ZI-data,即在程序加载时将会被初始化为零值。
如果全局变量在定义时被显式地初始化了(例如 int globalVar = 0;),则它不再属于ZI-data,而是具有明确的初始化值,即使这个值是零。在这种情况下,它仍然属于RW-data,可以被读取和写入。
下面是一个例子:

int globalVar1; // 没有显式初始化,默认属于ZI-data,会被初始化为零值
int globalVar2 = 10; // 显式初始化为非零值,属于RW-data,初始值为10void someFunction() {static int staticVar; // 没有显式初始化,默认属于ZI-data,会被初始化为零值// ...
}

总的来说,全局变量的归类取决于其是否被显式地初始化。如果没有显式初始化,它们会被认为是ZI-data,会在程序加载时被初始化为零值。如果显式初始化了,它们将是具有明确初始值的RW-data。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重组蛋白表达系统的比较-卡梅德生物

一、重组蛋白表达是什么? 重组蛋白表达是通过基因工程手段将目标蛋白基因导入宿主细胞,使其表达出特定的蛋白。该过程包括以下步骤: 1. 构建表达载体:将目标蛋白基因插入表达载体中,通常选择带有启动子、终止子和选择…

支付宝、学习强国小程序input、textarea数据双向绑定

前言 和 vue 的绑定有些区别,需要注意。直接 value"{{inputValue}}" 是无法双向绑定的。 正确思路 文档说的比较详细,不过没有组合使用的案例,需要自行理解。这里正确的方法是先用 value 绑定数据,再使用 onInput 事件…

鸿蒙的基本项目_tabbar,首页,购物车,我的

以上效果,由四个ets文件实现,分别是容器页面。首页,购物车,我的。 页面里的数据,我是用json-server进行模拟的数据。 一、容器页面 使用组件Tabs和Tabcontent结合。 import Home from "./Home"; import …

短剧付费变现小程序源码系统:开通会员+在线充值+风口项目,变现利器+完整的代码包 附带部署安装教程

在当今数字化时代,短剧付费变现小程序源码系统已经成为了一个热门的风口项目。它以开通会员、在线充值、完整的代码包等特色功能,成为了一种有效的变现利器,受到了广泛的关注和应用。本文将详细介绍这个源码系统的背景和特色功能,…

实现阿里云oss云存储,简单几步

一、前言 虽然平常学习用的不多&#xff0c;但是用的时候再去找官方文档&#xff0c;也很繁琐&#xff0c;不如直接整理以下&#xff0c;方便粘贴复制&#xff0c;本文介绍两种图片上传方式①普通上传②服务端签名直传 1.普通上传 加载maven依赖 <dependency><grou…

Vue生命周期钩子函数

生命周期钩子&#xff0c;生命周期函数&#xff0c;生命周期事件&#xff08;不同名称&#xff0c;同一含义&#xff09; 含义&#xff1a;在Vue组件从创建到销毁的整个过程中&#xff0c;在不同时间节点可以自动执行的函数 整个过程分为三个部分&#xff1a;创建阶段&#x…

centos 安装oracle 11.2.04 并配置数据库自启动操作记录,一次完成

环境&#xff1a; centos版本7.3&#xff0c;安装的有图形化界面 Oracle11.2.04&#xff0c;之所以选择这个版本是因为网上有人说11其他版本的在安装的过程中会出现这样或那样的问题&#xff0c;下载地址放到文章下面 步骤&#xff0c;按顺序&#xff1a; 1、创建安装Oracle…

mybatis中的xml语法

MyBatis 是一个半自动化的ORM(对象关系映射)框架。它通过 XML 或注解的方式将指令映射到数据库操作。在 MyBatis 中,XML 映射文件定义了数据库操作的细节。以下是 MyBatis XML 映射文件的详细语法。1. 基本结构 MyBatis 的 XML 映射文件包含以下几个基本元素: : 这是根元素…

万用表测接地电阻方法

万用表测接地电阻方法 用万用表在不同土质的土壤对接地电阻进行了实验&#xff0c;并将万用表所测数据和专用接地电阻测试仪所测数据进行了比较&#xff0c;两者十分接近。具体测量方法如下&#xff1a; 找两根8mm、1m长的圆钢&#xff0c;将其一端磨尖作为辅助测试棒&#x…

SQL备忘--Like/逻辑运算/Order By排序/Top N特殊处理备忘

1. Like 模糊查询 基本语法 在where 条件中使用LIKE关键字进行匹配 WHERE c1 LIKE ‘%end’ //可以匹配到“friend”等单词 匹配模式 百分号&#xff08;%&#xff09;&#xff1a; 表示匹配零个或多个任意字符下划线&#xff08;_&#xff09;&#xff1a;表示匹配一个任意…

电镀污水处理设备主要特点及工艺流程

诸城市鑫淼环保小编带大家了解一下电镀污水处理设备主要特点及工艺流程 常见的一体化污水处理设备工艺有化学工艺、物理工艺、生物工艺和电化学法等。 电镀厂污水处工艺一&#xff1a; 化学工艺法&#xff0c;是指采用化学氧化还原反应和沉淀反应&#xff0c;将电镀废水中有毒有…

Mysql之视图

Mysql之视图 常见的数据库对象视图概述为什么使用视图视图的理解创建视图创建单表视图别名的运用 创建多表联合视图利用视图对数据进行格式化contact 函数以视图为基&#xff0c;再创建新的视图 查看视图更新视图的数据一般情况不可更新的视图 修改和删除视图修改视图删除视图注…

MySQL查询当天本周上周本月上月季度今年的数据

1. 当日 select 字段 from 表名 where 时间字段 BETWEEN CONCAT(CURDATE(), 00:00:00) AND CONCAT(CURDATE(), 23:59:59); 2. 昨天 SELECT * FROM day_sell WHERE TO_DAYS(NOW()) - TO_DAYS(sell_time) < 1 3. 近七天 SELECT * FROM day_sell WHERE DATE_SUB(CURDATE()…

【C#】Visual Studio 2022 远程调试配置教程

在某些特殊的情况下&#xff0c;开发机和调试机可能不是同一台设备&#xff0c;此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹&#xff0c;用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …

什么是阿里云负载均衡SLB?

目录 硬件或软件负载均衡的区别是什么&#xff1f; 什么是阿里云负载均衡SLB&#xff1f; 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么&#xff1f; 通过专用硬件实现负载均衡&#xff0c;那么整体成本会较高&#xff0c;而且设备容易出现单点故障&#xff0c;…

【MySQL】InnoDB和MyISAM区别

文章目录 一、索引不同1 InnoDB聚簇索引&#xff0c;MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键&#xff0c;MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…

Elasticsearch中复制一个索引数据到新的索引中

问题 我有时候&#xff0c;需要调试一个已经存在的ES索引&#xff0c;需要从已有的索引复制数据到新的索引中去。 解决 这里我借助一个GUI工具&#xff0c;来解决这个问题&#xff0c;底层它是使用Reindex的API实现索引数据复制的。 步骤 选中已存在的redix菜单&#xff0…

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…

KEPServerEX 6 之【外篇-1】PTC-ThingWorx服务端软件安装 Tomcat10本地安装

本文目标: 安装 Java 和 Apache Tomcat ,为ThingWorx安装做基础。 ----------------------------------------------------------------------- 安装重点 --------------------------------------------------------------------- 1. 安装 Java 11 / JDK 11 添加系…

SSRF中Redis的利用

目录 1. SSRF 1.1 什么是SSRF 1.2 漏洞成因 1.3 可能会存在SSRF的地方 1.4 SSRF分类 1.5 验证方法 1.6 利用方式 1.7 可以利用的协议 1.8 SSRF过滤绕过 2. SSRF攻击Redis 2.1 环境搭建 2.2 漏洞复现(通过ssrf利用redis写入webshell) 2.2.1 想要写入webshell的两个…