产品选型

单片机堆栈溢出 深入理解单片机内存 什么是堆?栈是什么?

小编 2025-07-01 产品选型 23 0

深入理解单片机内存 什么是堆?栈是什么?

堆栈这两个词我们经常会遇到,面试官也特别喜欢问这个问题,堆栈是什么呢,今天我们来学习下单片机内存的相关知识。

堆(heap):

堆是用于存放程序运行过程中需要动态分配的内存段,它的大小并不是一定的,而是伸缩可变的,随着应用程序的需要而扩张或缩小。

当我们在代码里使用malloc等函数分配内存时,新分配的内存就被动态添加到堆上,这个时候堆会扩张。

当我们使用完毕,用free等函数释放内存时,被释放的内存从堆中被剔除(堆会缩减)。

栈(stack):

栈,又常称为堆栈,用来存放函数中定义的局部变量。

栈有一个特性,就是FIFO,就是先进先出的特点。这样的特点非常方便用来保存函数调用的上下文(这里建议大家学一点汇编),函数调用的时候,系统会将当前函数的各个寄存器R0-R11保存起来,然后加载调用函数的栈,待函数返回后,再将这个堆栈恢复出来。

这个时候你就可以理解,为什么有时候递归调用的时候容易堆栈溢出,因为函数一直没有返回,系统就会一直向堆栈里保存当前函数的上下文,超出了堆栈的大小,就会产生内存溢出的故障。

现在我们来做一个面试题:

1、单片机的静态变量存放在哪里?全局变量存放在哪里?局部变量又是存放在哪里?

小伙伴们,秀出你的答案吧,别忘了关注哦,下节我们讲bss、data、text段 的涵义

我在学单片机时在堆栈遇到的问题

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

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

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

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

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

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

相关问答

什么是 堆栈 ?堆栈指针的SP的作用是什么?8051 单片机堆栈 容量不超过多少字节?

堆栈:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和...

堆栈 的存取规则?

在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结...

51 单片机 堆栈 指针sp始终是指向?

我学的是单片机。在堆栈里,sp加一,然后入栈;出栈,然后sp减一。所以新开的和销毁的内存都是当前sp指向的。我没学过编程思想,硬来答,或许不好,但是我坚信单...

堆栈 是什么概念?

在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在...

关于 单片机堆栈 指针sp变化的问题1.如果(DPTR)=507BH,(SP)=32...

[最佳回答]为什么不是(SP)=4FH?应该是4FH.问题二:那50H岂不是没利用到?50H是不用的.复位后,SP=07H.但是,07H就从来不用于堆栈.第一次压栈,是压入了08H单元...

8051 单片机堆栈 设置在什么地方,如何实现?

8051单片机的堆栈是位于内部RAM的特定区域,通常是从地址0x07到0x1F。堆栈的设置是通过使用堆栈指针(SP)寄存器来实现的。SP寄存器存储了当前堆栈的顶部地址。...

执行中断返回指令后,从 堆栈 区弹出的地址送给什么寄存器?

以51系列单片机为例,RETI中断返回:从堆栈栈顶弹出的两个字节内容(即断点地址)送至程序指针寄存器PC以51系列单片机为例,RETI中断返回:从堆栈栈顶弹出的两...

pic16 单片机堆栈 到底在rom还是ram中?

PIC16单片机的堆栈存储在RAM(随机存取存储器)中。程序执行时,调用的每个子程序的返回地址以及局部变量和其他重要数据都被存储在堆栈中。堆栈的存储位置位于R...

51 单片机 汇编 堆栈 指针sp的活动范围一般是ram的哪个区域?问题...

[最佳回答]举个例子:SP的初始化值是07H,SP从08H开始增加.当程序需要压栈操作时,就将程序的PC值压入堆栈,注意PC是两个字节的指令.先压入低字节,在压入高字节;...

51 单片机 的sp寄存器多少位?

151单片机的sp寄存器是8位的。251单片机是一种8位的微控制器,其寄存器的位数也是8位。SP寄存器是栈指针寄存器,用于指向栈的顶部位置,其位数也是8位。38位...

猜你喜欢