您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

ARM底子知识教程三

发布日期:2011-04-19

ARM中非常停止的种类

**复位(RESET)**
当处理惩罚器复位引脚有效时,体系孕育产生复位非常停止,步伐跳转到复位非常停止处理惩罚步伐处实行。复位非常停止通常用在下面几种环境下:体系加电时;体系复位时;跳转到复位停止向量处实行成为软复位。

**未定义的指令**
ARM处理惩罚器大概是体系中的协处理惩罚器以为当前指令未定义时,孕育产生未定义的指令非常停止,可以通过改非常停止机制仿真浮点向量运算。

**软件停止**
这是一个由用户定义的停止指令。可用于用户模式下的步伐调用特权操纵指令。在及时操纵体系中可以通过该机制西线体系成果调用。

**指令与取停止(PrefechAbort)**
要是处理惩罚器预取的指令的地点不存在,大概该地点不容许当前指令访问,当被预取的指令实行时,处理惩罚器孕育产生指令预取停止非常停止。

**数据访问停止(DATAABORT)
要是数据访问指令的目标地点不存在,,大概该地点不容许当前指令访问,处理惩罚器孕育产生数据访问停止非常停止

**外部停止恳求(IRQ)**
当处理惩罚器的外部停止恳求引脚有效,并且CPSR的寄存器的I控制位被打扫时,处理惩罚器孕育产生外部停止恳求非常停止。体系中个外设通过该非常停止恳求处理惩罚办事。

**快速停止恳求(FIQ)**
当处理惩罚器的外部快速停止恳求引脚有效,并且CPSR的F控制位被打扫时,处理惩罚器孕育产生外部停止恳求非常停止

非常停止向量表及非常停止优先级
停止向量表指定了个非常停止及其处理惩罚步伐的映射干系。他通常存放在存储地点的低端。在ARM体系中,非常停止向量表的大小为32字节,此中每个非常停止占据4个字节大小,保存了4个字节空间。
每个非常停止映射的停止向量表中的4个字节的空间中存放了一个跳转指令大概一个向PC寄存器中赋值的数据访问指令。通过这两种指令,步伐将跳转到相应的非常停止处理惩罚步伐处实行。当几个非常停止同时产生时,就必须根据肯定的序次来处理惩罚这些非常停止。

各个非常停止的停止向量地点以及停止的处理惩罚优先级
停止向量地点 非常停止范例 非常停止模式 优先级(6最低)
0x00 复位 特权模式 1
0x04 未定义的指令 未定义指令停止模式 6
0x08 软件停止 特权模式 6
0x0C 指令预取停止 停止模式 5
0x10 数据访问停止 停止模式 2
0x14 保存 未利用 未利用
0x18 外部停止恳求 IRQ模式 4
0x1C 快速停止恳求 FIQ模式 3

在应用步伐中安置非常停止处理惩罚步伐
1.利用跳转指令:可以在非常停止映射非常向量表中特定位置安排一条跳转指令,直接跳转到该非常停止的处理惩罚步伐。这种要领有一个缺点,即只能在32M空间范畴内跳转。
2.利用数据读取指令LDR:利用数据读取指令LDR向步伐计数器PC中直接赋值。这种要领分为两步:先将非常停止处理惩罚步伐的绝对地点存放在存放在间隔向量表4KB范畴内的一个存储单位中;再利用数据读取指令LDR将该单位的内容读取到步伐计数器PC中。 **在体系复位时安置非常停止处理惩罚步伐**
1.地点0x00处为ROM的环境
利用数据读取指令LDR示比方下所示:
Vector_Init_Block
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SW_Addr
LDR PC, Prefeth_Addr
LDR PC, Abort_Addr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr

Reset_Addr DCD Start_Boot
Undefined_Addr DCD Undefined_Handle
SW_Addr DCD SWI_Handle
Prefeth_Addr DCD Prefeth_Handle
Abort_Addr DCD Abort_Handle
DCD 0
IRQ_Addr DCD IRQ_Handle
FIQ_Addr DCD FIQ_Handle
利用跳转指令的示比方下所示:
Vector_Init_Block
BL Reset_Handle
BL DCD Undefined_Handle
BL SWI_Handle
BL Prefeth_Handle
BL Abort_Handle
NOP
BL IRQ_Handle
BL FIQ_Handle
2.地点0x00处为RAM的环境
地点0x00处为RAM时,停止向量表必须利用数据读取指令直接指向PC中赋值的情势。并且,必须利用下面的代码巴停止向量表从ROM中复制到RAM中地点0x00开始处的存储空间中:

MOV r8,#0
ADR r9,Vector_Init_Block
;复制停止向量表(8字)
LDMIA r9!,(r0-r7)
STMIA r8!,(r0-r7)
;复制生存各停止处理惩罚函数地点的表(8字words)
LDMIA r9!,(r0-r7)
STMIA r8!,(r0-r7)