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 Data
                    2               RW Data
                    264             ZI Data
                    18242           Debug
                    arkcantask.o    Object Name

                    Total 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);//RAM
                temp = Convert.ToInt32(parts[3]) + Convert.ToInt32(parts[4]);
                tempStr += temp.ToString().PadLeft(7);//ROM

                tempStr += 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() + " ";//RAM
                temp = Convert.ToInt32(parts[3]) + Convert.ToInt32(parts[4]);
                tempStr += temp.ToString() + " ";//ROM

                tempStr += 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.mfbz.cn/a/771217.html

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

相关文章

【postgresql】版本学习

PostgreSQL 17 Beta 2 发布于2024-06-27。 PostgreSQL 17 Beta 2功能和变更功能的完整列表:PostgreSQL: Documentation: 17: E.1. Release 17 ​ 支持的版本: 16 ( 当前版本) / 15 / 14 / 13 / 12 ​ 不支持的版本: 11 / 10 / 9.6 / 9.5 /…

「前端」快速排序算法演示

快速排序算法演示。 布局描述 一个简单的HTML页面,用户可以在其中输入一系列用逗号分隔的数字。 一个CSS样式表,提供了一个美观大方的布局和样式。 一个JavaScript脚本,实现了快速排序算法,并在用户点击按钮时对输入的数字进行排序,并显示结果。 效果演示 核心代码 <…

Django创建项目

虚拟环境创建成功 使用命令行创建项目 创建一个文件夹&#xff0c;用pycharm打开&#xff0c;将之前创建好的虚拟环境选中&#xff08;这一步不在仔细赘述了&#xff0c;比较简单&#xff09; cd进入虚拟环境所在文件目录&#xff0c;打开虚拟环境pipenv shell 创建django项…

身边有填报志愿需求别错过!张雪峰透露今年志愿填报技巧:报专业,别报行业!(文末附稳定高薪专业推荐)

高考填报志愿是每个考生和家长都要面对的重大抉择。在当前就业形势日趋严峻、部分行业发展前景不明朗的大背景下,考生在填报志愿时更需要全面了解各个专业的就业前景,理性权衡自身兴趣特长与社会需求&#xff0c;而不是盲目跟风报考所谓的"热门专业"。 今天跟大家分…

对谈 MoonBit:AI 时代的编程语言应该是什么样子的?丨编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 本期节目&#xff0c;我们请到了 MoonBit 的创始人宏波和资深的开发者狼叔作为我们的嘉宾&…

人工智能在日常生活中的十大应用:从医疗到智能家居

人工智能已成为当今人类日常生活的重要组成部分&#xff0c;无论您是否意识到&#xff0c;它几乎在所有场景中都能提供帮助。每次您进行网络搜索、在线预订旅行、接收来自京东等购物平台的产品推荐又或是打开您的新浪、抖音时&#xff0c;都能看到影子&#xff0c;这些只是一些…

Python番外篇之代码编译与字节码

引言 关于字节码&#xff0c;不太想讲&#xff0c;不影响实际使用&#xff0c;对新手不友好…… 但是&#xff0c;涉及到新手经常碰到的问题的解惑&#xff0c;似乎又不得不讲。 最终&#xff0c;还是打算以番外篇的形式&#xff0c;稍微提一下。 不过&#xff0c;关于字节码的…

RabbitMQ入门教程(精细版二带图)

目录 六 RabbitMQ工作模式 6.1Hello World简单模式 6.1.1 什么是简单模式 6.1.2 RabbitMQ管理界面操作 6.1.3 生产者代码 6.1.4 消费者代码 6.2 Work queues工作队列模式 6.2.1 什么是工作队列模式 6.2.2 RabbitMQ管理界面操作 6.2.3 生产者代码 6.2.4 消费者代码 …

RAID详解

一、RAID存储是什么&#xff1f; RAID 存储&#xff08;Redundant Arrays of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff09;是一种通过将多个独立的物理磁盘组合在一起&#xff0c;以实现更高的存储性能、数据可靠性和容错能力的技术。其主要目的是解决单个磁盘…

