STM32 MAP文件结合固件文件分析

文章目录

    • 加载域的结束地址并不是固件的结束地址?
      • ROM中执行域的描述
      • RAM中执行域的描述
      • 问题分析
    • 中断向量表在固件中的存储位置
    • 代码段在固件中的位置
    • 只读数据
      • Regin$$Table
    • RW Data段
      • 其中的内部机理
    • 总结

MAP 文件分析可以参考之前的文章

程序代码在未运行时在存储器空间内称为加载域,在运行时在存储器空间内称为运行域。

加载域的结束地址并不是固件的结束地址?

在这里插入图片描述
在这里我们根据加载域的描述可以知道加载域的空间结束位置应该为0x08020000+0x00010978=0x08030978的位置。从下面的固件我们可以知道固件的实际结束位置应该是0x080305E8。这里的俩个位置并不一致是什么原因呢?我们继续往下逐步分析。

在这里插入图片描述

ROM中执行域的描述

在这里插入图片描述

上图内容的最后一行:结束地址为0x080304e0+0x20=0x08030500,和第一行中的描述一致。
根据类型和属性可以知道这一部分的内容为代码段(Code)只读数据段(RO Data)
起始的第一个段为只读数据段,这个段的内容为中断向量表的数据。

这里我们根据上图计算下:
代码段大小:0x0802f754-0x08020188= 0x000f5cc对应于十进制为62924
只读数据段大小:0x08030500-0x0802f754+0x188=0xf34对应于十进制为3892
在这里插入图片描述
计算结果刚好和MAP文件中固件信息汇总处的结果一致

RAM中执行域的描述

在这里插入图片描述
根据类型和属性信息我们可以知道这一部分内容为RW DataZI Data
这里我们根据上图计算:
RW Data大小:0x478对应于十进制为1144
ZI Data:0x49b0+0x2000-0x478=0x6538对应于十进制为25912
在这里插入图片描述
Grand Totals - 显示映像文件的真实大小
ELF Image Totals - 可执行链接格式映像文件大小(如果使用RW数据压缩来优化ROM大小,则最终镜像的大小会发生变化)
ROM Totals - 显示包含镜像所需的ROM的最小大小
上面的计算结果和真实映像文件的大小是对应的,由于对RW数据进行了压缩,导致实际的RW空间会比上面的计算值小。
知识点:linker默认会将重复的RW数据压缩。

上图中最后一行0x200049b0+0x2000=0x200069b0刚好和栈顶地址一致:
在这里插入图片描述

问题分析

至此我们基本知道了原因,由于链接时会将重复的RW数据进行压缩,所以实际的固件大小会小于加载数据的大小,差值刚好为被压缩掉的RW数据空间的大小

中断向量表在固件中的存储位置

在MAP文件中我们可以知道 ,向量表的起始地址为0x08020000结束地址为0x08020188
在这里插入图片描述
对应于固件中的信息:
在这里插入图片描述
首地址为栈顶地址,
在这里插入图片描述
第二数据为复位函数的入口地址
在这里插入图片描述
后续内容依次为中断向量表中各个中断函数的入口地址。

代码段在固件中的位置

中断向量表的内容结束后便是代码段的内容
从MAP文件中可以看出0x08020188位置开始到0x0802f754位置结束存储的内容便为代码段的程序代码
在这里插入图片描述
如下图红框中的位置开始后续便为程序代码的数据
在这里插入图片描述

在这里插入图片描述
上图为代码段结束部分的位置

只读数据

代码段内容结束后紧跟着就是只读数据段
从下面的map文件可知0x0802f754到0x0803500之间存储的便是只读数据
在这里插入图片描述
这里我们去上图长框位置的CRC32Table的数据进行查看,对应固件位置如下图所示:
在这里插入图片描述
上图红框位置开始后续的数据和下面表中的数据是完全一致的。
在这里插入图片描述

Regin$$Table

之前的文章中有分析这个数据表,往RAM空间加载数据依据的便是这个表提供的信息。
在这里插入图片描述

RW Data段

单纯从MAP文件看RW Data数据需要0x478字节的空间
在这里插入图片描述

在固件文件中从0x0803500一直到程序的结束存储的便是RW Data数据的内容,共占0xE8字节的空间,从上面的分析中可以知道,实际生成固件中的RW Data是压缩过后的数据,其中去掉了重复数据,等程序运行时在RAM中再将数据展开,这样有助于节省ROM空间。
在这里插入图片描述

其中的内部机理

对于没有赋初值或初始化为0的全局变量,会等到程序运行时再在RAM中划分出一块区域并初始化为0,这时你可能会纳闷程序代码中怎么知道变量在RAM中划分区域的位置呢?答案是程序实际就是知道,并且程序中每次需要访问变量的位置在程序代码中变量指向的空间就是RAM中对应的位置。你可能会感觉很神奇,但结合之前的Regin$$Table分析你可能就会感到豁然了,毕竟RAM中的空间分配早就在固件生成时都定义好了,固件中也已经记录了这些信息。
那对于RW Data而言其实道理也是一样的,只不过RW Data对应的数据是有初值的。这里我们只需将全部全局变量的值记录下来并去掉重复数据后存储到固件中,在程序运行时在RAM中创建了对应的全局变量空间后将初值赋值给对应的变量即可。不过这好像还有个疑问:运行时怎么知道将那个值赋值给哪个变量呢?后续再继续探究下。

总结

