Keil 编译输出信息分析:Program size: Code, RO-data , RW-data, ZI-data

在这里插入图片描述一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在 MCU 不同的存储区。

如图所示,在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息

Program Size: Code=28866 RO-data=958 RW-data=240 ZI-data=34224 

一、这一串字符含义

答:这是keil编译程序后,打印这个程序对应的内存分配信息。
Code:是指 程序所占用的ROM大小,存储在FLASH,程序运行期间 不变,单位为字节(B),28866 B
RO-data:read only,只读常量, 程序中所定义的指令和常量占空间的大小,程序运行期间 不变,如const型,存储在FLASH中。单位为字节(B),958 B
RW-data:read/write,可读可写变量, 已被初始化的可读写变量占空间的大小,存储在FLASH中。程序运行期间 会变,初始化时RW-data从flash拷贝到SRAM。单位为字节(B),240 B
ZI-data:zero initialize, 没有被初始化的可读写变量占空间的大小,就是 程序中用到的变量并且被系统初始化为0的变量的字节数,存储在SRAM中。keil编译器默认把你没有初始化的变量都赋予一个0,这些变量在程序运行时是保存在RAM中的。程序运行期间 会变。单位为字节(B), 34224 B

简而言之
1)Code:代码段,存放程序的代码部分;
2)RO-data:只读数据段,存放程序中定义的常量;
3)RW-data:读写数据段,存放初始化为非 0 值的全局变量;
4)ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量; 

二、代码存储位置

答:简单的说就是,在烧写的时候是FLASH( ROM)中的被占用的空间为: Code+RO Data+RW Data
程序运行的时候,芯片内部 RAM使用的空间为: RW Data + ZI Data

一、为什么ROM还要存RW?

答:因为掉电后RAM中的所有数据都丢失了,每次上电RAM中的数据都被重新赋值, 每次这些固定的值就是存储在ROM中的。

二、为什么不包含ZI段呢?

答:是因为ZI 数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。 

三、MCU是怎么样的一个执行过程呢?

答:
①MCU执行过程是 先将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
②然后 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应的RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。ROM中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
		程序运行之前,需要有文件实体被烧录到 STM32 的 Flash 中,一般是 bin 或者 hex 文件,该被烧录文件称为 可执行映像文件。如图左图所示,是可执行映像文件烧录到 STM32 后的内存分布,它包含 RO 段和 RW 段两个部分:其中 RO 段中保存了 Code、RO-data 的数据,RW 段保存了 RW-data 的数据,由于 ZI-data 都是 0,所以未包含在映像文件中。
		STM32 在上电启动之后 默认从 Flash 启动,启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中, 但不会搬运 RO 段,即 CPU 的执行代码从 Flash 中读取,另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零。
		 其中动态内存堆为未使用的 RAM 空间,应用程序申请和释放的内存块都来自该空间。 

在这里插入图片描述

参考文章

http://t.csdn.cn/j7fQn
http://t.csdn.cn/Fo6oJ

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI+无代码助力企业供应链优化

内容来自演讲:潘峰 | 预见明日科技(北京)有限公司 | CEO 摘要 本文介绍了企业供应链中的挑战和解决方案。文章指出,供应链成本占企业经营成本的大部分,且存在供给端和需求端的高度不确定性。为应对这种不确定性&…

Embedding压缩之基于二进制码的Hash Embedding

推荐系统中,ID类特征的表示学习(embedding learning)是深度学习模型成功的关键,因为这些embedding参数占据模型的大部分体积。这些模型标准的做法是为每一个ID特征分配一个unique embedding vectors,但这也导致存储emb…

【QT 5 调试软件+(Linux下验证>>>>串口相关初试串口)+Windows下qt代码在Linux下运行+参考win下历程+基础样例】

【QT 5 调试软件Linux下验证>>>>串口相关初试串口参考win下历程基础样例】 1、前言2、实验环境3、先行了解4、自我总结-win下工程切到Linux下1、平台无关的代码:2、依赖的库:3、文件路径和换行符:4、编译器差异:5、构…

揭秘高效大型语言模型:技术、方法与应用展望

近年来,大型语言模型(LLMs)在自然语言处理领域取得了显著的进展,如GPT-series(GPT-3, GPT-4)、Google-series(Gemini, PaLM), Meta-series(LLAMA1&2), BLOOM, GLM等模型在各种任务中展现出惊人的能力。然而,随着模…

IDC报告:国内游戏云市场,腾讯云用量规模位列第一

12月12日消息,IDC公布最新的《中国游戏云市场跟踪研究,2022H2》报告(以下简称“《报告》”)显示,腾讯云凭借全球化节点布局以及国际领先的游戏技术积累,在整体规模、云游戏流路数、CDN流量峰值带宽等多维度…

C++笔记之Delegate和委托构造(Delegating constructor)

C笔记之Delegate和委托构造辨析 code review! —— 杭州 2023-12-10 参考博文:C笔记之文档术语——将可调用对象作为函数参数 文章目录 C笔记之Delegate和委托构造辨析0.有道词典:英语发音1.ChatGPT:delegate概念详解2.Delegate和“将可调…

