Cortex-M与Cortex-A处理器运行模式与寄存器组对比

目录

一、运行模式对比

1、Cortex-M运行模式

2、Cortex-A运行模式

二、寄存器组

1、Cortex-M寄存器组

2、Cortex-A寄存器组


一、运行模式对比

1、Cortex-M运行模式

STM32只有两种运行模式,hander模式线程模式。根据操作权限的不同,又分为特权级用户级。为了提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作,处理器支持两种特权级(特权级hander模式、特权级线程模式)

不同级别和操作模式下的转换:

2、Cortex-A运行模式

Cortex-A就有9种运行模式

除了 User(USR)用户模式以外,其它 8种运行模式都是特权模式。这几个运行模式可以通过软件进行任意切换,也可以通过中断或者异常来进行切换。受限的资源就必须进行模式切换。但是用户模式是不能直接进行切换的,用户模式下需要借助异常来完成模式切换,当要切换模式的时候,应用程序可以产生异常,在异常的处理过程中完成处理器模式切换

二、寄存器组

1、Cortex-M寄存器组

R0-R12:通用寄存器,都是32 位通用寄存器,用于数据操作。但是注意:绝大多数16 位Thumb 指令只能访问R0‐R7,而32 位Thumb‐2 指令可以访问所有寄存器

R13:两个堆栈指针,因此任一时刻只能使用其中的一个

  • 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
  • 进程堆栈指针(PSP):由用户的应用程序代码使用。

R14:连接寄存器,当呼叫一个子程序时,由R14 存储返回地址

R15:程序计数寄存器,指向当前的程序地址。如果修改它的值,就能改变程序的执行流

特殊功能寄存器:Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括程序状态字寄存器组(PSRs)、中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)、控制寄存器(CONTROL)

2、Cortex-A寄存器组

Cortex-A架构提供了16个32位的通用寄存器 (R0~R15)供软件使用,前 15个 (R0~R14)可以用作通用的数据存储, R15是程序计数器 PC,用来保存将要执行的指令。 ARM还提供了一个当前程序状态寄存器 CPSR和一个备份程序状态寄存器 SPSR,SPSR寄存器就是 CPSR寄存器的备份。

Cortex-A7 有9 种运行模式,每一种运行模式都有一组与之对应的寄存器组。每一种模式可见的寄存器包括15 个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器PC。在这些寄存器中,有些是所有模式所共用的同一个物理寄存器,有一些是各模式自己所独立拥有的。浅色字体的是与User 模式所共有的寄存器,蓝绿色背景的是各个模式所独有的寄存器。

R0-R7:未备份寄存器,所有的处理器模式下这 8个寄存器都是同一个物理寄存器,在不同的模式下,这8个寄存器中的数据就会被破坏。所以没有特殊用途

R8-R12:备份寄存器,在快速中断模式下 (FIQ)它们对应着 Rx_irq(x=8~12)物理寄存器,其他模式下对应着 Rx(8~12)物理寄存器。

R13:栈指针,一共有 8个物理寄存器,其中一个是用户模式 (User)和系统模式 (Sys)共用的,剩下的 7个分别对应 7种不同的模式。

R14:连接寄存器,当呼叫一个子程序时,由R14 存储返回地址。一共有 7个物理寄存器,其中一个是用户模式 (User)、系统模式 (Sys)和超级监视模式 (Hyp)所共有的,剩下的 6个分别对应 6种不同的模式。

R15:程序计数寄存器,指向当前的程序地址。如果修改它的值,就能改变程序的执行流

CPSR:当前程序状态寄存器。该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位

总结一下, Cortex-A内核寄存器组成如下:

①、 34个通用寄存器,包括 R15程序计数器 (PC),这些寄存器都是 32位的。

②、 8个状态寄存器,包括 CPSR和 SPSR。

③、 Hyp模式下独有一个 ELR_Hyp寄存器。

参考资料:

《Cortex M3权威指南(中文)》

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3》

猜你喜欢

转载自blog.csdn.net/m0_37845735/article/details/105546731