MAP 文件分析笔记

MAP 文件分析笔记


Section Cross References-部分交叉引用

此部分显示了程序的依赖关系

Removing Unused input sections from the image-从映像中删除未使用的输入部分

如下图所示在 tim.c 文件中删除了未使用的 HAL_TIM_PWM_MspDeInit
在这里插入图片描述
在结尾处显示了总结信息,表示总共移除了 394 个程序段(函数/数据),共 32062 字节。 给 MCU 节省 32062 字节的程序空间。

在这里插入图片描述

Image Symbol Table-映像符号表


Local Symbols-局部符号

记录用 static 声明的全局变量的地址和大小,c文件中函数的地址和用 static 声明的函数代码大小

下图红框处部分,表示 stm32f0xx_hal_gpio.c 文件中的 HAL_GPIO_Init 函数的入口地址为: 0x08000200, 类型为: Section(程序段), 大小为 0。

因为: i.HAL_GPIO_Init 仅仅表示 HAL_GPIO_Init 函数入口地址,并不是指令,所以没有大小。

在全局符号段,会列出 HAL_GPIO_Init 函数的大小。
在这里插入图片描述

Global Symbols-全局符号

记录了全局变量的地址和大小, C 文件中函数的地址及其代码大小,汇编文件中的标号地址

下图红框处部分,表示 stm32f0xx_hal_gpio.c 文件中的 HAL_GPIO_Init 函数的入口地址为: 0x08000201, 类型为: Section(程序段), 大小为 386 字节。

此处的地址用的 0x08000201,和局部符号的 0x08000200 地址不符,
因为 :
ARM 规定 Thumb 指令级的所有指令,其最低位必须为 0x08000201=0x08000200 +1,所
以才会有 2 个不同的地址,且总是差 1,实际上就是同一个函数。
在这里插入图片描述

Memory Map of the image-映像的内存映射

映像文件分为加载域(Load Region)和运行域(Execution Region), 一个加载域必须有
至少一个运行域(可以有多个运行域), 而一个程序又可以有多个加载域。 加载域为映像程
序的实际存储区域,而运行域则是 MCU 上电后的运行状态。加载域和运行域的简化关系(这
里仅表示一个加载域的情况) 图如图 2.1.4.1 所示:
在这里插入图片描述
由图可知, RW 区也是存放在 ROM(FLASH) 里面的,在执行 main 函数之前, RW(有
初值且不为 0 的变量) 数据会被拷贝到 RAM 区,同时还会在 RAM 里面创建 ZI 区(初始化
为 0 的变量)。
了解了加载域和运行域的作用及关系,我们再来看映像内存分布图(H750 例程),如图
2.1.4.2 所示:
在这里插入图片描述

① 处,表示映像的入口地址, 也就是整个程序运行的起始地址,为: 0X0800 0299。
实际地址为: 0X0800 0298(Thumb 指令最低位是 1)。
② 处,表示 LR_m_stmflash 加载域, 其起始地址为: 0X0800 0000;占用大小为: 0X0000
0EB0; 最大地址范围为: 0X0002 0000。其内部包含两个运行域: ER_m_stmflash
和 RW_m_stmsram。
③ 处,表示 ER_m_stmflash 运行域,其起始地址为: 0X0800 0000;占用大小为: 0X0000
0EA4; 最大地址范围为: 0X0002 0000; 即内部 FLASH 运行域,所有需要放内部
FLASH 的代码,都应该放到这个运行域里面。对于 STM32F1/F4/F767 等开发板,
我们例程所有的代码,都是放在这个运行域的(名字可能不一样)。
④ 处,表示 RW_m_stmsram 运行域,其起始地址为: 0X2400 0000;占用大小为: 0X0000
0938;最大地址范围为: 0X0008 0000;即内部 SRAM 运行域,所有 RAM(包括RW 和 ZI) 都是放在这个运行域里面。
⑤ 处, 表示 LR_m_qspiflash 加载域, 其起始地址为: 0X9000 0000;占用大小为: 0X0000
0214; 最大地址范围为: 0X0080 0000。其内部包含一个运行域: ER_m_qspiflash。
⑥ 处, 表示 ER_m_qspiflash 运行域,其起始地址为: 0X9000 0000;占用大小为: 0X0000
0214; 最大地址范围为: 0X0080 0000; 即外部 QSPI FLASH 运行域,所有需要放
外部 QSPI FLASH 的代码,都应该放到这个运行域里面。
图 2.1.4.2 中, 列出了所有加载域机器运行域的具体内存分布, 我们可以很方便的查看
任何一个函数所在的运行域、 入口地址、占用空间等信息。 如 delay_xms 函数: 该函数在
ER_m_stmflash 运行域; 入口地址为: 0X0800 0D0C; 大小为: 0X54 字节;是 dealy.c 里面
的函数。 了解这些信息,对我们分析及优化程序非常有用。

