【单片机】单片机map表详细解析

news2024/11/20 18:43:21

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

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

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

相关文章

二叉树进阶练习——根据二叉树创建字符串

1.题目解析 题目来源:606.根据二叉树创建字符串 测试用例 2.算法原理 根据上面的题目我们知道这里需要根据前序遍历来创建字符串,并且需要将每棵子树使用括号括起来,但是要根据实际情况省略括号,比如当右子树为空左子树为空就可…

基于opencv-C++dnn模块推理的yolov5 onnx模型

前言 由于最近手边的项目要求,本人需要在一块算力吃紧的板端上部署yolov5目标检测模型(纯CPU推理),考虑到python在板端上的运行速率和其运行时所占内存过大,因此使用torch.hub.load对训练好后的pt模型进行加载和运行不…

rtmp协议转websocketflv的去队列积压

websocket server的优点 websocket server的好处:WebSocket 服务器能够实现实时的数据推送,服务器可以主动向客户端发送数据 1 不需要客户端不断轮询。 2 不需要实现httpserver跨域。 在需要修改协议的时候比较灵活,我们发送数据的时候比较…

使用默认不可变的Rust变量会踩什么坑

讲动人的故事,写懂人的代码 Rust的变量真的是名不副实。名字中明明有个“变”字,却默认不可变。还美其名曰“不可变变量”。要想让变量名副其实,还必须费心额外加个mut关键字,并必须称其为“可变变量”,才能与前者区分…

对比学习与图像去雾在24TIP和CVPR经典图像去雾论文中的良好结合,展示出模型良好的泛化能力(本期内容较详细 多)

今天主要内容是图像去雾,对比学习,无监督学习,要分享的三篇论文分别是: 21CVPR Contrastive Learning for Compact Single Image Dehazing 24 TIP UCL-Dehaze: Toward Real-World Image Dehazing via Unsupervised Contrastive Le…

stm32f103调试,程序与定时器同步设置

在调试定时器相关代码时,注意到定时器的中断位总是置1,怀疑代码有问题,经过增大定时器的中断时间,发现定时器与代码调试并不同步,这一点对于调试涉及定时器的代码是非常不利的,这里给出keil调试stm32使定时…

HTB:Vaccine[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Besides SSH and HTTP, what other service is hosted on this box? 2.This service can be configured to allow login with any password for specific username. What is that username? 3.What is the name of the file downloaded…

Kafka和RabbitMQ区别

RabbitMQ的消息延迟是微秒级,Kafka是毫秒级(1毫秒1000微秒) 延迟消息是指生产者发送消息发送消息后,不能立刻被消费者消费,需要等待指定的时间后才可以被消费。 Kafka的单机呑吐量是十万级,RabbitMQ是万级…

10.4 Linux_并发_线程

概述 线程的共享资源&#xff1a; 可执行的指令、静态数据、文件描述符、当前工作目录、用户ID、用户组ID 线程的私有资源&#xff1a; 线程ID、程序计数器PC和相关寄存器、堆栈、错误号、优先级、执行状态和属性 线程编译&#xff1a; gcc <.c文件> -l pthread -o…

数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall

数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall 数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall 数据量&#xff1a;3k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&a…

加密与安全_TOTP 一次性密码生成算法

文章目录 PreTOTP是什么TOTP 算法工作原理TOTP 生成公式TOTP 与 HOTP 的对比Code生成TOTP验证 TOTP使用场景小结 TOTP 与 HOTP 的主要区别TOTP 与 HOTP应用场景比较TOTP 与 HOTP安全性分析 Pre 加密与安全_HTOP 一次性密码生成算法 https://github.com/samdjstevens/java-tot…

YOLO11改进|卷积篇|引入可变核卷积AKConv

目录 一、AKConv卷积1.1AKConv卷积介绍1.2MLCA核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、AKConv卷积 1.1AKConv卷积介绍 AKConv允许卷积参数的数量以线性方式增加或减少&#xff0c;而不是传统的平…

C# 表达式与运算符

本课要点&#xff1a; 1、表达式的基本概念 2、常用的几种运算符 3、运算符的优先级 4、常见问题 一 表达式 表达式是由运算符和操作数组成的。、-、*和/等都是运算符&#xff0c;操作数包括文本、常量、变量和表达式等。 二 算术运算符 2.1 算术运算符的使用 三 常见错误 …

Cocotb 学习记录--V01

1. Windows 下安装cocotb pip install cocotb 其他参考&#xff1a; 1.Welcome to cocotb’s documentation! — cocotb 1.9.1 documentation

【Koa】文件上传

主要使用两个 koa 插件&#xff0c;koa-body 里面自带文件上传功能&#xff0c;还有一个 koa-staitc 用于配置静态资源目录&#xff08;可以通过路径直接访问图片&#xff09;。 router const Router require(koa/router); const {upload} require(../controller/user);con…

Spring之生成Bean

Bean的生命周期&#xff1a;实例化->属性填充->初始化->销毁 核心入口方法&#xff1a;finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…

【RADARSAT Constellation Mission(RCM)卫星星座简介】

RADARSAT Constellation Mission&#xff08;RCM&#xff09;卫星星座是加拿大太空局&#xff08;CSA&#xff09;的下一代C波段合成孔径雷达&#xff08;SAR&#xff09;卫星星座&#xff0c;以下是对其的详细介绍&#xff1a; 一、基本信息 发射时间&#xff1a;2019年6月…

Golang | Leetcode Golang题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; func findMinArrowShots(points [][]int) int {if len(points) 0 {return 0}sort.Slice(points, func(i, j int) bool { return points[i][1] < points[j][1] })maxRight : points[0][1]ans : 1for _, p : range points {if p[0] > …

秒懂Linux之线程

目录 线程概念 线程理解 地址空间&#xff08;页表&#xff0c;内存&#xff0c;虚拟地址&#xff09; 线程的控制 铺垫 线程创建 ​编辑 线程等待 线程异常 线程终止 代码 线程优点 线程缺点 线程特点 线程概念 线程是进程内部的一个执行分支&#xff0c;线程是C…

小程序-全局数据共享

目录 1.什么是全局数据共享 2. 小程序中的全局数据共享方案 MboX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 5. 将 Store 中的成员绑定到组件中 6. 在组件中使用 Store 中的成员 1.什么是全…