三:堆栈是什么
简单来说,堆栈是芯片 RAM 中一块遵循 “先进后出(FILO)” 规则的内存区域,专门用来临时存放程序运行过程中需要 “暂存” 的数据 —— 没有它,函数调用、中断响应这些核心操作都没法正常执行。
一、生活例子理解堆栈的 “先进后出”
可以把堆栈想象成一个竖直的笔筒:往里面放笔 = 压栈(PUSH):新笔放在最上面,原来的笔被压在下面;从里面拿笔 = 出栈(POP):只能先拿最上面的那支,不能直接拿下面的;笔筒的容量有限 = 堆栈大小有限,放太多笔会 “溢出”(栈溢出)。
二、嵌入式里堆栈的 4 件核心事件
1. 函数调用的 “上下文保存”(最核心)
在主函数里调用子函数(比如 LED_On ())时,CPU 需要记住子函数执行完后回到主函数的哪个位置继续运行(返回地址),以及调用前 CPU 寄存器里的数值(比如 R0-R3),避免子函数修改后丢失。这些数据会被自动压栈,子函数执行完后再自动出栈恢复,保证程序能 “回到原位” 继续跑。

2. 存放局部变量
程序中定义的局部变量(比如函数内的 int b = 2;),默认都存在堆栈里 —— 函数执行完,这些变量会随着出栈被自动释放,不用手动管理内存。
3. 中断响应的 “现场保护”
当 STM32 触发中断(比如串口接收、定时器中断),硬件会自动把当前 CPU 的状态(PC 寄存器、PSR 状态寄存器、通用寄存器)压栈,中断处理完后再出栈恢复,保证中断返回后程序能正常继续。
4. 传递函数参数
如果函数参数较少(ARM 架构下前 4 个参数用寄存器传递),超出的参数会通过堆栈传递;部分编译器也会把所有参数暂存到堆栈中。
三、STM32 里的堆栈实操要点
堆栈的生长方向
STM32(Cortex-M 内核)默认是 “满递减栈”—— 栈顶(SP 指向的位置)往低地址方向生长,压栈时 SP 值减小,出栈时 SP 值增大。
堆栈大小要配置
在 STM32 的启动文件(.s 文件)里,需要指定堆栈的大小(比如 Stack_Size EQU 0x400,即 1KB),太小会导致栈溢出。

栈溢出是高频 BUG
如果函数嵌套太深(比如递归调用)、局部变量太大(比如定义 char buf [2048];),堆栈会超出预设范围,导致程序崩溃、死机。
总结
堆栈是 RAM 中先进后出的临时内存区,核心作用是 “暂存” 程序运行的临时数据;没有堆栈,函数调用、中断响应无法正常执行(没法保存 / 恢复上下文);STM32 开发中要注意配置合理的堆栈大小,避免栈溢出导致程序崩溃。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)