固件各段在Flash中的存放顺序,以及运行时加载到SRAM中的顺序如下:
在这里插入图片描述

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

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

相关文章

LeetCode刷题之HOT100之多数元素

2024/5/21 起床走到阳台,外面绵柔细雨,手探出去,似乎感受不到。刚到实验室,窗外声音放大,雨大了。昨天的两题任务中断了,由于下雨加晚上有课。这样似乎也好,不让我有一种被强迫的感觉&#xff0…

SpringCloud Alibaba Nacos分类配置--多方案配置隔离

文章目录 Nacos 分类配置(实现配置隔离)1.DataID 方案需求分析/图解配置实现测试 2.Group 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 3.Namespace 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 Namespace/Group/Data ID 关系…

基于springboot+vue+Mysql的逍遥大药房管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

EfficientSAM分割对象后求其中图像中的高

1 分割对象 EfficientSAM https://github.com/yformer/EfficientSAM 2 计算在图像中最高点即y值最小点 import os import cv2def read_images(folder_path):image_files [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png&quo…

文心智能体-恋爱专家

⭐简单说两句⭐ ✨ 正在努力的小叮当~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &a…

邮件系统数据面临的安全问题及解决方法

随着电子邮件的普及,邮件系统已成为企业、学校、个人等用户之间进行信息交流的重要工具。然而,随着数据量的增加和用户对邮件系统的依赖,邮件系统数据安全问题也逐渐凸显。下面U-Mail技术张工就给大家讲解一下邮件系统数据面临的主要安全问题…

CCF-GESP 等级考试 2023年9月认证C++四级真题

2023年9月 一、单选题(每题2分,共30分) 第 1 题 ⼈们所使⽤的⼿机上安装的App通常指的是( )。 A. ⼀款操作系统B. ⼀款应⽤软件C. ⼀种通话设备D. 以上都不对 第 2 题 下列流程图的输出结果是?( ) A. 9B.…

【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们👋   欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀   Prometheus是云原生和DevOps的…

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

3DMax

先转换为可编辑多边形 按“1”选择为点&#xff0c;点击目标焊接&#xff08;CtrlShiftw&#xff09;&#xff0c;然后点击一个顶点拉到另一个定点上&#xff1b; 选择一个面&#xff0c;点击塌陷&#xff08;CtrlAltC&#xff09;&#xff0c;四点合并为一个点&#xff1b; …

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…

代码随想录算法训练营第三十四天 | 理论基础、455.分发饼干、376、摆动序列、53.最大子序和

目录 理论基础 455.分发饼干 思路 代码 376.摆动序列 思路 代码 53.最大子序和 思路 代码 理论基础 代码随想录 455.分发饼干 代码随想录 思路 可以是大饼干优先满足大胃口&#xff0c;也可以是小饼干优先满足小胃口。 代码 class Solution:def findContentChildre…

springsecurity入门登录授权

①我们需要自定义登陆接口&#xff0c;也就是在controller目录新建LoginController类&#xff0c;在controller方法里面去调用service接口&#xff0c;在service接口实现AuthenticationManager去进行用户的认证&#xff0c;注意&#xff0c;我们定义的controller方法要让Spring…

在Windows操作系统中克隆SD卡的简单方法!

如今&#xff0c;在数据备份和传输方面&#xff0c;SD卡克隆软件发挥着重要作用。本文将向大家介绍一款好用的Windows SD卡克隆软件&#xff0c;可以帮助你轻松将数据克隆到新卡中。 为什么需要在Windows中进行SD卡克隆&#xff1f; 在许多情况下&#xff0c;你可能需要将SD卡…

react中怎么为props设置默认值

在React中&#xff0c;你可以使用ES6的类属性&#xff08;class properties&#xff09;或者函数组件中的默认参数&#xff08;default parameters&#xff09;来定义props的默认值。 1.类组件中定义默认props 对于类组件&#xff0c;你可以在组件内部使用defaultProps属性来…

css左右滚动互不影响

想实现左右都可以滚动&#xff0c;且互不影响。 只需要再左边的css里面 .threedlist {cursor: pointer;width: 280px;position: fixed;height: 100vh; /* 定义父容器高度 */overflow-y: auto; /* 只有在内容超过父容器高度时才出现滚动条 */} 如果想取消滚动条样式 .threedli…

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

AI视频教程下载:用ChatGPT和React.js开发AI聊天机器人

这门课程面向初出茅庐的开发者和技术爱好者&#xff0c;深入探讨了使用两种强大工具&#xff1a;React.js 和 OpenAI 的 ChatGPT 的人工智能聊天机器人开发的迷人世界。通过注重实践、动手学习&#xff0c;该课程引导您完成创建动态、人工智能驱动的聊天机器人应用程序的每一步…

第17讲:C语言内存函数

目录 1.memcpy使用和模拟实现2.memmove使用和模拟实现3.memset函数的使用4.memcmp函数的使用 1.memcpy使用和模拟实现 void * memcpy (void * destination, const void * source, size_t num);• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存…

高效利用键盘上的 caps lock(大写键)实现中英切换

先看效果 在中文输入环境中&#xff0c;Caps Lock 键经常被忽视&#xff0c;占据了键盘上的黄金位置却很少派上用场。接下来&#xff0c;我将介绍如何将这个闲置的键合理利用&#xff0c;让它变得更加实用。 第一步 设置&#xff1a; 我以五笔为例&#xff1a; 1.输入法默认…