工具/软件:
您好、
您能解释一下在 R5F 中从异常恢复的步骤吗?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
您好、
您能解释一下在 R5F 中从异常恢复的步骤吗?
您好、
R5F 异常恢复是错误注入期间使用的主要恢复机制、异常恢复使系统能够正常处理故障。
恢复期间遵循的一般步骤如下:
寄存器的当前状态推送到 R12。
根据定义的故障类型和 ARM 状态、减去连接寄存器值。 之所以减去连接寄存器、是因为执行异常后控件应返回的位置取决于连接寄存器、如果未减去链接寄存器中的值、则它将一次又一次地执行相同的指令。 因此、为了退出异常并执行下一组指令、它需要在链接寄存器中有一个正确的值。
下面提供的是需要根据不同的例外情况减去的不同链路寄存器数据。
| 异常类型 | 异常时存储在 LR 中的值 | 从 LR 减去的值、用于在处理异常后执行下一组指令 |
| 数据中止异常 | Arm 模式:IA+8、Thumb 模式= IA+8 | Arm 模式:LR-4、Thumb 模式:LR-2 |
| 预取中止异常 | Arm 模式:IA+4、Thum 模式= IA+4 | Arm 模式:LR - 0、Thumb 模式:LR-0 |
| 3.未定义指令异常 | Arm 模式:IA+4、Thumb 模式= IA+2 | Arm 模式:LR - 0、Thumb 模式:LR-0 |
| 4.FIQ 处理程序 | Arm 模式:IA+4、Thum 模式= IA+4 | Arm 模式:LR - 4、Thumb 模式:LR-4 |
| 5. IRQ 处理程序 | Arm 模式:IA+4、Thum 模式= IA+4 | Arm 模式:LR - 4、Thumb 模式:LR-4 |
注意: 每当 发生 IRQ、FIQ 异常时、 在 ARM 和 Thumb 模式下、链接寄存器 (LR) 都会加载 (IA)+4。 此处 IA 是 由于 IRQ/FIQ 优先级而未执行的指令的地址。 因此、要执行由于中断而未执行的指令、从 LR 中减去 4。
3.按下返回地址 (LR)。
4.按下 SPSR。
5.运行处理程序。
注意:如果您的目标是从处理程序返回、请确保控件不会卡在处理程序中导致无限循环。
恢复 SPSR 寄存器。
恢复 LR 寄存器。
8.pop R0-R4。
9.将 LR 值转移到程序计数器。
下面提供了从数据中止异常中恢复的示例。
SDL_dataAbortExptnHandler:
; SPSR has the snapshot of CPSR before data abort. Compare thumb state bit in SPSR
; Push current state of registers.
PUSH {r0-r4, r12}
MRS r0, SPSR
AND r1, r0, #0x20
CMP R1, #0
; branches to label ARM_STATE if the thumb state bit is not set
BEQ ARM_STATE
SUB lr, lr, #2
ARM_STATE:
SUB lr, lr, #4
; Push the return address and SPSR.
PUSH {lr}
MRS lr, SPSR
PUSH {lr}
; Call the data abort handler.
LDR r1, SDL_dataAbortExptnHandler_c_addr
BLX r1
; Restore used registers, LR and SPSR before returning.
POP {LR}
MSR SPSR_cxsf, LR
POP {LR}
POP {r0-r4, r12}
MOVS PC, LR
此致、
Manojna