做单片机的应该都听说过仓库,跟指针相同,一看到这两个就会莫名的蛋疼。可是用汇编的同志必定不会生疏,由于要常常出栈入栈,可是用C言语的同志有一些或许就比较生疏了,由于收支栈悉数交给了编译器。最近我就在这儿吃了亏,尽管听说过仓库,也知道在哪里修正,但由于曾经写的代码量很小,变量彻底不会让仓库溢出,所以从来没认识到它的重要性,直到最近写了一个数据量很大的程序,才认识到必需要注重仓库。
首先说一下它呈现的一些现象,应该说无法推断出它将会呈现什么现象,由于仓库溢出后,程序和参数就会悉数乱套了,或许不是很要紧也或许让体系溃散。我第一次发现古怪的现象是在调试GSM模块通讯的时分,在处理数据的时分很多运用了sprintf规范函数,通讯常常呈现异常,断开或许数据紊乱,可是我又不了解规范函数,一切一向怀疑是运用不合理的问题,就这样整个工程磕磕碰碰写下去,总是感觉工程不稳定,可是怎么看逻辑都没有错,让自己一度郁闷。直到后来抓到一个现象,有两个接连的for循环,第一个正常运转,第二个运转到一半就跳到第一个for循环重新开始,程序总算在这儿溃散了。这十分显着是指针紊乱了,让我认识到了仓库的问题,我把仓库改大了,可是算错数,成果仍是无效,连我自己都溃散了。好在毅力坚定地锁定为仓库问题,终究处理了。
接下来就说说我修正了哪里吧。其实就仅仅是在stm32中修正了两个数值,一个是栈(stack_size)的巨细,一个是堆(heap_size)的巨细,如图1-1。
图1-1
堆和栈其实是两个不同的概念,能够这样浅显的去了解,堆是程序猿自己操作的,而栈是编译器帮你操作的。一般在操作体系中,内存是由程序猿自个进行动态分配和收回的,这部分内存便是堆。而咱们写的那些个暂时变量,一般都是编译器编译的时分主动分配的,这块内存便是栈。