大家好我是小火,想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。玩单片机的朋友都应该都听说过堆栈。堆和栈实际上是完全不同的两个概念。比较通俗的理解就是,堆是由程序自己操作,栈由编译器操作。一般在操作系统中,内存是由程序自己动态分配和回收的。这部分内存就是堆。我们写的临时变量通常是编译器在编译的时候自动分配的。这个内存就是栈。

打开网易新闻 查看精彩图片

堆栈对于我来说就像和看到指针一样,看到这哥俩我就会感到头莫名的疼。但是用汇编进行开发的朋友肯定对它不会陌生,因为汇编要经常出栈进栈,像我这种使用C语言的部分开发者对它就不熟悉。我就在堆栈这里遇到了问题。虽然之前听说过堆栈,大概知道在哪里进行操作,但也是一直停留在理论上的知道,没有意识到它的重要性然后进行实际去学习操作,因为之前写的项目代码量相对比较小,变量没出现溢出栈。这次写了一个数据量很大的程序,然后出现了问题,我才意识到堆栈的重要性和自己的知识不足的问题。

堆栈发生问题时会产生很多奇怪的问题,我就说说我看到的一些现象。堆栈溢出后,程序和参数就会完全乱了套,出现程序重启或者系统崩溃。我当时是在对GSM模块通信进行调试的时候,在处理数据的时候使用了很多sprintf标准函数。就出现了通讯故障、断线或数据乱码等问题,由于自己对标准功能不熟悉。在一些处理上使用不合理。整个项目进行得磕磕绊绊。我觉得一定是某个地方出现了问题导致不稳定,自己的逻辑上没有错,找不到问题解决不了让我一度很沮丧。经过反复的测试后来我发现一个现象,两个连续的 for 循环,第一个运行正常然后第二个跳到第一个for循环中途就出现了重启。程序在这里就崩溃了。看到了问题就好处理了,经过观察我发现是指针乱序了,我意识到了可能是堆栈出现了问题。我把栈变大了,问题就得到了解决。

接下来说说我在哪里修改的。其实STM32中只修改了两个值,一个是stack_size的大小,一个是heap_size的大小。

打开网易新闻 查看精彩图片

遇到问题一定要多测试观察才能找到其中的问题,自身的知识要储备好,遇到问题才不会手忙脚乱

本期先分享到这里,想要学习单片机编程的同学可以持续关注小火,回复“我要入门”,与我们一起成长,喜欢的可以点个赞关注我们!