ARM编程

一、ARM处理器的其中工作模式

1.User:非特权模式,大部分任务在User模式下执行;

2.FIQ:当一个高优先级指令产生时会进入这种模式;

3.Supervisor:当复位或者软中断指令执行时会进入这种模式;

4.Abort:当存取异常时会进入这种模式;

5.Undef:当执行未定义指令时会进入这种模式;

6.System:使用和User模式相同寄存器集的特权指;

二、ARM的37个通用寄存器

ARM编程

1、ARM共有37个寄存器,都是32位长度
2、37个寄存器中30个为通用型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR

3、PC(Programcontrol register)为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
4、整个CPU中只有一个PC(CPSR也只有一个,但SPSR有5个)。
5、对r13这个名字来说,在ARM*有6个名叫r13(又叫sp,是堆栈指针)的寄存器,但在每种特定模式下,只有一个r13是可见的,其他的r13必须切换到他的对应模式下才能看到,这种设计称为影子寄存器(banked register),每一种模式都有一个堆栈指针,这种冗余设计是为了避免其他模式下堆栈的破坏影响到其他模式下的堆栈。
6、r14(lr)是存储从一个模式到另一个模式的返回地址。

ARM编程

CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关)
CPSR中的I、F位和开中断、关中断有关
CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。
C表示有进位;V表示溢出;N表示结果是负的;Z表示结果是零。
三、ARM异常的处理方式

1、什么是异常?

正常工作之外的流程都叫异常
异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作
中断是异常的一种
2、异常向量表
所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。
当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作)
异常向量表是硬件向软件提供的处理异常的支持。
3、ARM的异常处理机制
当异常产生时, ARMcore:
拷贝 CPSR SPSR_<mode>
设置适当的 CPSR 位:
改变处理器状态进入 ARM
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断 (如果需要)
保存返回地址到 LR_<mode>
设置 PC 为相应的异常向量
返回时, 异常处理需要:
SPSR_<mode>恢复CPSR
LR_<mode>恢复PC
Note:这些操作只能在 ARM 态执行
4.总结
异常处理中有一些是硬件自动做的,有一些是程序员需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何写代码。
以上说的是CPU设计时提供的异常向量表,一般成为一级向量表。有些CPU为了支持多个中断,还会提供二级中断向量表,处理思路类似于这里说的一级中断向量表。