stm32之堆栈
2016-02-28 00:40
274 查看
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
这样就明白了吧。
堆和栈的区别,举例
栈区(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"放在常量区 }
所以堆与栈的区别:
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 )
另外:堆栈溢出,编译不会提示,需要注意。
相关文章推荐
- wl-kmod
- Android编译本地C++程序方法
- 离我而去的2015,迎面而来的2016
- Python基础语法(Python基础知识点)
- 关于i++和++i的有效区分
- netcdf源码在windows上的编译
- 为什么Actor模型是高并发事务的终极解决方案
- netcdf源码在windows上的编译
- Apache与Nginx的优缺点比较
- Android自定义Dialog的一些问题
- linux 无线网卡
- 超级详解:委托与事件
- 【PAT】1039. 到底买不买(20)
- 反射应用
- nmap 命令操作
- linux删除文件
- android同时打开多个Activity的方式(应用于启动页面广告等场景)
- img reload
- HDU 4604 Deque(dp、LIS)
- WIN7 64bit IIS7.5:HTTP错误404.17-Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序