Image component sizes-映像组件大小

在这里插入图片描述

① 处, 表示.c/.s 文件生成对象所占空间大小(单位: 字节,下同),即.c/.s 文件编
译后所占代码空间的大小。 每个项所代表的意义如下:
Code(inc.data): 表示包含内联数据(inc.data) 后的代码大小。如 delay.o(即
delay.c) 所占的 Code 大小为 162 字节,其中 12 字节是内联数据。
RO Data:表示只读数据所占的空间大小,一般是指 const 修饰的数据大小。
RW Data:表示有初值(且非 0) 的可读写数据所占的空间大小, 它同时占用 FLASH
和 RAM 空间。
ZI Data:表示初始化为 0 的可读写数据所占空间大小, 它只占用 RAM 空间。
Debug:表示调试数据所占的空间大小,如调试输入节及符号和字符串。
Object Totals:表示以上部分链接到一起后, 所占映像空间的大小。
(incl.Generated):表示链接器生产的映像内容大小, 它包含在 Object Totals 里
面了,这里仅仅是单独列出, 我们一般不需要关心。
(incl.Padding):表示链接器根据需要插入填充以保证字节对齐的数据所占空间
的大小, 它也包含在 Object Totals 里面了, 这里单独列出, 一般无需关心。
② 处,表示被提取的库成员(.lib) 添加到映像中的部分所占空间大小。各项意义同
①中的说明。我们一般只用看 Library Totals 来分析库所占空间的大小即可。
③ 处,表示本工程全部程序汇总后的占用情况。其中:
Grand Totals:表示整个映像所占空间大小。
ELF Image Totals: 表示 ELF 可执行链接格式映像文件的大小,一般和 Grand Totals
一样大小。
ROM Totals:表示整个映像所需要的 ROM 空间大小,不含 ZI 和 Debug 数据。
Total RO Size: 表示 Code 和 RO 数据所占空间大小,本例程为: 4280 字节。
Total RW Size:表示 RW 和 ZI 数据所占空间大小,即本映像所需 SRAM 空间的大
小,本例程为: 2360 字节。
Total ROM Size:表示 Code、 RO 和 RW 数据所占空间大小,即本映像所需 FLASH
空间的大小, 本例程为: 4292 字节。
图 2.1.5.1 中,我们未框出的: Library Name 部分,实际和②处是一个意思,只是 Library
Name 说明了②处的那些.o 文件来自什么库,这里实际上就是: fpinit.o 来自 fz_wv.l 库,其
他部分来自 c_w.l 库。 fz_wv.l 和 c_w.l 是库名字

后两部分为截取正点原子的文档

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MapObject(简称MO)是一种用于开发GIS应用程序的可视化编程组件,可以在VB、VC、Delphi、C#等开发环境中使用。其主要功能包括地图显示、地图浏览、地图查询、符号绘制、地图分析等。 MO的核心是Map对象,它代表了一张地图。Map对象包含了地图数据、地图的显示方式、地图的空间参考等信息。在MO中,地图数据通常以Shapefile格式存储,可以包括点、线、面等空间要素。 MO的编程模型是基于事件的,即程序通过响应组件的事件来完成操作。例如,当用户在地图上点击时,会触发Map控件的MouseDown事件,程序可以在该事件中编写代码来响应用户的操作。 MO的程序设计入门可以从以下几个方面来学习: 1. 创建地图控件:在VB、VC等开发环境中,可以通过向窗体添加Map控件来创建地图控件。在Delphi中,需要在窗体上添加一个TMapControl控件,再通过代码创建Map对象并将其与TMapControl关联起来。 2. 加载地图数据:可以使用Map对象的AddLayer方法,将Shapefile文件加载到地图中。加载后,可以设置要素的显示方式、标注等属性。 3. 地图操作:可以通过Map控件提供的方法,实现地图的缩放、平移、旋转等操作。例如,可以通过调用Map控件的ZoomIn方法实现地图放大,通过调用Map控件的Pan方法实现地图平移。 4. 地图查询:可以使用Map对象的SelectByShape方法,根据指定的查询条件进行地图查询。查询结果可以在地图上高亮显示。 5. 符号绘制:可以使用Map对象中的Symbol对象,绘制点、线、面等符号。例如,可以使用Symbol对象的DrawPoint方法,绘制一个点符号。 以上是MO的一些基础概念和编程入门,希望可以帮助你进行MO的学习和应用开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Stark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值