stm32中的堆栈设置
keil编译完成时存储情况
当编译成功时,会出现:
BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632
Code:程序代码部分
RO-data: 程序定义的常量const temp
RW-data:已初始化的全局变量
ZI-data:未初始化的全局变量
片中的:
flash=Code+RO-data+RW-data
RAM=RW-data+ZI-data
通过上面的BUILD可以看出,这个程序已经用了1600多的RAM,为什么会出用到这么多的RAM呢?
在startup_stm32f10x_md.s文件中存在:
Stack_Size EQU 0x00000400
Heap_Size EQU 0x00000200
1
2
3
这样就明白了吧。
堆和栈的区别,举例
栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。
文字常量区:常量字符串就是存放在这里的。
程序代码区:存放函数体的二进制代码。
例:
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[]="abc"; //栈
char *p3= "1234567"; //在文字常量区Flash
static int c =0 //静态初始化区
p1= (char *)malloc(10); //堆区
strcpy(p1,"123456"); //"123456"放在常量区
}
1
2
3
4
5
6
7
8
9
10
11
所以堆与栈的区别:
stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。
stack的空间有限,heap是很大的自由存储区。
所以:程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。
在程序中需要注意的情况
如果使用了HEAP,则必须设置HEAP大小。
如果是STACK,可以设置为0,不影响程序运行。(不管设置多少生成的HEX文件都是一样的,不过会影响调试,需注意)
而一般我们可以通过查看.htm中Maximum Stack Usage = 344 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)来方便确定大小。
(为安全起见,预留点空间,上例可修改为Stack_Size EQU 0x00000200 )
另外:堆栈溢出,编译不会提示,需要注意。
上一篇:说说STM32的堆栈与内存
下一篇:STM32之程序如何防止堆栈溢出
推荐阅读最新更新时间:2024-11-12 15:02
设计资源 培训 开发板 精华推荐
- 山雀模拟_桌面电源
- LTC3615HUF 单路低纹波 6A 输出同步降压型 DC/DC 转换器的典型应用
- 使用 NXP Semiconductors 的 NX5P1000UK 的参考设计
- LT1764EQ-1.8 并联 LDO 稳压器以实现更高输出电流的典型应用
- 基于STSPIN32F0252的电池供电的无刷电动工具的紧凑型参考设计
- iCAN copy
- NCL30186SMRTGEVB:8W 智能 LED 驱动器
- EVAL-AD7678CBZ,用于 AD7678、18 位、100 Ksps PulSAR 模数转换器的评估板
- 狗腿子
- NCP301LSN34T1 3.4V 窗口电压检测器的典型应用