STM32 MAP文件

文章目录

  • 1 生成Map
  • 2 map中概念
  • 3 文件分析流程
    • 3.1 Section Cross References
    • 3.2 Removing Unused input sections from the image(移除未使用的段)
    • 3.3 Memory Map of the image(映像的内存分布)
      • 3.3.1 加载域
      • 3.3.2 运行域
  • 4 代码运行逻辑
  • 5 F103部分
    • 5.1 Image component sizes(映像组成大小)
    • 5.2 映像文件的总结说明

1 生成Map

Keil生成map文件,要设置:
在这里插入图片描述

2 map中概念

段(section) :描述映像文件的代码和数据块。
RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码)。
RW:Read-Write的缩写,主要是RW-data,RW-data由程序初始化初始值。
ZI:Zero-initialized的缩写,主要是ZI-data,由编译器初始化为0。
.text:与RO-code同义。
.constdata:与RO-data同义。
.bss: 与ZI-data同义。
.data:与RW-data同义

3 文件分析流程

3.1 Section Cross References

Section Cross Referencesmain.o(i.main) refers to misc.o(i.NVIC_PriorityGroupConfig) for NVIC_PriorityGroupConfigmain.o(i.main) refers to delay.o(i.delay_init) for delay_initmain.o(i.main) refers to usart.o(i.uart1_init) for uart1_initmain.o(i.main) refers to led.o(i.LED_Init) for LED_Initmain.o(i.main) refers to lcd.o(i.LCD_Init) for LCD_Initmain.o(i.main) refers to key.o(i.KEY_Init) for KEY_Init

(模块、段的交叉引用关系)各个源文件生成的模块之间相互引用的关系。“refer to”是引用的意思,比如:

  • main.c和led.c会被编译成目标文件main.o和led.o。
  • i.main是main.c中main函数的入口(也是main函数编译出的段,函数编译后以段的形式存在,函数之间的引用,也就是段与段之间的引用)。
  • i.LED_Init是led.c中LED_Init函数的入口(也是LED_Init函数编译出的段)。

因此上面这句话意思就是main.c中的main函数引用了led.c中的LED_Init函数,剩下的基本都是这类的意思。

startup_stm32f40_41xxx.o(.text) refers to __main.o(!!!main) for __main

在启动代码中调用了_main.o模块中的_main函数。

3.2 Removing Unused input sections from the image(移除未使用的段)

将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。

Removing Unused input sections from the image.Removing main.o(.rev16_text), (4 bytes).Removing main.o(.revsh_text), (4 bytes).Removing stm32f4xx_it.o(.rev16_text), (4 bytes).Removing stm32f4xx_it.o(.revsh_text), (4 bytes).Removing system_stm32f4xx.o(.rev16_text), (4 bytes).Removing system_stm32f4xx.o(.revsh_text), (4 bytes).Removing system_stm32f4xx.o(i.SystemCoreClockUpdate), (192 bytes).Removing system_stm32f4xx.o(.data), (20 bytes).

最后一栏有个总的统计结果:

2737 unused section(s) (total 289508 bytes) removed from the image.

总共移除了2737个未使用的段,共289508字节。

3.3 Memory Map of the image(映像的内存分布)

映像文件可以分为加载域(Load Region)和运行域(Execution Region):

3.3.1 加载域

加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系。

Memory Map of the imageImage Entry point : 0x00000000Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00008dac, Max: 0x00100000, ABSOLUTE)Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00008bd8, Max: 0x00100000, ABSOLUTE)Base Addr    Size         Type   Attr      Idx    E Section Name        Object0x08000000   0x00000188   Data   RO          302    RESET               startup_stm32f40_41xxx.o0x08000188   0x00000008   Code   RO         5804  * !!!main             c_w.l(__main.o)0x08000190   0x00000000   Code   RO         5799    .ARM.Collect$$_printf_percent$$00000000  c_w.l(_printf_percent.o)0x08000190   0x00000006   Code   RO         5798    .ARM.Collect$$_printf_percent$$00000009  c_w.l(_printf_d.o)0x08000196   0x00000006   Code   RO         5797    .ARM.Collect$$_printf_percent$$0000000C  c_w.l(_printf_x.o)0x0800019c   0x00000006   Code   RO         5796    .ARM.Collect$$_printf_percent$$00000014  c_w.l(_printf_s.o)0x080001a2   0x00000004   Code   RO         5832    .ARM.Collect$$_printf_percent$$00000017  c_w.l(_printf_percent_end.o)0x080001a6   0x00000002   Code   RO         5923    .ARM.Collect$$libinit$$00000000  c_w.l(libinit.o)

1、Exec Addr:运行域地址
2、Load Addr:加载域地址
3、Size:存储大小
4、Type:类型
Data:数据类型
Code:代码类型
Zero:未初始化变量类型
PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。

ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。

