在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