嵌入式学习历程-堆栈分析(裸机篇)

发布时间:2026/10/9 5:55:39

嵌入式学习历程-堆栈分析(裸机篇) 写在前面的话博主只是一个求职中的应届毕业生工作经历尚浅如有问题还请各位大佬不吝赐教指出我的错误十分感谢‍‍‍同时图中出现的视频和截图来自youtube上的core dump首先大家先熟悉一个黑话大家平时说的“堆栈”在百分之九十九的情况下指的是栈而不是堆和栈。栈堆栈1栈有栈顶和栈底之分我们在数据结构的时候都学习过栈是先进后出由高地址向低地址增长。对于绝大部分的ARM/X86而言这句话都是对的所以我们可理解为栈底固定指的就是高地址这个起始地址待我们在函数中定义变量计算等操作的时候就会进行压栈/入栈所以栈顶就开始往低地址增长了。这也是为什么c的编译器需要我们明确类型确定类型的字节所占大小每一个栈帧才能明确其大小也就是栈顶移动的距离。出栈发生在函数调用结束的时候当前栈帧函数所用的栈空间中所有的变量都会出栈意味着生命周期结束static这类关键字修饰的变量放置于.data或者.bss中不在栈内所以不会消失这也是为什么我们说这些关键字改变了它的生命周期同时也让我们明白为什么传一个值到我们自定义的函数里面操作之后离开函数变量修改不生效因为本质上就是在新函数的栈中用一个新的变量来接收这个值操作都是对这个新变量进行操作一旦函数结束这些变量都出栈了自然没法修改想要在函数内部修改外部变量就只能用指针栈顶回退其所有的变量大小的距离就回到了一开始调用函数的地方继续执行。在函数调用结束后有两种情况有无返回值1.有返回值你就必须用一个同类型的变量来接收其返回值就相当于在函数调用的那个地方留了返回值大小的空间后续的栈都是被调用函数的内容return就是最后栈顶回退到你一开始的留的空间写上对应返回值。2.没有返回值那就不需要由变量接收不需要留这个空间直接回退整个被调用栈帧的距离接上原函数的调用处继续执行。所以为什么栈都这么快呢原因就在于它的紧凑和确定性每次函数的调用和退出都有着明确的移动距离不需要花时间去寻找位置或者释放空间直接上下sp移动即可时间复杂度为O(1)。堆堆栈的本质区别就在于此栈只能后进先出有严格的顺序可以保持紧凑无碎片而堆可任意释放任意位置数据导致碎片不可避免。每次写入都需要去寻找足够大的内存这里再加上一些算法在效率和碎片化上面做取舍时间复杂度没法预测擦除也需要去查找又是一笔开销自然速度是远远比不上栈。碎片化简单理解就是总内存空闲空间是足够的但是由于他们之间被有数据的内容隔开了没法连到一起组成一个足够大的空间来存放我的数据。如图所示总空间够但是C没地方放。这东西实际上在大部分的裸机中都是不会去使用的可能这就是为什么提到堆栈大家想到的都是栈而不是堆使用一般就是malloc申请但是对于裸机而言没有比较完善的内存管理malloc确实具备该功能但是对于mcu而言不算是太适用一般都是设计内存池进行管理那频繁使用malloc申请造成的碎片就无法管理这会导致很严重内存浪费和响应延迟。所以对于堆我们的启动文件中默认的设定都是很小的基本不会用到大容量的内存需求放在静态全局数组即可一两个标志位放在函数内部的局部静态变量也够用了尽量避免对堆的使用。栈溢出对于整个栈区而言有一个固定的大小这是一开始就设定好的空间范围所有的函数运行的栈都在其中所以说程序运行的时候栈是动态变化的随着函数调用不断变化但是有一个最大值的限定超过了就会发生栈溢出。老师和工作的师傅们或多或少都有提到过为什么我们不要在单片机这种资源受限的机器中写递归因为递归本质上就是函数一层层的自我调用就会导致栈原来越深一个不小心就超了。但是超了不代表就有事。图中是启动文件默认的栈大小对于c8t6而言有20KB的ramram中主要包含堆栈静态存储区.bss,.data,.rodata他们基本位于最低地址之后是堆而栈我们知道位于高地址而这里默认的栈才1KB他们之间很多的空间都是没有分配的属于空闲区栈溢出的到了空闲区是无感的程序没有任何问题但是如果用超到了低地址那边的数据就会发生异常了这个时候问题才会暴露。另外一种情况叫踩内存对于rtos而言由于有多个栈互相之间如果使用不当就会发生踩踏裸机只有一个这种情况一般不会发生。小结总体来看栈虽然速度远远快过于堆但是因为它严格的管理导致我们的自由度受限你不可能在不移除当前栈顶的情况下去移除其下方的数据不然就会导致栈的结构受到损害。而且栈用起来一旦过深或者静态数据区存放消息过多都会导致栈溢出对于系统而言就是毁灭性的打击基本没有补救机会。堆虽然慢但是极其灵活数据可以随意进出没有什么顺序和限制而且堆内存每次使用都是靠malloc申请内存不足的话是不会让你去用的安全性上有足够的保障。浅浅挖个坑对于rtos而言堆与栈的情况又会发生一些奇妙的变化这个会在下一个的RTOS篇中指出感谢各位看到这里本文部分插图截取自YouTube 频道 Core Dump视频中对于堆栈的分析版权归原作者所有仅用于学习交流侵删。
延伸阅读

