玩转STM32(15)确定栈的位置和大小

栏目: 编程语言 · 发布时间: 4年前

前面学习了怎么样确定CPU加载运行第一行代码,在那里发现需要加载栈指针,那么你也许会问为什么要首先加载栈指针呢?难道栈就是这么重要?在这里,我们就来探讨一下栈的问题,比如栈的位置和大小。

在现代的CPU技术里,往往有中断系统,这就决定了CPU必须有栈的结构,因为中断出现时,需要把当时CPU运行的数据进行保存,以便中断处理之后再恢复回来。如下图这样处理:

玩转STM32(15)确定栈的位置和大小

如果没有栈,就没有办法保存当前的数据,必然被中断程序里运行的代码把当前的数据修改了,这样就没有办法恢复到原始状态了。从上图可以看到中断调用时,有中断栈,因此在CPU运行之后,时刻有可能被中断,这样需要栈来保存相应的数据。另外,我们来看一下 C语言 的运行,当一个函数被调用时,它是这样处理的:

玩转STM32(15)确定栈的位置和大小

从C语言运行过程来看,也需要调用栈来保存传递的参数、以及函数里的临时变量和局部变量,这样才可以运行C编译器编译的代码。基于上面两个原因,必须设置好栈的位置和大小才可以运行,所以第一行代码里,就设置了栈顶位置。

在前面也知道设置栈顶的变量为__initial_sp,但是这个栈顶元素是怎么样确定它的位置和大小的呢?现在就来解开这个谜题。我们可以看到汇编文件里有这么一段开头的代码:

Stack_Size      EQU     0x00000400

AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp

这段代码放置在汇编文件最开始位置,同时通过AREA来描述这段代码功能。再来仔细地学习一下汇编指令AREA,它的功能是这样:

AREA指令指示汇编程序汇编新的代码节或数据节。节是不可分的已命名独立代码或数据块,它们由链接器处理。

从AREA后面的STACK参数,说明这段是栈段,NOINIT参数是表示不用进行初始化,READWRITE参数是表示这段需要进行读写的操作,ALIGN是表示按2的3次方来对齐,也就是按8字节的方式对齐。接着下来使用SPACE指令来分配一段连续的内存空间,大小是等于Stack_Size,而Stack_Size是由前面的代码指定为0x00000400。到这里就明白了栈的位置和大小,如果调用栈的层次太多,栈不够用时,就可以修改这里,把栈大小的变量Stack_Size改大,如果一个程序里没有函数调用,或者嵌套中断,就可以减小栈的大小,这样可以留出更多的内存空间来使用。

接着下来查看读写段放在内存什么位置,可以通过连接描述文件project.sct来查看,可以看到下面这行:

RW_IRAM1 0x20000000 0x00020000  {  ; RW data

.ANY (+RW +ZI)

}

上面定义内存的开始位置为0x20000000,因此这段栈安排的位置,就是内存的开始位置,再加上栈的大小,就是栈顶元素了,可以通过文件project.map来查看它的值:

玩转STM32(15)确定栈的位置和大小

在这里可以看到它的值为0x20000400,这个就是栈顶的值。通过上面的学习,就可以理解栈的设置,以及为什么需要设置栈,以及栈设置的代码为什么要这样写。

https://blog.csdn.net/caimouse/article/details/51749579

玩转STM32(15)确定栈的位置和大小


以上所述就是小编给大家介绍的《玩转STM32(15)确定栈的位置和大小》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

流畅的Python

流畅的Python

[巴西] Luciano Ramalho / 安道、吴珂 / 人民邮电出版社 / 2017-5-15 / 139元

【技术大咖推荐】 “很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级Python程序员掌握这门语言,我也从中学到了相当多的知识!”——Alex Martelli,Python软件基金会成员 “对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏。”——Daniel Greenfeld和Audrey Roy Greenfeld,Two Scoops ......一起来看看 《流畅的Python》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具