单片机中堆和栈的区别

单片机中堆和栈的区别M0中的栈和堆一、栈和堆空间的区别:(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域…

大家好,欢迎来到IT知识分享网。

M0中的栈和堆

一、栈和堆空间的区别:

1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。
3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。

4)文字常量区:常量字符串就是存放在这里的。

5)程序代码区:存放函数体的二进制代码

如图:在地址中栈和堆的地址及存储方式。

https://img.mushiming.top/app/yundeesoft_com/be3672c229114d779fc4e69a57d9097e.jpg

图一

 

二、栈和堆空间的空间分配

栈:向低地址扩展(如图一)

堆:向高地址扩展(如图一)

显然如果依次定义变量,

先定义的栈变量的内存地址比后定义的栈变量的内存地址要大

先定义的堆变量的内存地址比后定义的堆变量的内存地址要小

三、堆和栈变量
栈:临时变量,退出该作用域就会自动释放

存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。所以栈是一种分时轮流使用的存储区。编译器里定义的Stack_Size,是为了限定函数的局部数据活动的范围,超过这个范围就会跑飞,也就是栈溢出;
     Stack_Size不影响Hex,更不影响Hex怎么运行的,只是在Debug调试时会提示报错。栈溢出也就是超过了国界进行活动,只要老外没有意见,你可以接着玩,有老外不让你玩,你就的得死,或是大家都死(互相撕杀),有的人写单片机代码在函数里定义一个大数组 int buf[8192],栈要是小于8192是会死的很惨。 所以不要在局部变量里定义大数组。

堆:malloc变量申请空间,通过free函数释放(若是不释放一直占用空间,最后空间占满溢出,程序崩溃)

所以若是程序中有用到malloc要申请变量空间,这时就要在编译

器里定义堆的大小。先分配空间,后程序中才能申请,用完一定

要释放,不然就会造成内存溢出,程序崩溃。

总之:堆和栈都存在RAM里,他两各分多少看函数需求,但是他两的总值不能超过单片机硬件的实际RAM大小,否则只能外扩SRAM,或者程序就要崩溃死掉。

另外:堆栈溢出,编译不会提示,需要注意

总结:

如果我们设置了堆的空间大小,但是我们程序中没有进行malloc申请,那么程序在运行的时候,我们栈的空间超过本身设置的空间,进入到堆里面,那么程序是不会出错的,但是超过了堆的空间了,进入到全局变量区域,就会出现莫名其妙的错误。

 若是我们不使用malloc,我们可以将堆设置成0,这是没有问题的,但是栈的空间大小要设置成合适的,不然就会因为栈溢出,进入harderror,程序奔溃。

四、M0中栈和堆的分配。

单片机中堆和栈的区别

图二

M0中栈和堆的分配是在开始文件里,这里已stm32F0系列为例,他是在startup_stm32f00xx.s文件里。(如图二)

Stack_Size      EQU     0x00000200

定义栈的大小,此时0x00000200定义栈为512bit

Heap_Size       EQU     0x00000100

定义堆的大小,此时0x00000100定义堆为256bit

若是想修改大小,在这里修改即可。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10172.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信