嵌入式杂记 - MDK的Code, RO-data , RW-data, ZI-data意思

嵌入式杂记 - Keil的Code, RO-data , RW-data, ZI-data意思

  • MDK中的数据分类
  • MCU中的内部存储分布
  • MDK中数据类型存储
    • Code代码段
      • 例子
    • RO-data 只读数据段
      • 例子
    • RW-data 可读写数据段
      • 例子
    • ZI-data 清零数据段
      • 例子

在嵌入式开发中,我们经常都会使用一些IDE,例如 MDKIAR。在这些IDE编译完成之后,通常会在编译界面中会出现如下的数据,很多初学者会对这些数据不太熟悉,本篇文章就以 MDK为例简单介绍一下这几个数据的意思,IAR也是类似。

在这里插入图片描述

MDK中的数据分类

  • Code:意思为工程中可执行的代码容量,通常为工程中所有被调用的函数的容量。
  • RO-data:意思为工程中的只读数据容量,通常为工程中被调用的全局常量数据和全局常量字符串的容量。
  • RW-data:意思为工程中的已初始化的全局数据(初始值不为0)容量,通常为工程中被调用的全局初始化数据和静态全局初始化数据的容量。
  • ZI-data:意思为工程中的未初始化的全局数据(或初始值为0)容量,通常为工程中被调用的全局未初始化数据和静态全局未初始化数据的容量。

MCU中的内部存储分布

在一个MCU中,其内部存储通常会分成两部分,一个是FLASH,另一个是RAM。其中FLASH的特点是存储的数据不易丢失,即使系统掉电数据也不会丢失,而RAM的特点是数据掉电就会丢失。通常一个MCU的FLASH和RAM大小会在数据手册中进行说明
在这里插入图片描述

在这里插入图片描述

从数据手册中可以看到,STM32F40X的SRAM理论上有192KB的FLASH可用,但实际只有128KB。而FLASH则有1MB的容量可以使用。
在MDK中我们也需要设置FLASH和SRAM的容量大小。
在这里插入图片描述

MDK中数据类型存储

Code代码段

MDK中的Code代码段指的是工程中所有被调用的函数容量。Code代码段是存储在MCU中的FLASH

例子

在这里插入图片描述
在工程中我们定义了一个add函数,但是没有被调用,此时编译工程,Code代码段的容量为2960字节。
在这里插入图片描述
当我们调用add函数时,再重新编译工程,此时Code代码段大小变成了2972字节。Code代码段大小增加了。我们也可以打开工程的map文件,map文件中记录的工程中的函数和数据的存储位置。可以看到add函数被放到了0x08000227这个地址,这个地址也正是FLASH中的地址,说明函数是被放到FLASH中。
在这里插入图片描述

RO-data 只读数据段

MDK中的RO-data只读数据是指的是工程中所有被调用的全局常量数据和全局常量字符串数据的容量。RO-data只读数据是存储在MCU中的FLASH

例子

在这里插入图片描述

当我们调用两个全局常量数据时,再重新编译工程,此时RO-data数据的大小变成了4436字节。我们也可以打开工程的map文件,可以看到g_test_data被放到了0x08000d3c这个地址,g_test_str被放到了0x08001cdc这个地址,这两个地址是FLASH中的地址,说明数据是被放到FLASH中。
在这里插入图片描述
在这里插入图片描述

RW-data 可读写数据段

MDK中的RW-data可读写是指的是工程中所有被调用的已经初始且初始化不为0的全局数据的容量。RO-data只读数据是存储在MCU中的RAM中。

例子

在这里插入图片描述

在工程中我们定义了一个4000字节的全局数组并初始化不为0,但是没有被调用,此时编译工程,RW-data数据的容量为40字节。
在这里插入图片描述
当我们调用全局数据时,再重新编译工程,此时RW-data数据的大小变成了4040字节。我们也可以打开工程的map文件,可以看到g_test_data被放到了0x20000000这个地址,这个地址是RAM中的地址,说明数据是被放到RAM中。
在这里插入图片描述

ZI-data 清零数据段

MDK中的ZI-data数据是指的是工程中所有被调用的不初始或初始化为0的全局数据的容量。ZI-data只读数据是存储在MCU中的RAM

例子

在这里插入图片描述

在工程中我们定义了一个4000字节的全局数组不初始化,但是没有被调用,此时编译工程,ZI-data数据的容量为1632字节。

在这里插入图片描述
当我们调用全局数据时,再重新编译工程,此时ZI-data数据的大小变成了5632字节。我们也可以打开工程的map文件,可以看到g_test_data被放到了0x20000028这个地址,这个地址是RAM中的地址,说明数据是被放到RAM中。
在这里插入图片描述

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

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

相关文章

Hadoop学习笔记(HDP)-Part.17 安装Spark2

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Web前端 ---- 【Vue】Vuex的使用(辅助函数、模块化开发)

目录 前言 Vuex是什么 Vuex的配置 安装vuex 配置vuex文件 Vuex核心对象 actions mutations getters state Vuex在vue中的使用 辅助函数 Vuex模块化开发 前言 本文介绍一种新的用于组件传值的插件 —— vuex Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态…

