Keil Map文件分析

以前查看map,基本就是看一下Flash大小、和RAM总大小,或者是debug时确认下 函数编译地址。

最近心血来潮,想用C#做个上位机来解一下这个map文件,所以又回过头来关注下map文件具体格式和细节。

map文件的具体结构:

1、Section Cross References
    段交叉引用

        这部分具体描述了各个文件和模块之间的交叉引用关系。是程序编译和链接过程中的一个输出结果。查看这部分内容,可以知道一个文件的引用关系和被引用关系。

2、Removing Unused input sections from the image
    移除镜像中未使用的输入部分

        编译器会自动删除未使用的代码端,可用于查看多余代码量。

3、Image Symbol Table
    镜像符号表

        它是详细描述程序中各个段在存储器中的地址、类型、大小等信息,对于理解内存布局和程序结构有很大帮助。

4、Memory Map of the image
    映像内存映射

        它描述了程序映像(即编译后的可执行文件或固件)在内存中的布局。这个映射详细说明了程序的各个部分(如代码段、数据段、堆栈、堆等)在物理或虚拟内存中的位置、大小和属性。

5、Image component sizes
    镜像分配大小

        是指STM32等嵌入式系统编译后生成的映像文件(Image)中各个组成部分所占用的存储空间大小。这些信息对于理解程序的内存使用情况、优化代码和内存布局至关重要。

        

具体各个模块的格式解析:

Section Cross References

实例:
system_stm32f4xx.o(i.SystemCoreClockUpdate) refers to system_stm32f4xx.o(.data) for SystemCoreClock
system_stm32f4xx.c的函数SystemCoreClockUpdate 引用了 system_stm32f4xx.c 的函数SystemCoreClock

startup_stm32f429xx.o(RESET) refers to stm32f4xx_it.o(i.HardFault_Handler) for HardFault_Handler
startup_stm32f429xx.c(RESET段) 引用了 stm32f4xx_it.c 的函数HardFault_Handler

总结: XX.c 引用了 YY.c 的 ZZ (函数或全局变量)
衍生:
    1)基于XX,可以筛选一个c文件引用了哪些函数或变量
    2)基于YY,可以筛选一个c文件被哪些文件引用了
    3)基于ZZ,可以筛选一个函数或变量被哪些文件引用了
说明:
    i.FF 通常表示一个函数
    (.data) 表示内存中的data段 初始化了的全局变量或静态变量
        类似的还有 (.text)/(.code) 代码段  (.bss) 未初始化的全局变量或静态变量 (.heap) (.stack)
        其中, (RESET)是一个特殊段 它是STM32控制器复位向量的地址

Removing Unused input sections from the image


实例:
Removing system_stm32f4xx.o(.rev16_text), (4 bytes).
移除了system_stm32f4xx.c的rev16_text端的代码 共4字节

Removing stm32f4xx_hal_msp.o(i.HAL_ADC_MspDeInit), (100 bytes)
移除了stm32f4xx_hal_msp.c的HAL_ADC_MspDeInit函数 共100字节

总结: 移除了XX.c的YY代码 共Z个字节
衍生:
    1)基于XX和Z,可以筛选一个c文件的多于代码量
    2)基于XX和YY,可以明确哪些函数未用到

Image Symbol Table

实例:
    Symbol Name                              Value     Ov Type        Size  Object(Section)
    ../Core/Src/main.c                       0x00000000   Number         0  main.o ABSOLUTE
    ../USB_DEVICE/App/usb_device.c           0x00000000   Number         0  usb_device.o ABSOLUTE
    ..\VciModle\App\VciModleApp.c            0x00000000   Number         0  vcimodleapp.o ABSOLUTE
    i.ArkCan1_Task                           0x08011e20   Section        0  arkcantask.o(i.ArkCan1_Task)
    i.ArkCan2_Task                           0x08011f60   Section        0  arkcantask.o(i.ArkCan2_Task)
    i.ArkCanBaudRangeCheck                   0x08012068   Section        0  arkcmdintelligent.o(i.ArkCanBaudRangeCheck)
    ArkCanBaudRangeCheck                     0x08012069   Thumb Code    84  arkcmdintelligent.o(i.ArkCanBaudRangeCheck)
    i.ArkCanCmdSendFinish                    0x080120c8   Section        0  arkcantask.o(i.ArkCanCmdSendFinish)
    依次是符号名称、符号的地址、符号类型、符号大小和地址空间

