历史上的今天
今天是:2025年04月16日(星期三)
2019年04月16日 | stm32之堆栈
2019-04-16 来源:eefocus
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之程序如何防止堆栈溢出
史海拾趣
|
随着音乐手机概念的风行,手机不再是一个简单的通话工具,人们越来越关心手机的音乐播放音效,这给手机音频设计也带来了越来越多的压力。本文概述手机模拟音频设计中经常会遇到的耳机爆破音、TDMA噪声产生的机理,并介绍通过选择合适的耳机驱动器来 ...… 查看全部问答> |
|
之前弄了很久的LINUX-2.6.31版本的,但是还是弄不出来,老是有很多的错误的,就是怎么也加载不了文件系统,所有我干脆就放弃了,来弄点底版本的,2.6.30版本。 很多书基本上都是这样写的 1.修改顶层Makefile文件 直接将Makefile文 ...… 查看全部问答> |
|
1)生物体接收X射线照射时,产生生物效应,破坏正常的组织细胞,产生生物损伤。 2) 主要从以下几个方面加强防护: ①加强固有防护设施;②缩短X射线照射时间;③加大与X射线源的距离;④尽可能应用各种屏蔽。 详细分析: X射线与物质相互作用时产生 ...… 查看全部问答> |
|
有人做过STM32 的IAP吗 我用CAN接口做了IAP 有两个程序区 8000000-8002000是BOOT区,写入的启动代码,引导应用程序写入的。 8002000-结尾是应用区,APP程序区 现在的问题是进行APP程序后,不响应中断 如果不用中断程序,在APP工作一切正 ...… 查看全部问答> |




