.map文件是STM32开发中非常重要的一个文件,在该文件中可以详细的查看单个文件、函数及用户定义的全局变量等的占用RAM和ROM(一般为片内FLASH)的空间大小,通过了解这些信息可以很方便的进行代码的优化。
在MDK5中,生成的.map文件包含的内容可以在Options for Target--->Listing中如下界面中进行配置,默认是全选的,用户也可以根据自己的需求进行选择,如只生成Total info信息。在配置好map生成选项后编译整个工程,双击Project框中的项目名称即可打开.map文件。
第一行startup_stm32f103xb.o(RESET) refers to startup_stm32f103xb.o(STACK) for __initial_sp说明:startup_stm32f103xb.o文件中的“RESET”段为它使用的__initial_sp引用了startup_stm32f103xb.o文件中的“STACK”段。
有时候在编译工程时会报错,提示"Undefined symbol xxx(referred from yyy.o)",这表明在链接的过程中,yyy.o文件中引用的xxx符号并没有被定义,此时我们需要打开yyy.c或yyy.s文件查看xxx是否被定义,没定义需加上定义。
.o文件是.c文件或.s文件编译后生成的目标文件,各个文件及文件内的段是相互独立的,链接器根据它们之间的相互引用将各文件链接起来。
2)Removing Unused input sections from the image.
该部分描述了被MDK编译器优化掉的在链接过程中链接器发现的并未在工程中被引用的段或函数。这里需要注意的是,这部分并非在.o文件中被删除的,而是在链接器将这些.o文件链接生成.axf文件的过程中忽略掉这些无用部分,只将有用到的部分添加进.axf文件,如此可以有效的减少代码占用空间大小。
在.map中生成该部分信息需要勾选下图中的标签7:
.map文件中生成的信息如下所示(部分截图):
在MDK中可以通过勾选Options for Target--->C/C++--->One ELF Section per Function选项进行多余函数优化,若不勾选该选项也会进行部分函数优化,但不够彻底
下面通过实例说明勾选和不勾选One ELF Section per Function对生成的工程的影响:
当勾选Options for Target--->C/C++中的One ELF Section per Function后在.map文件中生成的Removing Unused input sections from the image部分总结果如下:
共优化了529个函数,减少占用空间30270Bytes
当取消勾选Options for Target--->C/C++中的One ELF Section per Function后在.map文件中生成的Removing Unused input sections from the image部分总结果如下:
共优化了121个函数,减少占用空间3806Bytes
通过以上对比可发现,勾选Options for Target--->C/C++--->One ELF Section per Function相比于不勾选要减少代码空间为26464Byte(30270 - 3806 )。这部分优化的空间最终会体现在Program Size中的Code大小上(60560 - 35716 = 24844Bytes),因此该选项对工程代码的优化有很大的作用,建议要勾选上这个选项。
3)Image Symbol Table
该部分描述了Local Symbols和Global Symbols,即局部标号和全局标号。
在.map中生成该部分信息需要勾选下图中的标签3:
.map文件中生成的信息如下所示(部分截图):
Local Symbols主要指的是通过static声明的全局变量地址和大小,.c文件中函数的地址和用static声明的函数代码的大小,汇编文件中的作用域限定在本文件中的标号地址。如被限定在某个.c文件中使用的函数一般用static进行修饰防止和其它文件中的同名函数冲突,如在某个函数内部通过static声明的变量虽然具有全局的生命周期但其只能在该函数中被访问。
Global Symbols主要是指不是用static声明的全局变量的地址和大小,.c文件中和函数的地址及其代码大小,汇编文件中作用域为全工程的标号地址。
4)Memory Map of the image
该部分描述了映像文件的内存映射。
在.map中生成该部分信息需要勾选下图中的标签1:
从如上汇总信息可以看出,整个程序下载到STM32的ROM(FLASH)中时占用的空间大小为从0x08000000开始的38440字节 (Code + RO Data + RW Data) 。当程序运行时,占用的RAM空间大小为从0x20000000开始的11152字节(RW Data + ZI Data)。
.map文件是STM32开发中非常重要的一个文件,在该文件中可以详细的查看单个文件、函数及用户定义的全局变量等的占用RAM和ROM(一般为片内FLASH)的空间大小,通过了解这些信息可以很方便的进行代码的优化。
在MDK5中,生成的.map文件包含的内容可以在Options for Target--->Listing中如下界面中进行配置,默认是全选的,用户也可以根据自己的需求进行选择,如只生成Total info信息。在配置好map生成选项后编译整个工程,双击Project框中的项目名称即可打开.map文件。
第一行startup_stm32f103xb.o(RESET) refers to startup_stm32f103xb.o(STACK) for __initial_sp说明:startup_stm32f103xb.o文件中的“RESET”段为它使用的__initial_sp引用了startup_stm32f103xb.o文件中的“STACK”段。
有时候在编译工程时会报错,提示"Undefined symbol xxx(referred from yyy.o)",这表明在链接的过程中,yyy.o文件中引用的xxx符号并没有被定义,此时我们需要打开yyy.c或yyy.s文件查看xxx是否被定义,没定义需加上定义。
.o文件是.c文件或.s文件编译后生成的目标文件,各个文件及文件内的段是相互独立的,链接器根据它们之间的相互引用将各文件链接起来。
2)Removing Unused input sections from the image.
该部分描述了被MDK编译器优化掉的在链接过程中链接器发现的并未在工程中被引用的段或函数。这里需要注意的是,这部分并非在.o文件中被删除的,而是在链接器将这些.o文件链接生成.axf文件的过程中忽略掉这些无用部分,只将有用到的部分添加进.axf文件,如此可以有效的减少代码占用空间大小。
在.map中生成该部分信息需要勾选下图中的标签7:
.map文件中生成的信息如下所示(部分截图):
在MDK中可以通过勾选Options for Target--->C/C++--->One ELF Section per Function选项进行多余函数优化,若不勾选该选项也会进行部分函数优化,但不够彻底
下面通过实例说明勾选和不勾选One ELF Section per Function对生成的工程的影响:
当勾选Options for Target--->C/C++中的One ELF Section per Function后在.map文件中生成的Removing Unused input sections from the image部分总结果如下:
共优化了529个函数,减少占用空间30270Bytes
当取消勾选Options for Target--->C/C++中的One ELF Section per Function后在.map文件中生成的Removing Unused input sections from the image部分总结果如下:
共优化了121个函数,减少占用空间3806Bytes
通过以上对比可发现,勾选Options for Target--->C/C++--->One ELF Section per Function相比于不勾选要减少代码空间为26464Byte(30270 - 3806 )。这部分优化的空间最终会体现在Program Size中的Code大小上(60560 - 35716 = 24844Bytes),因此该选项对工程代码的优化有很大的作用,建议要勾选上这个选项。
3)Image Symbol Table
该部分描述了Local Symbols和Global Symbols,即局部标号和全局标号。
在.map中生成该部分信息需要勾选下图中的标签3:
.map文件中生成的信息如下所示(部分截图):
Local Symbols主要指的是通过static声明的全局变量地址和大小,.c文件中函数的地址和用static声明的函数代码的大小,汇编文件中的作用域限定在本文件中的标号地址。如被限定在某个.c文件中使用的函数一般用static进行修饰防止和其它文件中的同名函数冲突,如在某个函数内部通过static声明的变量虽然具有全局的生命周期但其只能在该函数中被访问。
Global Symbols主要是指不是用static声明的全局变量的地址和大小,.c文件中和函数的地址及其代码大小,汇编文件中作用域为全工程的标号地址。
4)Memory Map of the image
该部分描述了映像文件的内存映射。
在.map中生成该部分信息需要勾选下图中的标签1:
从如上汇总信息可以看出,整个程序下载到STM32的ROM(FLASH)中时占用的空间大小为从0x08000000开始的38440字节 (Code + RO Data + RW Data) 。当程序运行时,占用的RAM空间大小为从0x20000000开始的11152字节(RW Data + ZI Data)。