stm32之堆栈
来源:互联网 发布:tdgsm是什么卡的网络 编辑:程序博客网 时间:2024/05/28 16:00
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 )
另外:堆栈溢出,编译不会提示,需要注意。
0 0
- stm32之堆栈
- STM32之程序如何防止堆栈溢出
- STM32学习笔记之堆栈空间
- STM32堆栈
- STM32堆栈
- STM32堆栈设置
- STM32 堆栈知识
- STM32堆栈学习
- STM32内存与堆栈
- STM32堆栈整理
- STM32堆栈区
- 关于stm32堆栈的问题
- STM32 存储器与堆栈问题
- STM32堆栈大小及位置
- 【STM32】STM32之串口
- 【STM32】STM32之NVIC
- 【STM32】STM32之SWD
- 【STM32】STM32之LED
- 超级详解:委托与事件
- Android自定义Dialog的一些问题
- 为什么Actor模型是高并发事务的终极解决方案
- wl-kmod
- Android编译本地C++程序方法
- stm32之堆栈
- [LeetCode] 226 翻转二叉树
- java并发包concurrent翻译及源码分析之:ReadWriteLock
- LruCache的实现原理(图片三级缓存)
- 如何编译ffmpeg以支持dshow设备
- hello react.js
- Java调用ffmpeg进行视频转码
- HDU 4605 Magic Ball Game(离线、BIT)
- build-tools\21.1.2\aapt.exe finished with non- zero exit value 1错误