tapd 与国内外主流的8大项目管理软件大对比

对比Tapd与8大项目管理工具&#xff1a;PingCode、Worktile、Redmine、Teambition、广联达、Jira、禅道、飞书。 Tapd 是腾讯推出的一款敏捷开发管理工具&#xff0c;特别适合那些需要高效协作和快速迭代的敏捷开发团队。它支持多种敏捷方法论&#xff0c;包括Scrum和Kanban&am…

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…

Android10以上实现获取设备序列号功能

Android10以上实现获取设备唯一标识&#xff0c;目前只支持华为和荣耀设备。实现原理&#xff1a;通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…

无人机智能追踪反制系统技术详解

随着无人机技术的飞速发展&#xff0c;无人机在各个领域的应用越来越广泛。然而&#xff0c;无人机的无序飞行和非法使用也带来了一系列安全隐患和威胁。因此&#xff0c;无人机智能追踪反制系统应运而生&#xff0c;成为维护公共安全和防止无人机滥用的重要工具。本文将详细介…

SPI四种模式--极性与相位

SPI的四种模式&#xff1a;相位和极性 极性 定义时钟空闲状态&#xff1a; CPOL0&#xff1a;时钟线在空闲状态为低电平 CPOL1&#xff1a;时钟线在空闲状态为高电平 这个设置决定了设备不进行通信时时钟线的状态。 兼容性&#xff1a; 不同的SPI设备可能需要不同的时钟极性…

Spring Boot 的机场投诉管理平台-计算机毕业设计源码22030

摘要 随着航空运输业的迅速发展&#xff0c;机场的客流量不断增加&#xff0c;旅客对机场服务的质量和效率也提出了更高的要求。为了提高机场的服务质量&#xff0c;及时处理旅客的投诉&#xff0c;建立一个高效、便捷的机场投诉管理平台显得尤为重要。 本项目旨在设计与实现一…

飞利浦的台灯值得入手吗?书客、松下多维度横评大分享!

随着生活品质的持续提升&#xff0c;人们对于健康的追求日益趋向精致与高端化。在这一潮流的推动下&#xff0c;护眼台灯以其卓越的护眼功效与便捷的操作体验&#xff0c;迅速在家电领域崭露头角&#xff0c;更成为了众多家庭书房中不可或缺的视力守护者。这些台灯以其精心设计…

AIGC对设计师积极性的影响

随着科技的迅猛发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;工具正逐渐深入设计的每个角落&#xff0c;对设计师的工作方式和思维模式产生了深远的影响。AIGC不仅极大提升了设计师的工作效率&#xff0c;更激发了他们的创新思维&#xff0c;为设计行业带来了翻…

java 基础之 反射技术_java 程序src阶段 class对象阶段 run阶段3个阶段

System.out.println(in); } publicClass[] aa1(String name, int[] password){ returnnew Class[]{String.class} ; } privatestatic void aa1(int num){ System.out.println(num“静态方法”); } public static void main(String[] args){ System.out.println(“main”…

MySQL单表千万级数据查询优化大家怎么说(评论有亮点)

题图来自APOD 上次写了一篇MySQL优化实战的文章“MySQL千万级数据从190秒优化到1秒全过程”。 这篇文章主要还是在实战MySQL优化&#xff0c;所以从造数据到查询SQL优化SQL都没有业务或者其它依赖&#xff0c;优化的技巧也不涉及软件架构就是纯SQL优化。 由于笔者经验有限和…

mysql:部署MySQL 8.0 环境

mysql网址&#xff1a;MySQL 点击 MySQL Community Server 选择合适的版本 选择8.0版本 下载完成&#xff0c;点击mysql-installer-community-8.0.26.0.msi文件&#xff0c;打开安装向导。 选择自定义安装类型 打开“Select Products” 窗口&#xff0c;可以定制需要安装的产…