STM32编译后程序的Flash与RAM与Stack占用情况分析

对于STM32编译后,可以在Option->Linker->List中的Generate linker map file打上勾,这样编译后就会在IAR\Debug\List目录生成xxx.map文件。通过分析此文件,我们可以分析STM32编译后程序的Flash与RAM占用情况,还可以得到程序中所有符号表的地址等,这个文件就像Linux内核的System.map文件一样非常有用,里面描述程序映像的结构。

1.  STM32编译后的MAP文件中,刚开始部分为一些信息和位置

     IAR ELF Linker器的版本,MAP文件路径等信息。


2.  MAP文件的PLACEMENT SUMMARY部分

各Section(段)存储的位置,即各段在存储器中的分布。此部分会显示代码和数据在flash和RAM中的映射地址,STM32中0x08000000开头的一般是位于Flash地址空间,0x20000000一般位于RAM空间,0x10000000一般位于特殊ram空间,我们关心的一般是0x20000000和0x08000000开头的地址。比如:

STM32编译后程序的Flash与RAM与Stack占用情况分析_第1张图片

紧接着是这些段的详细说明:

STM32编译后程序的Flash与RAM与Stack占用情况分析_第2张图片

上述意思是A1段总共大小为0x200字节,其中“.intvec”段类型为const,地址0x08010000,大小0x200,位于test文件;"A1"段结束地址为0x08010200,总共大小0x200。

注意:段Section与类型Kind一般有如下对应关系:

STM32编译后程序的Flash与RAM与Stack占用情况分析_第3张图片

此部分中的内存还是很有用的,可以看出程序的结构,如何分段等内容。

 

3.  MAP文件的INIT TABLE部分

初始化表,显示与初始化有关的section tables。


4.  MAP文件的MODULE SUMMARY部分

显示所有被链接的文件信息,包括目标文件和库文件被link后的ro代码大小和rw数据大小。

STM32编译后程序的Flash与RAM与Stack占用情况分析_第4张图片


5.  MAP文件的ENTRY LIST部分 

    此部分非常有用。即入口列表,包含函数、变量等入口地址。其中Entry(入口)主要包含两大类:函数和变量。

STM32编译后程序的Flash与RAM与Stack占用情况分析_第5张图片

对应解释如下:
1). (全局函数名称)     入口地址,flash地址      占用flash大小       全局函数                       目标文件,即此函数位于main.c文件里面 
2). (静态函数名称)     入口地址,flash地址      占用flash大小       静态函数                       目标文件
3). (全局变量名称)     RAM地址                     占用RAM大小       全局变量(全局数据)      此变量被链接在alarm.o目标文件中
4). (静态变量名称)     RAM地址                     占用RAM大小       静态变量(静态数据)      此变量被链接在main.o目标文件中
5). (静态变量名称)     RAM地址                     占用RAM大小       静态变量(函数内)          此变量被链接在main.o目标文件中

注意:
1). 类型type中,Gb标识表示全局;Lc表示局部Local,Lc在这里指用static定义的函数或变量。Code一般表函数,Data一般表变量。
2). 有STM32存储地址空间可知,一般0x08000xxx表示flash地址空间,即位于flash,存储与flash的地址;0x200xxxxx表示RAM地址       空间,位于RAM,即在RAM中的地址。 
3). 静态变量分为文件内静态变量和函数内静态变量,它们都是用static定义过的变量,文件内静态变量只能在文件内使用,函数内静       态变量只能在函数内使用,它们的类型都是"Data  Lc",函数内静态变量一般入口名称表示为“main::s_ucErrCode”。
4). 只有全局和静态的变量才会在编译之后决定在RAM中的地址,定义在函数体里面的局部变量只有在程序运行时才会分配地址,这         些变量位于堆栈。
5). 通过分析ENTRY LIST部分,可以知道程序编译后占用的flash和RAM大小。至于堆栈大小,可以用ucosII函数接口统计任务堆栈大       小后再指定任务堆栈大小。

6.  IAR编译出的程序,使用的flash和ram大小可以查看xxx.map文件,一般在文件末尾最后三行:

  296 229 bytes of readonly  code memory
   91 827 bytes of readonly  data memory
  178 530 bytes of readwrite data memory
  
    头两行之和为flash空间,最后一行(rw数据)代表占用RAM空间大小。

7. 对于堆栈情况的分析,可参考文章中分析:

http://blog.csdn.net/HowieXue/article/details/80381023

你可能感兴趣的:(STM32与ucos)