天天看点

嵌入式之ARM内部的一些运作

1:ARM的编程模式和7种工作模式

1.1;ARM采用的是32位的架构 至少现在64位的用得很少

1.2:ARM中的一些约定

1byte = 8bit

1 halfword = 16bit

1 word = 32 bit

1 doubleword = 63bit

解释:

什么是一个字 :

字就是cpu所能处理数据的位宽 也就是cpu一次能够处理的数据长度 最后就是回到了我们之前说的数据总线了

在嵌入式中arm是32位的 那么他的数据总线就是32位的 那么他的字就是32bit的 则推出其他占位的大小了,这些都是前后有根据的。

1.3;大部分的ARM汇编指令集

最早的都是 thumb指令集 16位的

然后到了 arm指令集 32位的

到了现在的thumb2指令集16&32的

现在来分析一下他们各自的特点

thumb指令集 每条指令只需要16位 节约内存 但是他并不健全 因为有些操作是16位无法满足的例如中断 那么就要用两条thumb指令进行,那么就复杂化了 ——————不占内存效率低

arm指令集 每条指令是32位的 健全可以全部一条指令表达 但是占内存对于一些16位就可以完成的指令也需要32位 就占内存了 ————————————————————占内存效率高

后来就出现了thumb2 就是两者的结合了 也是因为arm进行看分开嵌入式的m系列对于省内存是有必要的 但是对于效率我们也是需要的 因此就变成了综合了

1.4Jazelle cores 支持 Java bytecode 了解即可

这个就是一个支持java加速的指令集

2;ARM处理器工作模式

简述记忆方法

7种工作模式

只有一种是非特权模式 ————就是用户模式urse:用户模式就是cpu大部分时间处于的模式 像电脑用户使用时一样的模式

其余的6种都是特权模式 privilege

在6中privilege模式中只有一种是非异常模式——就是系统模式system:这个和用户模式一样 并且他们共用的寄存器也是一起的特权模式。

其余的5种都是异常模式

正常工作之外的流程都叫异常。例如我们电脑 点击鼠标这就叫异常 因为电脑cpu运行不操作就是正常工作 现在你点击鼠标就是正常工作之外的事

FIQ:快速中断模式

IRQ:普通中断模式

Supervisor:管理者模式 当出现复位软中断时进入

abort:存取异常的时候

Unberf:执行未定义指令时

cpu同一时间只能处于一种模式 那么对于模式的转换有两种方法

1;程序员写寄存器是cpu进入相应模式

2;cpu机械自动根据情况进入对应模式

为什么cpu设计者要规定这么多模式

cpu是硬件 os是软件 硬件和软件是相互制约相互运行的那么软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。

操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。

总结一下

除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。

Privilege中除Sys模式外,其余5种为异常模式。

各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。

各种模式下权限和可以访问的寄存器不同。

3:ARM的37个通用寄存器

3.1;通用寄存器 37个 就应该与我们之前说的7种工作模式应该息息相关的

提及一下我们之前说过的特殊功能寄存器SRF;他就是外设编程的接口 是与外设进行挂钩的 通过这些寄存器可以来对外设进行控制 ,因为I/O与内存的统一编址,那么cpu对特殊寄存器的访问就是通过总线直接连接进行存取的。

但是我们通用的寄存器是没有地址的 他只有唯一的名字(注意是在同个模式下有唯一的名字 等下就知道为什么要同一模式下);

3.2;通用寄存器与7种工作模式

嵌入式之ARM内部的一些运作
嵌入式之ARM内部的一些运作

小结

1、ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,其他寄存器虽然名字相同但是在当前模式不可见。

2、对r13这个名字来说,在ARM中共有6个名叫r13(又叫sp)的寄存器,但是在每种特定处理器模式下,只有一个r13是当前可见的,其他的r13必须切换到他的对应模式下才能看到。这种设计叫影子寄存器(banked register)

3.3;一些特殊通用寄存器的介绍

r13 别名 sp 是堆栈指针 指向程序的工作区域 那么就可以解释为什么每种模式都需要r13 因为每个模式都要自己独有的程序工作区域

r14 别名 lr 返回地址 可以用于模式跳转需要返回上级存入的上级地址 也可是函数调用返回地址

r15 别名 pc 程序计数器 作用就是指挥cpu执行哪个地方 的程序 cpu就是受pc指挥的 因此当我们需要cpu执行什么时 直接将pc指向就可以了 ,

PC(Program control register)为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)

cpsr 程序状态寄存器 就是指cpu运行的状态 一个芯片就一个cpu那么7种模式就应该共用一个cpsr

spsr 的作用就是保存cpsr的 当我们需要改变cpsr时 可以先将复制到spsr,这就叫现场保护

整个CPU中只有一个PC(CPSR也只有一个,但SPSR有5个,每个模式下的备份都是属于他自己的)。

总结

ARM共有37个寄存器,都是32位长度

37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。

4;详细介绍CPSR寄存器

嵌入式之ARM内部的一些运作

5;ARM异常处理方式的介绍

5.1;正常工作之外的流程都叫异常

异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作。那么我们就需要在中断之前先进行保存 等中断返回后再返回现场 我们一般保存的就是CPSR 通过SPSR保存的

中断就是一种异常

异常我们之前讲7种模式的时候就讲到了异常 除开System的其他5中特权模式都是异常模式

5.2;cpu怎么处理异常的

采用 异常向量表 有的也叫一级向量表

异常向量表是cpu设计时就规定的 规定一块地址区域 里面就包括每种异常 然后里面就是指向该异常应该指向的程序区域

pc自动跳转到向量表 指到一个区域那么就会跳转到该异常所执行程序的地方去

所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。

当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作)

异常向量表是硬件向软件提供的处理异常的支持。

嵌入式之ARM内部的一些运作

这些地址是偏移地址 vector table

嵌入式之ARM内部的一些运作

总结

异常处理中有一些是硬件自动做的,有一些是程序员需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何写代码。

在ARM中一定要知道的是

有一些是硬件自动做的,有一些是程序员需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何写代码。

这句话不仅仅适合与异常 更适合所有的地方

继续阅读