3.3.2 运行域

运行域反映了ARM可执行映像文件各个段真正执行时在存储器中的位置关系:

Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00002920, Max: 0x00020000, ABSOLUTE)Base Addr    Size         Type   Attr      Idx    E Section Name        Object0x20000000   0x00000028   Data   RW            7    .data               main.o0x20000028   0x00000180   Data   RW          347    .data               usart.o0x200001a8   0x00000008   Data   RW          501    .data               timer.o0x200001b0   0x00000004   Data   RW          565    .data               delay.o0x200001b4   0x00000001   Data   RW          694    .data               key.o0x200001b5   0x00000001   PAD0x200001b6   0x00000004   Data   RW          790    .data               lcd.o0x200001ba   0x00000002   PAD0x200001bc   0x00000008   Data   RW          979    .data               pwm.o0x200001c4   0x00000010   Data   RW         3651    .data               stm32f4xx_rcc.o0x200001d4   0x00002008   Zero   RW            5    .bss                main.o0x200021dc   0x000000c8   Zero   RW          346    .bss                usart.o0x200022a4   0x0000000e   Zero   RW          788    .bss                lcd.o0x200022b2   0x0000000a   Zero   RW          978    .bss                pwm.o0x200022bc   0x00000060   Zero   RW         5842    .bss                c_w.l(libspace.o)0x2000231c   0x00000004   PAD0x20002320   0x00000200   Zero   RW          301    HEAP                startup_stm32f40_41xxx.o0x20002520   0x00000400   Zero   RW          300    STACK               startup_stm32f40_41xxx.o
  Load Region LR$$.ARM.__AT_0x68000000 (Base: 0x68000000, Size: 0x00000000, Max: 0x000f4240, ABSOLUTE)Execution Region ER$$.ARM.__AT_0x68000000 (Base: 0x68000000, Size: 0x00000000, Max: 0x000f4240, ABSOLUTE, UNINIT)

4 代码运行逻辑

加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,因为MCU没上电时RAM中没有数据,所以此时所有的东西(包括代码、变量、初始值等)都是存放在flash中的,当上电后又要把变量等复制到RAM中才能正常运行。
在这里插入图片描述在执行映像之前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并创建ZI Section(初始值为0的变量区),这样才算完成了MCU运行的准备。

5 F103部分

5.1 Image component sizes(映像组成大小)

在这里插入图片描述Code (inc. Data) :显示代码占用了多少字节。 在此映像中,有19442字节的代码, 其中包括1832字节的内联数据 (inc. data),例如文字池和短字符串。

RO Data :显示只读数据占用了多少字节(比如const char buf[] = “123456”)。这是除 Code (inc. data) 列中包括的内联数据之外的数据。

RW Data :显示读写数据占用了多少字节。

ZI Data :显示零初始化的数据占用了多少字节。

Debug :显示调试数据占用了多少字节,例如,调试输入节以及符号和字符串。

Object Totals :显示链接到一起以生成映像的对象占用了多少字节。

(incl. Generated):链接器会生成的映像内容,例如,交互操作中间代码。 如果 Object Totals 行包含此类型的数据,则会显示在该行中。本例中共有 1016 字节的 RO 数据,其中32字节是链接器生成的 RO 数据。

(incl. Padding) :链接器根据需要插入填充,以强制字节对齐。

下面的Library Totals显示已提取并作为单个对象添加到映像中的库成员占用了多少字节。

在这里插入图片描述

5.2 映像文件的总结说明

在这里插入图片描述Grand Totals:显示映像的真实大小。

ELF Image Totals:ELF(Executable and Linking Format)可执行链接格式映像文件大小。

ROM Totals:显示包含映像所需的 ROM的最小大小。这不包括 ZI数据和存储在ROM 中的调试信息。

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

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

相关文章

机器学习探索计划——KNN算法流程的简易了解

文章目录 数据准备阶段KNN预测的过程1.计算新样本与已知样本点的距离2.按照举例排序3.确定k值4.距离最近的k个点投票 scikit-learn中的KNN算法 数据准备阶段 import matplotlib.pyplot as plt import numpy as np# 样本特征 data_X [[0.5, 2],[1.8, 3],[3.9, 1],[4.7, 4],[6.…

软件测试:超详细的Jmeter基础教程

JMeter 介绍: 一个非常优秀的开源的性能测试工具。 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来。 从性能工具的原理划分 Jmeter工具和其他性能工具在原理上完全一致,工具包含4个部分: &#xff…

基于springboot实现高校食堂移动预约点餐系统【项目源码】

基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…

rancher2.6 docker版本部署

1. 拉取镜像 docker pull rancher/rancher:v2.6.5 注: 上面命令中rancher的版本v2.6.5,仅仅是我因为我们环境中使用的k8s都是 1.20.1 到1.23.6 之间的版本。rancher支持的k8s版本,在github上查看:Release Release v2.6.5 ranche…

