apollo系列之apollo2 mcu开发(基础篇)之1.3-解析编译生成的IAR中的map文件

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: apollo系列之apollo2 mcu开发(基础篇)之1.3-解析编译生成的IAR中的map文件

一、map文件的主信息

###############################################################################
#
# IAR ELF Linker V8.32.2.178/W32 for ARM                  12/Jan/2021  16:24:56
# Copyright 2007-2018 IAR Systems AB.
#
#    Output file  =  
#    ...\iar\bin\VoS_THF.out
#    Map file     =  
#      ...\iar\bin\VoS_THF.map
#    Command line =  
#     ...
#
###############################################################################


主要是文件路径,IAR的版本信息等。


二、运行模型属性(RUNTIME MODEL ATTRIBUTES)

*******************************************************************************
*** RUNTIME MODEL ATTRIBUTES
***
CppFlavor       = *
__Heap_Handler  = DLMalloc
__SystemLibrary = DLib
__dlib_version  = 6


运行模型属性:__Heap_Handler用的是DLMalloc,__SystemLibrarys DLib,__dlib_version版本是6


三、堆选择(HEAP SELECTION)

*******************************************************************************
*** HEAP SELECTION
***
The advanced heap was selected because the application calls memory
allocation functions outside of system library functions, and there
are calls to deallocation functions in the application.


之所以选择高级堆,是因为应用程序在系统库函数之外调用内存分配函数,并且应用程序中有对回收分配函数的调用。


四、

*******************************************************************************
*** PLACEMENT SUMMARY
***
"A0":  place at 0x0 { ro section .intvec };//A0段位于0,类型.intvec
"P1":  place in [from 0x0 to 0xf'ffff] { ro };//p1段位于0到0xfffff,类型ro
define block CSTACK with size = 1K, alignment = 8 { };//定义堆块1K,8字节对齐
define block HEAP with size = 2K, alignment = 8 { };//定义栈2K,8字节对齐
"P3":  place in [from 0x0 to 0x0] |
                [from 0x1000'0000 to 0x1003'ffff] {
          rw, block CSTACK, block HEAP };
do not initialize { section .noinit };
initialize by copy { rw };
No sections matched the following patterns:
  ro section application_specific_ro  in "P2|P4"
  rw section application_specific_rw  in "P2|P4"
  Section(段)       Kind(种类) Address     Size  Object(编译后的对象)
  -------            ----         -------     ----  ------
"A0":                                         0xc0
  .intvec            const            0x0     0xc0  startup_iar.o [1]
                                   - 0xc0     0xc0
"P1":                                      0x50573
  .rodata            const           0xc0  0x21778  cnn.o [5]//常量
  .rodata            const       0x2'1838  0x213f8  cnn_stage2.o [5]
  .text              ro code     0x4'2c30   0x22c0  am_hal_iom.o [6]//ro code 代码
  .text              ro code     0x4'4ef0      0x2  am_hal_debug.o [6]
  .text              ro code     0x4'4ef2     0x3a  zero_init3.o [9]
。。。
"P3", part 1 of 3:                           0x2ae
  P3 s0                       0x1000'0000    0x2ae  <Init block>
    .data            inited   0x1000'0000    0x134  am_hal_iom.o [6]//.data已经初始化数据
。。。
"P3", part 2 of 3:                         0x2d154//.bss 未初始化数据 为0
  .bss               zero     0x1000'02b0  0x1803c  am_audio_buffer.o [1]
  .bss               zero     0x1001'82ec  0x10018  heap_4.o [1]
。。。
P3", part 3 of 3:                          0x1000//未初始化
  .noinit            uninit   0x1002'd404   0x1000  startup_iar.o [1]
                            - 0x1002'e404   0x1000
Unused ranges://空闲范围
         From           To      Size
         ----           --      ----
     0x5'0633     0xf'ffff  0xa'f9cd//flash空闲地址段
  0x1000'02ae  0x1000'02af       0x2
  0x1002'e404  0x1003'ffff  0x1'1bfc


总结:

1.  Section(段)       Kind(种类) Address(地址)     Size(大小)  Object(编译后的对象)


2..rodata:常量


3.text:代码段


4..bss:BSS段(bss segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。


5.noinit:未初始化部分


6..data:已初始化



四、初始化列表(INIT TABLE)

*******************************************************************************
*** INIT TABLE
***
          Address      Size
          -------      ----
Zero (__iar_zero_init3)
    1 destination range, total size 0x2d153:
          0x1000'02b0  0x2d153
Copy/packbits (__iar_packbits_init3)
    1 source range, total size 0xef (34% of destination):
             0x5'0544     0xef
    1 destination range, total size 0x2ae:
          0x1000'0000    0x2ae
五、模块概述(MODULE SUMMARY)
*******************************************************************************
*** MODULE SUMMARY
***
    Module                              ro code  ro data  rw data
    ------                              -------  -------  -------
command line/config:
    -------------------------------------------------------------
    Total:
 am_app_KWD_audio.o                      248               328
 am_app_KWD_board_setup.o              1 508       95       20
 am_app_KWD_init.o                       136      152    1 111
 am_app_KWD_isr.o                        352                 1
...
  -------------------------------------------------------------
    Total:                               12 460      450  173 255
...
-----------------------------------------------------------------
    Grand Total:                         50 710  278 557  189 441
这部分主要描述文件库ro代码大小,ro rw数据大小。


六、入口列表(ENTRY LIST)

*******************************************************************************
*** ENTRY LIST
***
Entry                       Address     Size  Type      Object
-----                       -------     ----  ----      ------
.iar.init_table$$Base      0x5'04b4            --   Gb  - Linker created -
.iar.init_table$$Limit     0x5'04e0            --   Gb  - Linker created -
?main                      0x5'04e1           Code  Gb  cmain.o [9]
GPIO_Init                  0x4'a79f    0x288  Code  Lc  am_app_KWD_board_setup.o [1]
。。。
   50 710 bytes of readonly  code memory//只读属性,代码内存,存储在flahs中
  278 557 bytes of readonly  data memory//只读变量内存,存储在flash中
  189 441 bytes of readwrite data memory//可读可写变量内存


总结:

1.?main,全局函数入口,地址0x504e1,存储在flash中


2.Code Gb,代码段,全局函数


3.Code LC,局部函数


4.Data  Lc,局部变量


5.Data  Gb,全局变量


Flash = readonly code memory + readonly data memory

RAM = readwrite data memory


目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
76 0
|
1月前
|
自然语言处理 编译器 Linux
|
29天前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
40 3
|
1月前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
1月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
2月前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
68 3
|
2月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
2月前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
40 0
|
3月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19

推荐镜像

更多
下一篇
DataWorks