单片机出现堆栈的修改

控制/MCU

1833人已加入

描述

做单片机的应该都听说过堆栈,跟指针一样,一看到这两个就会莫名的蛋疼。但是用汇编的同志肯定不会陌生,因为要经常出栈入栈,但是用C语言的同志有一些可能就比较陌生了,因为出入栈全部交给了编译器。最近我就在这里吃了亏,虽然听说过堆栈,也知道在哪里修改,但因为以前写的代码量很小,变量完全不会让堆栈溢出,所以从来没意识到它的重要性,直到最近写了一个数据量很大的程序,才意识到必须要重视堆栈。

首先说一下它出现的一些现象,应该说无法推断出它将会出现什么现象,因为堆栈溢出后,程序和参数就会全部乱套了,可能不是很要紧也可能让系统崩溃。我第一次发现奇怪的现象是在调试GSM模块通讯的时候,在处理数据的时候大量使用了sprintf标准函数,通讯经常出现异常,断开或者数据错乱,但是我又不熟悉标准函数,所有一直怀疑是使用不合理的问题,就这样整个工程磕磕碰碰写下去,总是感觉工程不稳定,但是怎么看逻辑都没有错,让自己一度抑郁。直到后来抓到一个现象,有两个连续的for循环,第一个正常运行,第二个运行到一半就跳到第一个for循环重新开始,程序终于在这里崩溃了。这非常明显是指针错乱了,让我意识到了堆栈的问题,我把堆栈改大了,但是算错数,结果还是无效,连我自己都崩溃了。好在意志坚定地锁定为堆栈问题,最终解决了。

接下来就说说我修改了哪里吧。其实就仅仅是在stm32中修改了两个数值,一个是栈(stack_size)的大小,一个是堆(heap_size)的大小,如图1-1。

STM32

图1-1

堆和栈其实是两个不同的概念,可以这样通俗的去理解,堆是程序猿自己操作的,而栈是编译器帮你操作的。一般在操作系统中,内存是由程序猿自个进行动态分配和回收的,这部分内存就是堆。而我们写的那些个临时变量,通常都是编译器编译的时候自动分配的,这块内存就是栈。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分