浅谈前端代码里的命名规范与注释

浅谈前端代码里的命名规范与注释 在前端代码中,命名规范和注释是非常重要的。它们不仅有助于提高代码的可读性和可维护性,还可以帮助开发者之间更好地协作和沟通。下面是一些关于命名规范和注释的常见建议: 命名规范: 使用有意义…

【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库

之前的文章有讲述基于SQL Server创建企业级地理数据库,本文讲述在SQL Server中创建常规的关心数据库,然后在ArcGIS Pro中将其启用,转换为企业级地理数据库。 1. 在SQL Server中创建数据库** 打开SQL Server 2019,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…

python中的lambda关键字

对于一切很模糊的知识,首要的是抓住概念的定义。 lambda:在 Python 中用于创建匿名函数的关键字。 也即,lambda是一种关键字,这种关键字的作用是创建匿名函数。 这一段很好懂,就是匿名函数有点懵。 什么是匿名函数&…

mybatis-plus构造器查询

文章目录 Hutool工具包Vo与entity转换多表分页查询构造器:查询构造器:拼接构造器:删除操作构造器:修改操作查询关键字 Hutool工具包Vo与entity转换 BeanUtils:copyProperties(vo, entity),vo转实体类。 L…

在装有 PostgreSQL 14 的 Red Hat8上安装 `pg_cron`

要在装有 PostgreSQL 14 的 Red Hat、CentOS、Fedora 或 Amazon Linux 上安装 pg_cron,请遵循以下步骤。这些步骤假定您已经安装了 PostgreSQL Global Development Group (PGDG) 的 PostgreSQL 版本。 安装 pg_cron 扩展 使用 yum 安装 pg_cron 扩展:s…

(四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法(TTA&#xf…

基于SSH的java记账管理系统

基于SSH的java记账管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型:Java EE项目 项目名称:基于SSH的记账管理系统 项目架构:B/S架构 开发语言:Java语言 前端技术:HTML、CS…

初识优先级队列与堆

1.优先级队列 由前文队列queue可知,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,在此情况下,使用队列queue显然不…

git常用命令指南

目录 一、基本命令 1、创建分支 2、切换分支 3、合并分支 4、初始化空git仓库 二、文件操作 1、创建文件 2、添加多个文件 3、查看项目的当前状态 4、修改文件 5、删除文件 6、提交项目 三、实际操作 1、创建目录 2、进入新目录 3、初始化空git仓库 4、创建文…

C++STL的string模拟实现

文章目录 前言string的成员变量成员函数构造函数拷贝构造赋值重载 模拟实现string各种接口print迭代器普通迭代器const迭代器 string比较大小push_backinsert 和 eraseinserterase reserve和resizereserveresize swapfindcout和cincoutcin 前言 今天要讲string的底层实现&…

总线(什么是南北桥?您都用过哪些总线?)

什么是总线? 计算机系统中的总线(Bus)是指计算机设备和设备之间传输信息的公共数据通道,是连接计算机硬件系统内多种设备的通信线路,它的一个重要特征是由总线上的所有设备共享,因此可以将计算机系统内的多…

python基于轻量级GhostNet模型开发构建23种常见中草药图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了,感兴趣的话可以自行移步阅读: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

Vue 核心 数据监听 computed | watch

Vue 核心 数据监听 computed | watch 一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 (演示&…

缺陷责任期与质量保修期如何快速区分?

缺陷责任期 《建设工程质量保证金管理办法》第二条对缺陷给出了定义,是指建设工程质量不符合工程建设强制性标准、设计文件,以及承包合同的约定。缺陷责任期是指承包人对工程质量瑕疵担保的期限,由发承包双方在合同中进行约定,期…

制造业数字化转型该怎么做?这篇1.6万字的文章终于讲透了!

制造业数字化转型该怎么做?下面通过 1.6W 字干货内容,全面讲透制造业数字化转型。 (为防后续找不到,建议大家先点赞收藏~) 引言: 1、发达国家制造业回流力度加大,中国制造业战略地位提升。 …

selenium 解决 id定位、class定位中,属性值带空格的解决办法

一、前置说明 selenium遇到下面这种元素&#xff1a; <th id"demo id" class"value1 value2 value3 ">1、虽然id一般不会有空格&#xff0c;但是前端错误的这种写法(如下图)&#xff0c;会造成使用id定位不到元素&#xff0c;如&#xff1a; find…

面试遇到的一些问题(二)

1、v-if v-show 区别,他们的生命周期区别 v-show: (类似于display:none/black 的切换)不管初始值是true 或false 都会进行渲染,状态改变也不会销毁和重新生成。不会影响生命周期 v-if : 是根据条件,dom进行删除插入操作。 依附于普通元素时:会触发父组件的beforeUpdate和u…

IOday6作业

1>使用有名管道&#xff0c;完成两个进程的相互通信 //create.c #include<myhead.h>int main(int argc, const char *argv[]) {if((mkfifo("myfifo1",0664)) -1){perror("mkfifo");return -1;}if((mkfifo("myfifo2",0664)) -1){perror…