STM32单片机的堆栈深入解析

学习STM32单片机的时候,总是能遇到“堆栈”这个概念 。分享本文,希望对你理解堆栈有帮助 。
对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据 。堆栈操作由PUSH、POP两条指令来完成 。而程序内存可以分为几个区:
栈区(stack)
堆区(Heap)
全局区(static)
文字常亮区程序代码区
程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数 。
栈是从高到低分配,堆是从低到高分配 。
普通单片机与STM32单片机中堆栈的区别
普通单片机启动时,不需要用bootloader将代码从ROM搬移到RAM
但是STM32单片机需要 。
这里我们可以先看看单片机程序执行的过程,单片机执行分三个步骤:
取执行
分析指令
执行指令
根据PC的值从程序存储器读出指令,送到指令寄存器 。然后分析执行执行 。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据 。
RAM取数的速度是远高于ROM的,但是普通单片机因为本身运行频率不高,所以从ROM取指令慢并不影响 。
【STM32单片机的堆栈深入解析】 而STM32的CPU运行的频率高,远大于从ROM读写的速度 。所以需要用bootloader将代码从ROM搬移到RAM 。
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小 。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大 。
其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场) 。
如果非要给他加几个特点的话那就是:
这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数 。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了 。
这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方 。
结合STM32的开发讲述堆栈
从上面的描述可以看得出来,在代码中是如何占用堆和栈的 。可能很多人还是无法理解,这里再结合STM32的开发过程中与堆栈相关的内容来进行讲述 。
如何设置STM32的堆栈大小?
在基于MDK的启动文件开始,有一段汇编代码是分配堆栈大小的 。

STM32单片机的堆栈深入解析

文章插图
这里4+6=1640,转换成16进制就是0x668,在进行在调试时,会出现:

STM32单片机的堆栈深入解析
文章插图
这个MSP就是主堆栈指针,一般我们复位之后指向的位置,复位执向的其实是栈顶:

STM32单片机的堆栈深入解析
文章插图
而MSP指向地址0x20000668是0x20000000偏移0x668而得来 。具体哪些地方占用了RAM,可以参看map文件中【Image Symbol Table】处的内容:

STM32单片机的堆栈深入解析
文章插图
责任编辑:xj

原文标题:详解STM32单片机的堆栈
文章出处:【微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处 。

    推荐阅读