历史上的今天
今天是:2024年09月29日(星期日)
2021年09月29日 | ARM的7种工作模式、37个通用寄存器、CPSR程序状态寄存器
2021-09-29 来源:eefocus
一、ARM 采用的是32位架构
1、ARM约定
Byte:8 bits
Halfword:16 bits (2 byte)
Word:32 bits (4 byte)
2、大部分ARM core 提供
ARM 指令集(32-bit) 每条指令都是4个字节?
Thumb 指令集(16-bit )
Thumb2指令集(16 & 32bit)
二、ARM的7种基本工作模式
普通模式(Normal)
(1)User:非特权模式,大部分任务执行在这种模式
特权模式(Privilege)
(2)FIQ:当一个高优先级(fast) 中断产生时将会进入这种模式
(3)IRQ:当一个低优先级(normal) 中断产生时将会进入这种模式
(4)Supervisor:当复位或软中断指令执行时将会进入这种模式(SVC模式)
(5)Abort:当存取异常时将会进入这种模式
(6)Undef:当执行未定义指令时会进入这种模式
(7)System:使用和User模式相同寄存器集的特权模式。
各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器),也可以是CPU在某些情况下自动切换。
各种模式下权限和可以访问的寄存器不同。
同一时刻只处于其中一种模式。
操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。
不同模式下,对资源的访问权限不一样。
三、37个通用寄存器
1、寄存器分类和区别
(1)SoC中有2类寄存器:通用寄存器和SFR
通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。
SFR(special function register,特殊功能寄存器)属于外设硬件的组成部分,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。
(2)通用寄存器没有地址,通过寄存器名字来访问;而特殊功能寄存器有地址。
(3)寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。
2、37个通用寄存器
(1)ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,其他寄存器虽然名字相同但是在当前模式不可见。
对r13这个名字来说,在ARM中共有6个名叫r13(又叫sp,栈指针)的寄存器,但是在每种特定处理器模式下,只有一个r13是当前可见的,其他的r13必须切换到他的对应模式下才能看到。这种设计叫影子寄存器(banked register)。
(2)ARM共有37个寄存器,都是32位长度。
30个为“通用”型;
1个固定用作PC(Program control register,程序控制寄存器,PC指向哪里,CPU就会执行哪条指令,因此只有一个);
1个固定用作CPSR(程序状态寄存器,用来记录当前cpu的状态,因此只有一个);
5个固定用作5种异常模式下的SPSR(Saved Program Status Register,程序状态保存寄存器,用来保存CPSR的,返回时将spsr赋给cpsr)。
(3) lr用来存储返回地址。
(4)第二幅图中带颜色的,表示每种模式下特有的寄存器。
四、CPSR程序状态寄存器


(1)CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关)。
(2)CPSR中的I、F位和开中断、关中断有关。
(3)CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。
上一篇:详细解读ARM寄存器之CPSR
下一篇:s3c2440——swi异常
史海拾趣
|
之前编译uboot通过了才发现是交叉编译器出现问题还好算是过去,开始引导内核了。看了一下uboot的代码没有关于nand flash分区的信息,不知道该把内核映像下载到哪里。想问一下 uboot是不是没有分区信息吗,我用的是1.2.0的上面没有mtdparts的命令不 ...… 查看全部问答> |
|
最近做了一个抢答器的设计,但中间有些问题弄不明白啊!知道咱们论坛里的高手多,特此来请教! 4511 后面需要连接一个七段显示器,这两个之间应该需要一个电阻的吧?需要一个多大的电阻呢? 4511连接的七段显示器能够显示0~9 ,但我只需要1~8 , ...… 查看全部问答> |
|
# include # define BYTE unsigned char # define WORD unsigned int BYTE idata txdata[7]={\"ABCDEF\"}; sbit P15=P1^5 ;//蜂鸣器 void main() { BYTE h; WORD k; P15 = 0x00;// ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 说说被忽略的Shader接下来我们回到Shader。Shader是GPU里负责计算的主要部分,同时占得面积最大,耗电也最多。当今的桌面GPU往往都不再谈三角形生成率,或是像素填充率了,给的指标都是Shader ...… 查看全部问答> |
|
串口是基本的通讯端口,基本上每个嵌入式处理都自带了至少一个串口了,R7F0C802x当然也不例外。本来以为R7F0C802x的串口是挺简单的东西,看来是太轻敌了,前前后后共花了一周的时间才把它搞定。下面就来总结一下R7F0C802 ...… 查看全部问答> |
|
今天单位返修了几个设备,全部是LM2596烧毁 这个烧毁的最厉害 这个好一些 这个倒是没有烧,直接掉了一个腿 大家一块分析一下烧毁的原因,看芯片的标识是国半的,采购的价格是7块多,也像是真的。TI官网上的资料写的正常工作电压是40V ...… 查看全部问答> |
|
本帖最后由 abofly 于 2015-11-2 19:57 编辑 上一篇的工程未开启FPU,μCOS为最新最新版本,但是后期开启FPU一直出现问题,后改用3.3版本官方例程的FPU入栈方案不符合入栈顺序且造成易造成堆栈空间浪费, 本工程采用了安富莱V5开发板F4的入栈方 ...… 查看全部问答> |






