【C语言】单片机map表详细解析
1、RO Size、RW Size、ROM Size分别是什么
首先将map文件翻到最下面,可以看到
1.1 RO Size:只读段
Code:程序的代码部分(也就是 .text
段),它存放了程序的指令和可执行代码。
RO Data:只读数据段(也就是 .rodata
段),它存放的是程序中的只读常量和字符串字面量等。
1.2 RW Size:可读写数据段
RW Data:已初始化的全局变量和静态变量(即 .data
段),这些数据会从 Flash/ROM 中拷贝到 SRAM 中,并且可以在程序运行时被修改。
ZI Data:未初始化的全局变量和静态变量(即 .bss
段),它们在程序启动时会被自动初始化为零,并存储在 SRAM 中,但不会占用 Flash/ROM 空间。
1.3 ROM Size:整个程序需要占用的ROM 总大小
Code:程序的代码(.text
段)。
RO Data:只读数据(.rodata
段)。
RW Data:已初始化的读写数据(.data
段),虽然这些数据在运行时会被拷贝到 SRAM 中,但它们的初始值是存储在 ROM(Flash)中的。
1.4 总结
所以下载程序到 FLASH/ROM 时,空间大小为:Code + RO Data + RW Data
程序运行的时,RAM使用的空间大小为:RW Data + ZI Data
2、为什么RW Data需要存储在ROM中,ZI Data不需要
在上面,我们可以看到,RW Data 与 ZI Data 都会被拷贝到RAM中,那么为什么 RW Data 需要存储在 ROM 中,ZI Data 不需要呢?
2.1 RW Data需要存储在ROM中
RW Data 包括全局和静态变量,这些变量在程序中已经明确地赋予了初始值,这些变量在程序启动时需要被初始化为它们在代码中定义的初始值。在程序开始运行之前,变量的初始值必须从某个地方获取,并被放置在 RAM 中,因为在程序运行时,这些变量可能会被修改(因此需要位于 RAM 中)。这就引出了一个问题:这些初始值在程序启动之前需要存储在哪里?
这些变量的初始值必须存储在某个地方,以便在程序启动时能够被正确加载到 RAM 中。这些初始值需要在编译时确定,并且在程序的整个生命周期内保持不变。
因为 RAM 是易失性的(断电后会丢失数据),所以这些变量的初始值在程序启动之前必须被保存在一个非易失性的存储器中,这就是 ROM(如 Flash)。在程序启动时,启动代码会从 ROM 中将这些初始值复制到 RAM 中相应的变量位置。
2.2 为什么ZI Data不需要存储在ROM中
C/C++ 语言规范规定,未初始化的全局变量和静态变量在程序启动时会自动被设置为零。对于这些变量,程序不需要存储它们的初始值,因为它们的初始状态始终是零。
由于这些变量在启动时都会被自动初始化为零,所以它们的初始值不需要存储在 ROM 中。启动代码会在程序开始运行时自动将这些变量所在的内存区域清零,这个过程不需要依赖 ROM 中的任何数据。
2.3 总结
RW Data:包含有初始值的全局和静态变量。因为这些初始值必须在程序启动时恢复,因此它们的初始值需要存储在 ROM 中,以便启动时能将这些初始值复制到 RAM 中。
ZI Data:包含未初始化的全局和静态变量。由于它们的初始值始终是零,启动时只需清零 RAM 中相应的内存区域,因此它们的初始值不需要存储在 ROM 中。
3、Symbol Table
Symbol Table 是程序链接阶段生成的一张表,包含了程序中每个符号(变量、函数、常量等)的元数据信息。这些符号在程序执行过程中可能是代码、数据或常量,它们分别存储在不同的段(如 .text
、.data
、.bss
)中。map
文件中的符号表详细列出了这些符号的内存位置、大小及相关信息。
4、Removing Unused input sections from the image.
这是编译器和链接器在生成最终镜像时的一项优化措施。它会分析代码,移除未被使用的函数、变量、或者其他输入段,以减小最终生成的可执行文件的大小。这对于嵌入式系统非常重要,因为内存资源通常很有限。可以在图中看到,
GPIO_EXTILineConfig
:配置外部中断(EXTI)线的函数段被移除了,大小为64 bytes。
相关文章:

【C语言】单片机map表详细解析
1、RO Size、RW Size、ROM Size分别是什么 首先将map文件翻到最下面,可以看到 1.1 RO Size:只读段 Code:程序的代码部分(也就是 .text 段),它存放了程序的指令和可执行代码。 RO Data:只读…...
Java中的继承和实现
Java中的继承和实现在面向对象编程中扮演着不同的角色,它们之间的主要区别可以从以下几个方面进行阐述: 1. 定义和用途 继承(Inheritance):继承是面向对象编程中的一个基本概念,它允许我们定义一个类&…...

