单片机里的堆栈

Posted wcw12580

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机里的堆栈相关的知识,希望对你有一定的参考价值。

                          单片机里的堆栈

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

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

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

技术图片图1-1

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

 

以上是关于单片机里的堆栈的主要内容,如果未能解决你的问题,请参考以下文章

什么是堆栈,51单片机堆栈指针SP的使用

什么叫堆栈?8051堆栈指示器SP有多少位,作用是什么?单片机初始化话后SP中的内容是什么?

yongc语言编写单片机程序,出现了堆栈溢出情况,怎么解决?堆栈指针怎么初始化?

对单片机堆栈的理解

51单片机stack堆栈

51单片机死机重启的原因都有哪些?