更多相关文章

2026/10/9 5:53:36

多智能体系统与组合融合:解决大模型价值对齐的工程实践

1. 从单兵作战到团队协作:为什么大模型需要“对齐”价值观? 最近在折腾大语言模型(LLMs)的时候,我一直在琢磨一个事儿:我们费了老大劲,又是微调又是提示工程,好不容易让模型在某个任…

2026/10/8 1:56:36

Spring AI 2.0:Flux

方法作用Spring AI 常见用途map一对一转换内容脱敏、包装 SSE、格式转换filter过滤元素忽略空片段或无效事件doOnNext观察元素日志、统计输出片段doOnError观察异常记录模型或网络异常doFinally观察最终结束统计耗时、识别完成/失败/取消onErrorResume切换备用流返回友好错误、…

2026/10/8 1:57:12

OpenRouter Ori DeepSeek Harness:本地部署大模型实战指南

在探索大模型应用落地的过程中,开发者们常常面临一个核心矛盾:如何在享受云端强大模型能力的同时,又能保证数据安全、降低延迟,并实现成本可控?OpenRouter 最新推出的 Ori DeepSeek Harness 正是为解决这一痛点而生。…

2026/10/9 5:54:48

运算符重载实战:从底层原理到Python/C++核心实现与避坑指南

1. 从“为什么需要”说起:运算逻辑不该是函数的一堆剪不断理还乱的调用我第一次意识到运算符重载的价值,是在写一个三维向量库的时候。那会儿刚工作不久,心气高,觉得自己能把所有东西都用函数搞定。结果就写出来addVectors(scaleV…

2026/10/9 5:54:48

《嵌入式操作系统》_驱动开发_misc类设备与蜂鸣器_20261008

misc 类设备(杂项设备 / Miscellaneous Device)Linux 把所有无法归入标准大类、功能简单、零散小众的硬件统一收纳到 misc 框架下,共用固定主设备号 10(MISC_MAJOR),靠不同次设备号区分每个独立设备。适用场…

2026/10/9 5:49:48

WDM鼠标驱动开发实战:从源码解析到IRP数据过滤与签名安装

简介:这份资源是面向Windows底层驱动开发学习者的WDM鼠标驱动源代码包,适合已具备C/C基础、希望理解设备驱动模型与HID设备交互机制的开发者参考。压缩包共13个文件,约12KB,以4个h头文件、2个cpp实现文件为主,另有rc资…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