uniapp云打包
ios打包 没有mac电脑,使用香蕉云编 先登录香蕉云编这个工具,新建csr文件——把csr文件下载到你电脑本地: 然后,登录苹果开发者中心 生成p12证书 1、点击+号创建证书 创建证书的时候一定要选择ios distribution app store and ad hoc类型的证书 2、上传刚才从本站生成的…...
端口安全技术原理与应用
目录 概述 端口安全原理 端口安全术语 二层安全地址配置 端口模式下配置 全局模式下配置 动态学习 二层数据包处理流程 三层安全地址配置 三层数据包处理流程 端口安全违例动作和安全地址老化时间 查看命令 端口安全的注意事项 小结 概述 园区网的接入安全关系着…...

数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall
数据集-目标检测系列-鲨鱼检测数据集 shark >> DataBall 数据集-目标检测系列-鲨鱼检测数据集 shark 数据量:6k 数据样例项目地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/Te…...

数字乡村解决方案-3
1. 国家大数据战略与数字乡村 中国第十三个五年规划纲要强调实施国家大数据战略,加快建设数字中国,推进数据资源整合和开放共享,保障数据安全,以大数据助力产业转型升级和提高社会治理的精准性与有效性。 2. 大数据与数字经济 …...
WPF文本框无法输入小数点
问题描述 在WPF项目中,文本框BInding双向绑定了数据Text“{UpdateSourceTriggerPropertyChanged}”,但手套数据是double类型,手动输入数据时,小数点输入不进去 解决办法: 在App.xaml.cs文件中添加语句: …...
R开头的后缀:RE
RE表示方位上的向后,一种时空上的折返,和表示否定意味的不。 68.re- 空间顺序 ①表示"向后,相反,不" RE表示正向抵抗的力的词语,和情绪的词语,用来表示一种极力的反抗和拒绝,包括…...
Vue2配置环境变量的注意事项
在实际开发中时常会遇到需要开发环境与生产环境中一些参数的替换,为了方便线上线下环境变量切换可以利用node中的process进行环境变量管理 实现步骤如下: 1.在 根目录 新增环境文件 .env.development 和 .env.production 注意文件名称保持一致( 需要强调的是文件中的变量名切…...

机器学习:探索未知边界,解锁智能潜力
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 在这个日新月异的科技时代,机器学习作为人工智能领域的核心驱动力,正以前所未有的速度改变着我们的世界。从智能家居的个性化推荐到自动驾驶汽车的精准导航,从医疗诊断的辅助…...

万户OA-ezOFFICE fileUpload.controller 任意文件上传漏洞复现
0x01 产品描述: 万户OA(Office Automation)是一款企业级协同办公管理软件,旨在为企业提供全面的办公自动化解决方案。万户ezOFFICE存在任意文件上传漏洞。攻击者可以通过该远程下载任意文件到目标服务器,导致攻击者可获…...

Time-MoE : 时间序列领域的亿级规模混合专家基础模型
Time-MoE : 时间序列领域的亿级规模混合专家基础模型 时间序列预测一直是量化研究和工业应用中的重要课题。随着深度学习技术的发展,大规模预训练模型在自然语言处理和计算机视觉领域取得了显著进展,但在时间序列预测领域,这些模型的规模和运…...
Spring Boot入门指南
前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。本文将详细介绍 Spring Boot 的基本概念、环境搭建、第一…...
MYSQL(学习笔记)
<div>深分页怎么优化?</div> <div>还是以上面的SQL为空:select * from xxx order by id limit 500000, 10;</div> <div>方法一:</div> <div>从上面的分析可以看出,当offset非常大时&am…...

学校周赛(1)
A - Short Sort 题目: 思路: 本条题目只允许改一处地方,只有三个字母,我们可以直接枚举所有移动过的结果,同时使用哈希去记录其值,对于每一个输入我们都寻找是否有这个值记录,有则输出YES否则…...

人生苦短,我用Python✌
面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么,翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit() 新建文本文档后缀改成py 编写 运行 安装编写代码…...
uniapp js判断key是否在json中?
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
Codeforces Round 975 (Div. 2) C. Cards Partition
题目链接:题目 大意: 给出若干种卡片,每种卡片有一定数量,你可以加入不超过 k k k张任意已给出种类的卡片,使得它们可以被分成若干组,每组容量一定,且同组内不存在相同种类的卡片,…...

Qt 首次配置 Qt Creator 14.01 for Python
前言: 如何用QT实现Python的配置的交互界面。本文从0开始,进行实践的介绍。 在上一节里面,我们做了社区版本的配置: https://blog.csdn.net/yellow_hill/article/details/142597007?spm1001.2014.3001.5501 这一节࿰…...
【python】代码发布前检查- vulture:查找死代码
分析Python项目中未被使用的.py文件 Vulture: Vulture是一个专门用于查找Python代码中的死代码的工具。它可以识别未使用的代码,包括未导入的模块。 安装: pip install vulture使用: vulture your_project_directory...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...