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

发布者:chaohuangmeitao最新更新时间:2022-05-17 来源: eefocus关键字:STM32  位置 手机看文章 扫描二维码
随时随地手机看文章

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


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

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

从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来查看它的值:

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


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

关键字:STM32  位置 引用地址:玩转STM32(15)确定栈的位置和大小

上一篇:玩转STM32(14)运行第一行代码
下一篇:玩转STM32(10)CPU的脉搏

推荐阅读最新更新时间:2024-11-11 16:14

005_STM32程序移植之_RC522读卡模块
1. 测试环境:STM32C8T6 2. 测试模块:RC522读卡模块 3. 测试接口: RC522读卡模块: VCC------------------3.3V GND------------------GND SDA-----------------PA4 SCK-----------------PA5 MOSI-----------------PA7 MISO-----------------PA6 RQ-----------------悬空 RST-----------------VCC3.3 2. 串口使用串口一,波特率9600 单片机引脚------------CH340引脚 VCC------------------
[单片机]
005_STM32程序移植之_RC522读卡模块
STM32复习笔记(十五)红外遥控
一、红外遥控器介绍: 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。 红外遥控的编码目前广泛使用的是:NEC Protocol 的PWM(脉冲宽度调制)和Philips RC-5 Protocol 的PPM(脉冲位置调制)。 二、红外遥控器和红外接收头外形: 接收头: OUT , GDN, 3.3V 三、NEC协议特征: ①8位地址和8位指令长度; ② 地址和命令2次传输(确保可靠性)
[单片机]
<font color='red'>STM32</font>复习笔记(十五)红外遥控
如何为STM32编程节省代码空间?在IAR中配置CRC参数有窍门
前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间。CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在IEC60335中,也接受通过CRC校验对FLASH的完整性进行检查。在对FLASH完整性检查的应用中,需要事先计算出整个FLASH的CRC校验值(不包括最后保存CRC值的字节),放在FLASH的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个FLASH的CRC校验值,然后与保存在FLASH末尾的CRC值进行比较。 EWARM从v5.5版本之后开始支持STM32芯片的CRC计算。前面所说的计算整个FLASH的CRC校验值并保存在FLASH末
[单片机]
如何为<font color='red'>STM32</font>编程节省代码空间?在IAR中配置CRC参数有窍门
STM32开发笔记28: 中断请求的移植与处理
单片机型号:STM32L053R8T6 本文介绍如何移植STM32的IRQ(中断请求)到自己的系统中,我们以USART1接收中断为例。 先看启动文件(汇编语言),如下列程序所示,列出了其向量区,USART1的中断向量已用红色标识,当和USART1相关的中断发生时,程序指针(PC)在保护现场后,直接指向到该向量。 __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler
[单片机]
STM32之寄存器开发
首先克服心理作用,不要总是默认寄存器开发难,其实寄存器开发和库函数开发所用的方法和难度是一样的, 并不难,下面用以stm32为例解释。 : 1.明确自己需要的功能(库函数开发也需要) 2.查看手册,找到功能对应的单片机资源 3.找到功能所需寄存器(库函数开发需要找到相应的功能函数) 4.根据地址每位对应的功能赋值(库函数开发需要找到相应的入口函数) 5.调试结束。 而且寄存器开发不难但是麻烦,有很多没接触过的名词(有可能是一些英文缩写),所以需要耐心,慢慢品味。如果这些名词弄清楚了,寄存器开发反而会比库函数开发简单、方便。 注:名词或需要整理的步骤太多可以手动记一下,既有利于理清思路,也方便回看时
[单片机]
牛人对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 /* Preemption Priority Group -------------------------------------------------*/ #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
[单片机]
STM32时钟树详解
对STM32的时钟树,可以从两个方面来思考 下面是STM32的时钟树 时钟源包括哪些: 1)高速内部时钟(HSI):HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。 HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差 。 2)高速外部时钟(HSE):以外部晶振作为时钟源,频率范围为4~16M,一般采用8MHZ晶振 3)低速内部时钟(LSI): LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。 LSI时钟频率大约
[单片机]
<font color='red'>STM32</font>时钟树详解
Abb工业机器人的主电源开关在什么位置
了解ABB工业机器人的主电源开关位置对于确保机器人的安全运行和维护至关重要。在这篇文章中,我们将详细介绍ABB工业机器人的主电源开关位置、操作步骤和注意事项,以帮助用户更好地了解和使用这些机器人。 1. ABB工业机器人概述 ABB是全球领先的工业机器人制造商之一,其产品广泛应用于汽车、电子、食品和饮料、金属加工等行业。ABB工业机器人以其高性能、高可靠性和易于编程而受到用户的青睐。 2. ABB工业机器人的电源系统 在了解主电源开关的位置之前,我们需要先了解ABB工业机器人的电源系统。ABB工业机器人的电源系统通常包括: 主电源 :为机器人提供主要的电力供应。 控制电源 :为机器人的控制系统提供电力。 辅助电源 :为机
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved