KEIL工具之堆栈2
=========================================
函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以战舰stm32开发板为例,在startup_stm32f10x_hd.s里面,开头就有:
Stack_Size EQU 0x00000800
表示栈大小是0X800,也就是2048字节.这样,CPU处理任务的时候,函数局部变量做多可占用的大小就是:2048字节,注意:是所有在处理的函数,包括函数嵌套,递归,等等,都是从这个"栈"里面,来分配的.
所以,如果一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault....
这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!
==========================================
在一个函数中变量存放在Stack中,值不能大于KEIL中的值,否则调试时变量的值显示莫名其妙的数值,导致
堆溢出。
此处的一个函数的定义为整个函数结束。
比如:
函数A定义如下:
A
{
U8 DATA[500];
B();
C();
}
B
{
U8 DATA[500];
}
C
{
U8 DATA[500];
此时函数B和C中的堆就溢出了。
=========================================
KEIL中堆栈计算方式:
Stack_Size EQU 0x00000400
Heap_Size EQU 0x00000200
0x00000400 等于1024字节所以等于1K
0x00000200 等于512字节所以等于512byte
=========================================
1.堆栈定义: