ARM的约定
byte 8bits
halfword 16bits
word 32bits
ARM Core 提供的指令集
ARM指令集 32bits
Thumb 指令集 16bits
Thumb2 指令集 16&32bits
ARM CPU的七种工作模式
符号 | 解释 |
---|
User | 用户模式,大部分任务执行在这种模式 |
FIQ | 快速中断模式,当一个更高优先级中断产生时,会进入这种模式 |
IRQ | 中断模式,当一个低优先级终端产生时,会进入这种模式 |
Supervisor | 复位或软中断指令执行时会进入这种模式 |
Abort | 存取异常,当存取异常时会进入这种模式 |
Undef | 未定义指令,当执行未定义指令时会进入这种模式 |
System | 系统模式,使用和User模式相同的寄存器集的特权模式 |
除User模式是normal(普通模式)外,其他6种都是Privilege(特权模式),特权模式中,除Sys模式外,其余5种都是异常模式。
各种模式之间的切换,可以是程序员通过代码手动切换(写CPSR寄存器),也可以是CPU在某些情况下自动切换。
各种模式下可以访问的CPU寄存器不同
ARM CPU的37个寄存器
CPU在不同的模式下可以反问的CPU寄存器不同,上图中黑色部分是user模式可以访问的寄存器,FIQ中的黑色部分表示和User模式下的一样,及FIQ模式下访问的r0和User模式下的r0是同一个寄存器,而灰色的r8是FIQ模式特有的自己的寄存器。同理,IRQ下的r13,r14同样也是自己模式下的私有寄存器,只有在自己的模式下才能访问。
ARM共有37个寄存器,都是32位长度。
37个寄存器中30个为通用型,1个固定用作PC,一个固定用做CPSR,五个固定用做5种异常模式下的SPSR。
CPSR寄存器用以表明CPU的某些状态信息。各位意义如下图
SPSR寄存器用于,保存进入异常模式时保存CPSR中的数据,当从异常模式返回用户模式时,用以恢复CPSR中的数据。
r15寄存器也叫pc (program control)寄存器,是程序指针,pc指向哪里,CPU就会执行pc指向地址的指令。
ARM异常处理
所有正常工作之外的流程叫做异常。中断也是异常的一种。
当异常发生时,CPU会自动跳转到固定的地址运行,这个固定的地址就是终端向量表,中断向量表中存储所有异常的应跳转到的程序地址。异常向量表是硬件向软件提供的处理异常的支持。
ARM异常处理流程:当异常产生式,首先拷贝CPSR到 SPSR_,
然后设置适当的CPSR位,改变处理器工作模式,进入ARM态,进行异常处理,保存返回地址LR_设置PC为相应的异常向量。
当异常返回时,从SPSR_恢复CPSR,从LR_恢复PC
这些操作只能在ARM态进行。
关键字:ARM裸机 工作模式 寄存器
引用地址:
朱老师ARM裸机学习笔记(五):ARMCPU工作模式以及寄存器
推荐阅读最新更新时间:2024-03-16 15:35
单片机寄存器组注意重复使用原数据可能被覆盖危险
大家都知道51单片机有的寄存器R0-R7共有四组。很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也会造成很严重的后果。 首先介绍一下51的寄存器组: 通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的数据不被中断里的语句破坏,很方便。 RS1 RS0 字节地址 0 0 0组寄存器 00H~07H 0 1 1组寄存器 08H~0FH 1 0 2组寄存器 10H~17H 1 1 3组寄存器 18H~1FH RS1=PSW.4 RS0=PSW.3
[单片机]
基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系
1 想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。 刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接。linux上的驱动程序,是基于操作系统之上的,他并不直接和底层的硬件打交道,但是我们写的驱动必须能使硬件“跑”起来,即与硬件紧密相连。 就拿最简单的LED驱动来说,我们的驱动程序是在虚拟的内存上面跑的,但是最终,LED的点亮还是必须靠GPIO管脚的高低电平来控制。那么,我们的虚拟的内存怎么才能和实际的硬件上面的寄存器对应起来呢? 这篇要写的就是ioremap这个映射函数,他可以将我们硬件上面的寄存器,映射为虚拟的内存,从而使驱动程序在我们的虚拟的内存中运行。 #incl
[单片机]
S3C44B0的初始化程序的理解
S3C44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。不过S3C44B0不支持地址映射,所以程序不COPY到RAM种执行。S3C44B0初始化对我们广大初学者来说,比较难理解的是中断的处理和一些少见的操作符号,S3C44B0的中断子程序地址存放在初始化程序最后就是 HandleADC # 4 HandleRTC # 4 HandleUTXD1 # 4 HandleUTXD0 # 4 HandleSIO # 4 HandleIIC # 4 HandleURXD1 # 4 HandleURXD0 # 4 这一段,它的其实地址是ISR_STA
[单片机]
DS1302 寄存器介绍
DS1302 的一条指令一个字节共8位,其中第7位(即最高位)固定为1,这一位如果是0的话,那写进去也是无效的。第6位是选择 RAM 还是 CLOCK 的,我前边说过,我们这里主要讲 CLOCK 时钟的使用,它的 RAM 功能我们不用,所以如果选择 CLOCK 功能,第6位是0,如果要用 RAM,那第6位就是1。从第5到第1位,决定了寄存器的5位地址,而第0位是读写位,如果要写,这一位就是0,如果要读,这一位就是1。指令字节直观位分配如图15-9所示。 图15-9 DS1302 命令字节 DS1302 时钟的寄存器,其中8个和时钟有关的,5位地址分别是 0b00000~0b00111,还有一个寄存器的地址是 01000,这是涓
[单片机]
中断保护现场
对于中断处理程序中使用到的寄存器,如果主程序中也要使用该寄存器就会发生冲突。常见的需要保护的寄存器有A、B、DPTR、PSW和工作寄存器组。 由于本技能训练的中断处理程序十分简单,对主程序没有影响,所以未进行保护现场,而一般的中断处理程序均需要保护现场。常见的几种保护现场的方法如下: (1)累加器A的保护 累加器A是程序中使用最为频繁的寄存器,中段处理程序中如果需要使用累加器A,就会改变A的数值。这样中断调用返回后,主程序中的输出控制字就被破坏了,造成输出错误。为了防止这种现象的出现,在中断处理程序中首先将需要使用的寄存器压入堆栈保存,中段处理程序完成后再使其弹出堆栈。以流水灯的中断程序为例,这一程序如下:
[单片机]
汇编语言学习笔记——————寄存器
CPU概述 内部总线 一个典型的CPU由运算器,逻辑控制器,寄存器等器件组成,这些器件靠内部总线相连。 内部总线与外部总线的区别 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板其他器件的联系。 寄存器 8086CPU有14个寄存器,他们的名称为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。 通用寄存器 8086CPU所有的寄存器都是16位的,可以存放两个字节。 AX,BX,CX,DX通常用来存放一般性数据被称之为通用寄存器 下图是AX通用寄存器的寄存器图: 一个16位的寄存器可以存储一个16位的数据 8086上一代CPU中的寄存器都是8位的,为了保
[单片机]
TI系列DSP的I2C模块配置与应用
I2C总线最早是由Philips公司提出的串行通信接口规范,标准I2C总线只使用两条线通信,能将多个具有I2C接口的设备连接,进行可靠的通信,连接到同一总线的I2C器件数量,只受总线最大电容400pF的限制,而且最高通信速率可以达到3.4Mb/s,由于I2C接口简单,使用方便,被很多芯片采用,成为一种广泛应用的接口 。 DSP即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的DSP供应商是TI公司,其TMS32系列产品占据了DSP市场近一半的份额,为了用户能方便快捷的进行系统的开发与集成,TI公司在一些型号的DSP中集成了I2C通信模块,本文以TMS320C67
[嵌入式]