总结:可以找到单个函数的地址和代码量大小

Memory Map of the image

实例:
  Image Entry point : 0x080101ad
  Load Region LR_IROM1 (Base: 0x08010000, Size: 0x0006c0c8, Max: 0x00100000, ABSOLUTE, COMPRESSED[0x0006bc98])
    Execution Region ER_IROM1 (Exec base: 0x08010000, Load base: 0x08010000, Size: 0x0006b548, Max: 0x00100000, ABSOLUTE)
    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object
    
    0x0801bf84   0x0801bf84   0x00000038   Code   RO         2322    i.CRC32_Add         vcicommonfun.o
    0x0801bfbc   0x0801bfbc   0x0000000c   Code   RO         2323    i.CRC32_Get         vcicommonfun.o
    0x0801bfc8   0x0801bfc8   0x00000010   Code   RO         2324    i.CRC32_Init        vcicommonfun.o
    依次是 执行地址、加载地址、大小、类型、属性、索引 名称和所属的对象
    类型见段交叉引用中的“说明”、属性表示读写属性、名称即函数名

总结:可以找到单个函数的地址和代码量大小,以及属性等信息

Image component sizes

实例:
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name
      3870        272        180          2        264      18242   arkcantask.o

总结:用于统计整个文件的RAM和ROM占用量
说明:可基于上位机工具,计算每个文件的RAM和ROM占用量,转成表格文件进行进一步分析
 

C# 解析Image component sizes