Python异常、模块和包

Python异常、模块和包 1.了解异常2.异常的捕获方法3.异常的传递4.Python模块5.Python包 1.了解异常 1.1什么是异常 当检测到一个错误是,Python解释器就无法继续执行了,发而出现了一些错误提示,这就是所谓的“异常”,也就是我们常…

橡胶塑料企业网站建设的作用是什么

橡胶塑料产品一般属于大额交易,对企业来说,需要不断提升品牌和拓客,但如今线下信息传播力不足,难以全面呈现内容,需要商家不断提升线上能力,获得进一步发展。 1、品牌宣传展示难 线上没有自己的平台难以将…

HTML---列表.表格.媒体元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.列表 无序列表 HTML中的无序列表&#xff08;Unordered List&#xff09;用于显示一组项目&#xff0c;每个项目之前没有特定的顺序或编号。无序列表使用<ul>标签来定义&#xff0c;每…

MTK Android P Sensor架构(一)

需求场景&#xff1a; 本来如果只是给传感器写个驱动并提供能读取温湿度数据的节点&#xff0c;是一件比较轻松的事情&#xff0c;但是最近上层应用的同事要求我们按照安卓标准的流程来&#xff0c;这样他们就能通过注册一个服务直接读取传感器事件数据了。这样做的好处就是第…

初始数据库 - 了解数据库

centos 7 版本当中安装 mysql 安装与卸载中&#xff0c;⽤⼾全部切换成为root&#xff0c;⼀旦 安装&#xff0c;普通⽤⼾是可以使用的。 卸载不需要的环境 首先&#xff0c;在安装之前&#xff0c;要先确定你当前系统当中是否已经有了mysql 的环境&#xff0c;如果你不想卸…

1838_emacs_evil中跳转到任意字符evil-avy-goto-char的功能分析

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 1838_emacs_evil中跳转到任意字符evil-avy-goto-char的功能分析 avy是一个比较成熟的emacs的插件&#xff0c;可以实现快速跳转到指定的字符位置的功能…

数据在网络中是怎么传输的?

计算机通信场景大致如下所示&#xff1a; 1.同一个子网中两台计算机通信 2.不属于同一个子网&#xff0c;两台计算机进行通信 以下内容&#xff0c;将围绕这两种场景进行阐述&#xff0c;在阐述之前&#xff0c;先举个场景示例&#xff0c;帮助大家理解一些名词 场景一&…

机器学习---Boosting

1. Boosting算法 Boosting思想源于三个臭皮匠&#xff0c;胜过诸葛亮。找到许多粗略的经验法则比找到一个单一的、高度预 测的规则要容易得多&#xff0c;也更有效。 预测明天是晴是雨&#xff1f;传统观念&#xff1a;依赖于专家系统&#xff08;A perfect Expert) 以“人无…

Reinfocement Learning 学习笔记PartⅠ

文章目录 Reinfocement Learning一、基本概念二、贝尔曼公式&#xff08;bellman equation&#xff09;2.1 为什么return重要2.2 state value function的定义2.3 贝尔曼公式推导2.4 如何求解贝尔曼公式2.5 Action value的定义 三、贝尔曼最优公式&#xff08;bellman optimalit…

HarmonyOS—实现UserDataAbility

UserDataAbility接收其他应用发送的请求&#xff0c;提供外部程序访问的入口&#xff0c;从而实现应用间的数据访问。Data提供了文件存储和数据库存储两组接口供用户使用。 文件存储 开发者需要在Data中重写FileDescriptoropenFile(Uriuri,Stringmode)方法来操作文件&#xf…

在做题中学习(32):只出现一次的数字 III

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; 根据题目可知&#xff1a;有两个元素只出现一次&#xff0c;其余出现两次。 而在只出现一次的数字 I 里&#xff0c;只有一个元素出现一次&#xff0c;可以用异或的方式直接得到最后的答案&#xff0c;而此…

PaddleOCR:超越人眼识别率的AI文字识别神器

在当今人工智能技术已经渗透到各个领域。其中&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;技术将图像中的文字转化为可编辑的文本&#xff0c;为众多行业带来了极大的便利。PaddleOCR是一款由百度研发的OCR开源工具&#xff0c;具有极高的准确率和易…

Linux嵌入式配置USB鼠标支持+触摸板

在linux嵌入式中加入鼠标支持&#xff0c;首先在内核里面将mice驱动加入编译&#xff0c;这里用到的是usb所以还要有usb的支持&#xff0c;下载到板子上启动 1、定位鼠标 要用鼠标&#xff0c;首先要知道生成的鼠标设备是哪个&#xff0c;直接直接ls input目录&#xff0c;当…

2023.12.6-12.11 黑马知行教育项目实战,访问咨询意向线索主题

目录 简单介绍: 一.项目背景介绍 二.项目架构介绍 三.项目内容 3.1访问和咨询分析主题: 3.1.1 表与表之间的关联 3.1.2访问咨询主题需求汇总:最终需在ADS层制作六张表 3.1.3 访问咨询DWS大宽表建表与导入数据 3.2意向线索主题需求分析 3.2.1意向线索主题需求汇总:最终需在…