.map文件分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jacklondonjia/article/details/78908158

在IAR的工程的Output文件夹中有个.map文件,该文件说明了各个函数占用的尺寸和地址。

"A0":  place at 0x08000000 { ro section .intvec };
"P1":  place in [from 0x08000000 to 0x08007fff] { ro };
"P2":  place in [from 0x20000000 to 0x200027ff] { rw, block CSTACK, block HEAP };

A0上面是MSP初始地址、PC初始地址以及中断向量表


P1上面是程序段,包括.text(程序)及.rodata(只读数据,一般是常量值) 
.text(程序):2字节对齐,用户自定义的程序、标准库程序、startup_stm32f10x_ld的程序,以及初始化变量的函数 zero_init3的程序

.rodata(只读数据,一般是常量值):用户自定义的程序中的常量(比如常量字符串和#define定义的常量等,如果是字符串还要算上结尾的/0,4字节对齐),copy_init3函数中的常量、用于掉电存储的数据


P1上面是SRAM数据,包括.data、cstack、.bss

.data: inited ,通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配

.bss:zero,通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。

cstack:函数局部变量用的区域,所有的功能函数使用的局部变量都是从这个堆栈申请使用的,用完了再还回去。子函数里面用到的局部变量都是在这里面取来用的.例如:
void Fn(void)
{
     unsigned char TT[64];
}

TT[64] 就会从CSTACK取出来用,用完后TT没用了,就可以还给CSTACK了,当子函数使用局部变量太多的时候,要注意CSTACK尺寸.

对应的还有RSTACK 程序返回用的,保存的是程序调用函数的返回地址  , 你填写的数值 X 2才是占用的字节数,例如,你填写10,那么RSTACK尺寸是20字节,可以函数嵌套10层左右

参考链接:https://www.amobbs.com/thread-3280855-1-1.html

没有更多推荐了,返回首页