设计与开发

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

小编 2024-11-24 设计与开发 23 0

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

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

堆(heap):

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

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

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

栈(stack):

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

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

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

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

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

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

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

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

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

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

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

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

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

相关问答

单片机 T0 溢出 率是什么意思?

指的是定时器一秒钟溢出多少次,它是串口通信的时间基准,不管是同步通信还是异步通信通信时定时器工作在8位模式,最大计数值是256个脉冲(如果晶振12兆,256个脉...

51 单片机 溢出 率什么意思?

指的是定时器一秒钟溢出多少次,它是串口通信的时间基准,不管是同步通信还是异步通信通信时定时器工作在8位模式,最大计数值是256个脉冲(如果晶振12兆,256个脉...

单片机 堆和栈的区别?

1.单片机堆和栈是两种数据结构,它们的区别主要是存储方式不同。2.堆是一种动态分配的存储方式,用来存储数据结构中的变量。堆内存由程序员手动申请和释放,其...

溢出 的本质是什么?3.MCS-51 单片机 中决定程序执行顺序的】...

[最佳回答]太多了,建议看书去.----2.简述标志CY与OV的意义.为什么会发生溢出?溢出的本质是什么?--51系列单片机,是八位机,每次计算操作都是针对八位数进行的...

单片机 如何利用中断进行复位?

谢谢邀请:1.题主你提出的问题好像本身就有问题,首先通过按压一个按键使单片机复位的方法,这个跟中断没有关系,每一个单片机系统都可以设计一个复位电路,这个...

单片机 定时的时间怎么改变?

所以我们只要计算出需要计数的数,用定时计数器的最大值减去该值即可。现在很多单片机有溢出自动赋初值功能,比较方便。二、向下定时计数器举例当放入155毫升...

单片机 add指令怎么用?

ADD指令可用于完成把src-byte所示的源操作数和累加器A的当前值相加。并将结果置于累加器A中。根据运算结果,若第7位有进位则置进位标志为1,否则清零;若第3位...

单片机 程序状态字psw是什么意思-ZOL问答

单片机程序状态字(ProgramStatusWord,PSW)是指单片机在执行过程中,用于存储当前程序执行状态的字节。它包含了当前指令地址、指令类型、操作数地址、取数寄...

求各位大哥举例说明 单片机 中的OV的用法! 单片机 书上说用0V=1表示错误,怎么理解?

OV主要用于有符号数的运算,平时很少用。对有符号数来说,8位二进制数的最高位D7为符号位,当两个有符号数相加时,数的最高位这时应该是D6,也就是说按道理来讲...

空语句在什么状况下影响程序运行,什么状况下不影响程序运行?...

看门狗需要单片机定期给一个信号,一般称为喂狗,单片机程序在正常运行时定期给看门狗一个信号,这是由软件设计的。这样在看门狗溢出之前就有一次喂狗,看门狗就不...

猜你喜欢