Stm32的寄存器和堆栈

1 ARM架构下的寄存器

ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。这些寄存器并不是都能被同时访问,这取决于处理器处于哪种工作状态和运行模式。但在任何情况下通用寄存器R0~R14、程序计数器PC(R15)和一个程序状态寄存器CPSR都是可以被访问的。

1.1 通用寄存器包括以下3类:

(1)未分组寄存器R0~R7

       在所有运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊用途。

(2)分组寄存器R8~R14

       不同运行模式下访问的物理寄存器不相同。

对于R8~R12,每个寄存器对应2个不同的物理寄存器,快速中断模式(FIQ)访问的是R8_fiq~R12_fiq,除此以外的其他模式访问的是R8_usr~R12_usr。

对于R13和R14,每个寄存器对应6个不同的物理寄存器,用户模式与系统模式公用R13_usr和R14_usr,另外 5种不同的运行模式各对应不同的物理寄存器,采用以下记号来区分: _fiq,_irq,_svc,_abt,_und.

其中R13常用作堆栈指针。

       R14为子程序链接寄存器LR,当执行子程序调用指令BL或BLX时,R14可得到R15(程序计数器PC)的备份,当子程序返回时,R14的值重新送给R15。

(3)程序计数器PC(R15).

对于ARM指令集,PC总是指向当前指令的下两条指令的地址。

(4)当前程序状态寄存器CPSR(R16),可在任何模式下被访问,包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制及状态位。

除用户模式和系统模式外,每一种模式又有一个专用的物理状态寄存器SPSR,SPSR用于保存当异常发生时的CPSR的值,从异常退出时,则可由SPSR来恢复CPSR。

2 栈(stack)

2.1 Top of stack :栈顶指针,允许插入和删除操作的那一端称为栈顶top。栈是先入后出的数据结构,栈底的指针是不变的,随着入栈和出栈的操作,栈顶的指针是可变的。在stm32中,栈的地址是从大到小生长,即栈底为大地址栈顶为小地址。

栈由编译器或操作系统自动分配和释放。

2.2 栈在程序运行中的作用:

栈存储的内容包括程序运行中的局部变量、函数参数和返回地址、中断发生时的主程序相关现场,以及程序运行中的其他临时变量。

栈是构建操作系统的多任务模式的基础。每个任务都有自己独立的栈空间。

2.3 栈帧

       当函数不断调用的时候,不断的有参数和局部变量等临时变量入栈,栈里面会形成一个函数栈帧的结构,一个栈帧的结构归属于一次函数调用。分析问题的时候可以利用栈帧的框架,找到相应的栈帧,对当时的数据结构进行分析。

3. 堆(heap)

一般由程序员使用malloc或者new来进行申请和分配,使用完后由delete或者free语句来释放,如果忘记释放则由程序结束时操作系统进行回收,但这可能会导致内存泄漏,因此记得用完后释放是非常重要的。

与栈相反,stm32的堆区是向上生长的。

堆区和栈区的大小都是在stm32的启动流程(boot)中进行初始化的 。编写程序的时候要注意栈区的溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值