public static string FileAnalyzing(string path)
{StreamReader sr = new StreamReader(path);string line, tempStr, retStr = null, content = null;int line_status = 0, index = 0, temp;line = sr.ReadLine();while (line != null){if (line.Contains("Component")){retStr += "编译器版本" + line.Substring(10) + "\r\n";}else if (line.Contains("Image component sizes")){retStr += "\r\n内存分配表\r\n==============================================================================\r\n";line_status = 1;}else if (line.Contains("----------------------------------------------------------------------")){line_status = 0;}else if (line.Contains("Total ROM Size")){retStr += line.Replace("Total ROM Size (Code + RO Data + RW Data)", "Flash:") + "\r\n";}else if (line.Contains("Total RW  Size")){retStr += "==============================================================================\r\n";retStr += line.Replace("Total RW  Size (RW Data + ZI Data)       ", "ROM:  ") + "\r\n";}if (line_status == 1){if (line.Contains("Code (inc. data)")){retStr += "Index  RAM    ROM  code  data  RO   RW     ZI  Debug Object Name\r\n";content += "Index RAM ROM code data RO RW ZI Debug ObjectName\r\n";line_status = 2;index = 0;}}else if (line_status == 2){string[] parts = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);if (parts.Length == 7){/*3870            Code 272             (inc. data)180             RO Data2               RW Data264             ZI Data18242           Debugarkcantask.o    Object NameTotal ROM Size (Code + RO Data + RW Data)Total RW  Size (RW Data + ZI Data)*/index++;tempStr = index.ToString().PadLeft(4);//索引temp = Convert.ToInt32(parts[0]) + Convert.ToInt32(parts[2]) + Convert.ToInt32(parts[3]);tempStr += temp.ToString().PadLeft(6);//RAMtemp = Convert.ToInt32(parts[3]) + Convert.ToInt32(parts[4]);tempStr += temp.ToString().PadLeft(7);//ROMtempStr += parts[0].PadLeft(6);tempStr += parts[1].PadLeft(5);tempStr += parts[2].PadLeft(5);tempStr += parts[3].PadLeft(5);tempStr += parts[4].PadLeft(7);tempStr += parts[5].PadLeft(7) + " ";tempStr += parts[6].Replace(".o", ".c") + "\r\n";retStr += tempStr;tempStr = index.ToString() + " ";//索引temp = Convert.ToInt32(parts[0]) + Convert.ToInt32(parts[2]) + Convert.ToInt32(parts[3]);tempStr += temp.ToString() + " ";//RAMtemp = Convert.ToInt32(parts[3]) + Convert.ToInt32(parts[4]);tempStr += temp.ToString() + " ";//ROMtempStr += parts[0] + " ";tempStr += parts[1] + " ";tempStr += parts[2] + " ";tempStr += parts[3] + " ";tempStr += parts[4] + " ";tempStr += parts[5] + " ";tempStr += parts[6].Replace(".o", ".c") + "\r\n";content += tempStr;}}line = sr.ReadLine();}sr.Close();retStr += "\r\nText文本\r\n==============================================================================\r\n" + content;return retStr;
}

主要思路就是,逐行解析文本文件,以空格作为分隔符得到各个元素,再进行展示。

同时再打印一份精简版的文本,可以用于将文本转为execl文件,进行图表分析。

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

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

相关文章

MYSQL的简易安装

先下载好安装包 官网:https://www.mysql.com 双击运行进入界面 打开之后将左侧的产品移到右侧 点击使用的产品设置路径 之后一直下一步即可 选择主机类型 同时要记住端口号 设置密码 设置系统服务列表中的服务名称 之后一直下一步就可以了 安装完成记得配置环…

解决前端登录成功之后,往后端发请求携带cookie问题

项目背景: 今天在做伙伴匹配系统: 我现在实现的功能是: 在我登录成功之后,就进入了主页(默认页),在我访问用户页的时候产生的问题 首先说明一下这个Cookie的问题: 我们登录成功…

钽电容、电解电容、陶瓷电容的区别

电容是一种常见的电子元件,在电路中起着多种重要作用,并广泛应用于各种电子设备和系统中。 一、钽电容 1. 基本概述 钽电容,全称为钽电解电容器,是电解电容器的一种。它使用金属钽作为阳极,并在其表面形成一层五氧化…

Echarts折线图 自适应窗口大小

实现效果&#xff1a; 代码&#xff1a; <template><div class"echarts"><div class"select-box"><div v-for"(item,index) in trendList":key"index":class"[period item.id?active:,item]"click&…

2024微信小程序期末大作业-点奶茶微信小程序(后端nodejs-server)(附下载链接)_微信小程序期末大作业百度网盘下载

菜单展示 购物车展示&#xff1a; 提交订单&#xff1a; 支付详情页展示&#xff1a; 订单查看&#xff1a; 查看历史消费&#xff1a; 部分代码展示&#xff1a; <!--pages/home/home.wxml--> <block wx:for"{{listData}}" wx:key"itemlist&qu…

Python 项目依赖离线管理 pip + requirements.txt

背景 项目研发环境不支持联网&#xff0c;无法通过常规 pip install 来安装依赖&#xff0c;此时需要在联网设备下载依赖&#xff0c;然后拷贝到离线设备进行本地安装。 两台设备的操作系统、Python 版本尽可能一致。 离线安装依赖 # 在联网设备上安装项目所需的依赖 # -d …

cuda编程快速了解

原文链接 https://zhuanlan.zhihu.com/p/34587739 一、Gpu的线程结构 要深刻理解kernel&#xff0c;必须要对kernel的线程层次结构有一个清晰的认识。首先GPU上很多并行化的轻量级线程。kernel在device上执行时实际上是启动很多线程&#xff0c;一个kernel所启动的所有线程称…

overlap的uORF对TE的抑制程度为什么显著高于non-overlap的uORF

在翻译调控中&#xff0c;上游开放阅读框&#xff08;uORFs&#xff09;对主开放阅读框&#xff08;main ORF&#xff09;的抑制效果有很大差异&#xff0c;尤其是重叠的uORFs&#xff08;overlap uORFs&#xff09;通常比非重叠的uORFs&#xff08;non-overlap uORFs&#xff…

2024年过半,新能源车谁在掉链子?

2024年过半之际&#xff0c;各品牌上半年的销量数据也相继出炉&#xff0c;是时候考察今年以来的表现了。 理想和鸿蒙智行两大增程霸主占据头两名&#xff0c;仍处于焦灼状态&#xff1b;极氪和蔚来作为高端纯电品牌紧随其后&#xff0c;两者之间差距很小&#xff1b;零跑和哪…

Truenas scale入坑

家里有一台刚上大学时配的电脑&#xff0c;看着无用武之地&#xff0c;又还能用&#xff0c;于是想那它来搞个私有云nas。 一、选择想要入的坑 一开始对这块没什么了解和概念&#xff0c;最早是在旧主机上安装了个Ubuntu&#xff0c;然后再安装CassOS小尝试了下。可能CassOS里…

商家转账到零钱申请必过办法详解

微信支付平台会对商家转账到零钱的申请进行严格审核&#xff0c;以确保符合相关规定和政策。但可以通过专业机构协助并遵循正确的流程来实现一次通过&#xff0c;以下是一些建议&#xff1a; 1. 确认主体资格&#xff1a;申请商家转账到零钱必须为企业主体&#xff08;有限公司…

【笔记】linux中启动脚本遇到如下错误

[rootlinuxlocalhost sh]# ./bootStart.sh ./bootStart.sh:行1: o: 未找到命令 自动化部署脚本启动 停止原来运行中的工程 Stop Process... Stop Success! 准备从Git仓库拉取最新代码 开始从Git仓库拉取最新代码 remote: Enumerating objects: 21, done. remote: Counting obj…

关于搞定Assignment写作的4个技巧

澳洲各种科目已经进入期中阶段&#xff0c;诸多老师留下的Assignment也快要到截止日期。那么有什么关于Assignment写作的技巧吗&#xff1f;这篇文章告诉你! 1&#xff1a;不要假设&#xff0c;要寻求理解 不是所有的作业都是一样的。你需要弄清楚这是一篇学术论文、一份商业报…

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号&#xff0c;软件将编译生成的雷达信号任意波数据下载到信号发生器中&#xff0c;主要是1466-V矢量信号发生器&#xff0c;可实现雷达信号模拟产生。软件可模…

HDFS读写流程详细过程

HDFS读写流程详细过程 HDFS的定义一、组成架构二、优缺点三、读流程四、NameNode和SeconderyNameNode五、写流程 HDFS的定义 HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目录树来定位文…

opencv实现人脸检测功能----20240704

opencv实现人脸检测 早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。OpenCV 的官方版本中包含了一个更准确、基于深度学习的人脸检测器, 链接:基于深度学习…

码云项目如何弄到gitlab上面

码云项目如何弄到gitlab上面 git remote -v 可查看当前的远程仓库git remote remove origin 删除当前的远程仓库git remote add origin gitXXXX:XXXX/shares.git 添加新的远程仓库 这个是你在远程gitlab上面创建的一个空仓库的ssh 地址git remote -v 验证新的远程仓库是否添加…

身处奇瑞看三星:既“开卷“又“起火“,却更难受了

三星"起火" 这几天奇瑞的事情&#xff0c;让大家破防了&#xff0c;纷纷表示国内的就业市场环境普遍恶劣。 那我们转个眼&#xff0c;看看海外企业的情况。 最近一周&#xff0c;三星频频登上新闻&#xff0c;颇有"起火"之势。 在刚步入下半年的 7 月 1 日…

C++之boost智能指针

1、boost智能指针 资源获取即初始化&#xff1a;在构造函数中对资源进行初始化&#xff0c;在析构函数中释放。 智能指针的本质思想是&#xff1a;将堆对象的生存期&#xff0c;用栈对象来管理。这个栈对象就是智能指针。 当new 一个堆对象的时候&#xff0c;立刻用智能指针…

AI免费文档处理在线工具:文档总结;论文阅读

1、文档总结 NoteGPT 支持各种类型文档ppt、word、pdf等总结 https://notegpt.io/pdf-summary 另外各种大模型工具一般都支持文档上传总结&#xff1a; 例如kimi、通义等 参考&#xff1a;https://blog.csdn.net/weixin_42357472/article/details/138205261 2、论文阅读 h…