2023 年 认证杯 小美赛 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…

基于springboot实现乒乓球预约管理系统项目【项目源码】

基于springboot实现乒乓球预约管理系统演示 系统的开发环境 浏览器:IE 8.1(推荐6.0以上) 开发使用语言:JAVA JDK版本:JDK_8 数据库管理系统软件:Mysql 运行平台:Windows 7 运行环境&#…

破案现场:Docker容器资源限制导致的oom问题

破案现场:Docker容器资源限制导致的oom问题 01 事故现场02 问题定位03 对症下药04 后记 原文来自于微信公众号“运维之美” https://mp.weixin.qq.com/s?__bizMzA5NDY1MTM3MA&mid2247484902&idx1&sn8394aefd884ee09ea546fcd400dd233c&chksm904a136…

是否有无限提取的代理IP?作为技术你需要知道这些

最近有互联网行业的技术小伙伴问到,有没有可以无限提取的代理IP?就是比如我一秒钟提取几万、几十万次,或者很多台机器同时调用API提取链接,这样可以吗?看到这个问题,不禁沉思起来,其实理论上是存…

python基础教程:动态参数

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 Python的动态参数有两种,分别是*args和**kwargs, 这里面的关键是一个和两个星号的区别,而不是args和kwargs在名字上的区别&#…

js粒子效果(二)

效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Particle Animation</title><…

一篇文章让你入门python集合和字典

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、集合: 增加 add 删除 del 删除集合 discard(常用)删除集合中的元素 &#xff0c;删除一个不存在的元素不会报错 remove 删除一个不存在的元素会报错 pop随…

【点云surface】Poisson表面重建

1 介绍 Poisson表面重建算法是一种用于从点云数据生成平滑曲面模型的算法。它基于Michael Kazhdan等人在2006年发表的论文《Poisson surface reconstruction》。该算法通过将点云数据转换为体素表示&#xff0c;并利用Poisson方程来重建曲面。 该算法的基本原理是将点云数据转…

训练日志——wandb

目录 安装与登录基础使用与可视化常用函数wandb.init()wandb.config()wandb.log()wandb.finish()wandb.watch() 参考 安装与登录 安装 pip install wandb注册并登录 https://wandb.ai/site客户端登陆 在终端中输入wandb login 然后出现You can find you API key的一串网站&am…

【MinIO】几个有用的方法

在windows总安装Minio 进入网址 在Windows安装时&#xff0c;选择相应的exe文件下载&#xff0c;下载到本地后&#xff0c;使用如下的命令即可在前台启动&#xff1a; minio.exe server D:\your_path 或者将该路径写进环境变量的path中&#xff0c;用来为minio指定数据存储…

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(三):核心机制策略

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:核心机制策略,子节点表示追问或同级提问 异常处理 …

想当老师应该去学什么专业

专业选择是决定未来职业发展的重要步骤&#xff0c;如果你也想成为一名老师&#xff0c;那么这五个专业可能会适合你&#xff01; 教育学专业 教育学专业是培养教育理论和方法的学科&#xff0c;这些理论知识将帮助你理解教学过程、学生发展、课程设计和评估。该专业将让你全面…

【沐风老师】在3dMax中如何把对象随机散布在表面上?

在3dMax中如何把对象随机散布在表面上&#xff1f; 在这个教程中&#xff0c;给大家讲解在3dMax中如何把对象随机散布到另一个对象的表面上。有不少3dMax的初学者在将对象分布在随机表面上时感到手足无措。如果&#xff0c;将每个对象手动放置在表面上并花时间调整每个对象根本…

怎么当代课老师教学生

老师朋友们&#xff0c;有没有帮忙当过代课老师呢&#xff1f;或者&#xff0c;没当过的老师是不是对这种职业充满了好奇&#xff1f;让我来分享一下&#xff0c;当代课老师的日常是什么样的吧&#xff01; 备课 说起备课&#xff0c;那可是个大工程&#xff01;不过&#xff…

教师编制缩减是为什么

老师们有没有注意到一个趋势&#xff1f;那就是教师编制正在逐步缩减。不知道你们发现没有&#xff0c;我最近在研究教育领域的新闻&#xff0c;发现这两年教师编制缩减的消息越来越多。这是为什么呢&#xff1f;今天就来跟大家聊一聊。 原因一&#xff1a;资金压力 第一个原因…

2-10岁女童穿搭 I 看的见的时尚感

分享女儿的时尚穿搭—连帽加绒卫衣 简单易搭怎么穿都好看的卫衣 红色吸睛又显肤色&#xff0c;不挑人穿 面料亲肤柔软&#xff0c;保暖性也很棒 单穿内搭都能轻松打造时尚造型&#xff01;&#xff01;