分享好友 资讯频道首页 频道列表

详解STM32单片机的堆栈内容具体是什么

更新时间: 2025-10-08 09:10  发布时间: 2天前  3290

学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据:嵌入式开发中更接近底层的汇编与C 语言。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区:

●   栈区(stack)

●   堆区(Heap)

●   全局区(static)

1   文字常亮区程序代码区

程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。

栈是从高到低分配,堆是从低到高分配。

2   普通单片机与STM32单片机中堆栈的区别

普通单片机启动时,不需要用bootloader将代码从ROM搬移到RAM。

但是STM32单片机需要。

这里我们可以先看看单片机程序执行的过程,单片机执行分三个步骤:

取指令

分析指令

执行指令

根据PC的值从程序存储器读出指令,送到指令寄存器。然后分析执行执行。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据。

RAM取数的速度是远高于ROM的,但是普通单片机因为本身运行频率不高,所以从ROM取指令慢并不影响。

而STM32的CPU运行的频率高,远大于从ROM读写的速度。所以需要用bootloader 将代码从ROM 搬移到RAM。

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

如果非要给他加几个特点的话那就是:这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。

这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。

3   结合STM32 的开发讲述堆栈

从上面的描述可以看得出来,在代码中是如何占用堆和栈的。可能很多人还是无法理解,这里再结合STM32的开发过程中与堆栈相关的内容来进行讲述。

如何设置STM32的堆栈大小?

在基于MDK的启动文件开始,有一段汇编代码是分配堆栈大小的。

这里重点知道堆栈数值大小就行。还有一段AREA(区域),表示分配一段堆栈数据段。数值大小可以自己修改,也可以使用STM32CubeMX数值大小配置,如下图所示。

STM32F1默认设置值0×400,也就是1K大小。

StackSize EQU 0×400

函数体内局部变量:

void Fun(void){ char i; int Tmp[256]; //...}

局部变量总共占用了256*4 +1字节的栈空间。所以,在函数内有较多局部变量时,就需要注意是否超过我们配置的堆栈大小。

函数参数:

void HALGPIOInit(GPIOTypeDef *GPIOx, GPIOInitTypeDef *GPIOInit)

这里要强调一点:传递指针只占4 字节,如果传递的是结构体,就会占用结构大小空间。提示:在函数嵌套,递归时,系统仍会占用栈空间。

堆(Heap)的默认设置0×200(512)字节。

HeapSize EQU 0×200

大部分人应该很少使用malloc 来分配堆空间。虽然堆上的数据只要程序员不释放空间就可以一直访问,但是,如果忘记了释放堆内存,那么将会造成内存泄漏,甚至致命的潜在错误。

4   MDK 中RAM占用大小分析

经常在线调试的人,可能会分析一些底层的内容。这里结合MDKARM来分析一下RAM占用大小的问题。在MDK编译之后,会有一段RAM大小信息:

这里4+6=1640,转换成16进制就是0×668,在进行在调试时,会出现:

这个MSP就是主堆栈指针,一般我们复位之后指向的位置,复位指向的其实是栈顶:

而MSP指向地址0×20000668是0×20000000偏移0×668而得来。具体哪些地方占用了RAM,可以参看map文件中【Image Symbol Table】处的内容:



 

---延伸阅读:
  • 婚期临近,女方突然悔婚!男方:家具酒店全订好了,亲戚都通知了,退彩礼还要扣3万“拥抱费”;媒人回应具体真相是什么
  • 两中国游客马来西亚失联,手机定位显示在海域,警方持续搜救网友怎么看
  • 马斯克旗下的xAI有望融资200亿美元 英伟达是股权投资者之一内容具体是什么
  • 农业银行获中国平安人寿保险增持3963.4万股 每股作价约5.23港元网友怎么看
  •  拔打报修电话
    反对 0
    举报 0
    收藏 0
    打赏 0
    评论 0
    生态环境部核与辐射安全中心非能动系统可靠性评价技术研究项目废标公告今+日+资+讯
    公告概要:公告信息:采购项目名称生态环境部核与辐射安全中心非能动系统可靠性评价技术研究项目品目服务/科学研究和试验开发/其他研究和试验开发服务,货物/无形资产/信息数据类无形资产/计算机软件/基础软件采购单位生态环境部核与辐射安全中心行政区域北京市公告时间2025年07月16日10:21

    0评论2025-10-08102

    龙陵县消防救援大队2025年度食堂食品物资配送项目中标(成交)结果公告具体怎么回事
    公告概要:公告信息:采购项目名称龙陵县消防救援大队2025年度食堂食品物资配送项目品目服务/商务服务/零售服务/食品和饮料专门零售服务采购单位龙陵县消防救援大队行政区域龙陵县公告时间2025年07月16日10:23评审专家名单杨宏俊(磋商小组组长)、唐迎春、陈德荣(采购人代表)。总中标金额¥49.075000 万元(人民币)

    0评论2025-10-08231

    科振达指纹锁常见故障及维修知识全国2025排名一览
    科振达指纹锁24小时服务电话-统一客服电话科振达指纹锁售后服务电话号码 4oo-966-8255友情提醒:售后服务维修单子多;线路有时候很忙;请多打几次;希望大家体谅每次维修时,客户服务中心负责人将核对及保修证上的产品型号和序号是否与商品实物相符。您在购买时,经销商给您捆绑销售的

    0评论2025-10-080

    中国民用航空飞行学院2台C172S飞行训练器采购项目(第二次)公开招标公告具体怎么回事
    公告概要:公告信息:采购项目名称中国民用航空飞行学院2台C172S飞行训练器采购项目品目货物/设备/航空航天工业设备/地面飞行训练器采购单位中国民用航空飞行学院行政区域涪城区公告时间2025年07月16日10:25获取招标文件时间2025年07月17日至2025年07月23日每日上午:9:00 至 12:00下午:14:00 至 17:00(北京时间,法定节假日除外)招标文件售价¥500获取招标文件的地点在中

    0评论2025-10-08132