S5P4418裸机开发(九):异常中断处理概述
ARM体系结构中对异常中断的一些概述
优先级
异常中断类型 | 异常中断模式 | 优先级 |
---|---|---|
Rset | 特权模式 | 1 |
Undef | 未定义指令中止模式 | 6 |
SWI | 特权模式 | 6 |
PAbort | 中止模式 | 5 |
DAbort | 中止模式 | 2 |
IRQ | 外部中断模式 | 4 |
FIQ | 快速中断模式 | 3 |
-
SWI或Undef:发生该异常时,PC值未更新,它指向当前指令后面的第2条指令,进入中断时,CPU将(
PC-4
)保存到lr_mode
中,(PC-4
)指向的是当前指令的下一条指令
;异常处理完后应返回当前指令的下一条指令
;即MOV PC, LR
-
IRQ或FIQ:通常,CPU执行完当前指令后,查询系统是否允许IRQ及FIQ中断,以及是否产生IRQ及FIQ中断,当该异常中断产生时,PC值已更新,它指向当前指令的后3条指令,进入中断时,CPU将(
PC-4
)保存到lr_mode
中,(PC-4
)指向的是当前指令后的第2条指令
;异常处理完后应返回当前指令的下一条指令
;即SUBS PC, LR, #4
-
PAbort:指令预取中止异常;
ABC三条指令,在执行A时预取C,若C指令会产生异常则标记该指令,在执行指令C时,处理器产生指令预取中止异常中断;当发生PAbort时,程序要返回到该有问题的指令处,重新读取并执行该指令
。因此PAbort中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面的返回到发生中断指令的下一条指令;
PAbort是由当前执行的指令自身产生的,当该异常产生时,PC值未更新,它指向当前指令后面的第2条指令,进入中断时,CPU将(PC-4
)保存到lr_mode
中,(PC-4
)指向的是当前指令的下一条指令
;异常处理完后应返回当前指令
;即SUBS PC, LR, #4
-
DAbort:数据访问中止异常;
DAbort是由数据访问指令产生的,当该异常产生时,PC值已更新,它指向当前指令后面的第3条指令,进入中断时,CPU将(PC-4
)保存到lr_mode
中,(PC-4
)指向的是当前指令的第2条指令
;异常处理完后应返回到产生数据访问中止异常中断的指令处;即SUBS PC, LR, #8
总结
异常类型 | 返回操作 |
---|---|
SWI or Undef | MOV PC, LR |
IRQ or FIQ | SUBS PC, LR, #4 |
PAbort | SUBS PC, LR, #4 |
DAbort | SUBS PC, LR, #8 |
- 将
LR
修改为中断处理完后的返回地址; -
STMFD sp!, {reglist, lr}
// 保存现场,!
表示更新sp
的值; - 异常中断处理程序;
-
LDMFD SP!, {reglist, lr}^
// 恢复现场,^
表示将SPSR_mode
寄存器的内容复制到当前程序状态寄存器CPSR
中,该指令只能在特权模式下使用;
IROMBoot程序设置了这个表;
除了复位操作,其他几种异常会跳到 0xFFFF0000 + offset
的地址;0xFFFF0000
是内部 SRAM
的起始地址;板子启动时IROM
程序会将nsih.bin
和2nboot.bin
复制到0xFFFF0000
处,下面是nsih.bin
开头的部分代码;
也是几条跳转指令,0xFFFF0200
是2nboot.bin
的起始地址,再看看2nboot.bin
的开头几条指令;
总结
友善Smart4418 官方安卓镜像的异常处理过程:
- 由
IROMBOOT
程序设定异常向量表;
ARM CPU的异常处理程序应该挨个地存在0x0地址。通常将用户的异常处理程序存在于零地址。但是,在IROMBOOT的情况下,用户的异常处理程序不可能设置在0x0地址,因为ROM存在于0x0地址。当使用MMU时,可以通过将任意存储器映射到零地址来处理CPU异常。然而,IROBOOT提供了用于不使用MMU的系统重定向异常处理程序的功能。
- 当异常发生时,PC跳向
IROM(0x34000000 + offset)
; - 再跳向
nsih(0xFFFF0000 + offset)
; - 再跳向
2nboot(0xFFFF0200 + offset)
;