中断处理程序完成后是否应该跳回错误指令?

问题描述 投票:0回答:1

我正在 ARM v7 上编写一个小型操作系统。我在 qemu 上模拟了树莓派。我已经编写了一个带有处理程序的中断向量表,并且不确定处理程序是否应该在完成后跳回错误指令。它可能看起来令人畏惧,但理解起来并不多。我只是从链接寄存器中减去 4 或 8 个字节,并将其与 r0-r12 一起保存在堆栈上,以便我可以将指向寄存器的指针作为参数传递到 C 处理函数中。 现在,一旦我跳回来,我应该跳到中断原因还是之后的原因?谢谢!

undefined_instruction:
    sub lr, #4
    stmfd sp!, {r0-r12,lr}
    mov r0, sp
    bl undefined_instruction_C
    LDMIA sp!, {r0-r12,pc}^

software_interrupt:
    sub lr, #4
    stmfd sp!, {r0-r12,lr}
    mov r0, sp
    bl software_interrupt_C
    LDMIA sp!, {r0-r12,pc}^


not_used:
    mov r0,r0

irq:
    sub lr, #8
    stmfd sp!, {r0-r12,lr}
    mov r0, sp
    bl irq_C
    LDMIA sp!, {r0-r12,pc}^

fiq:
    sub lr, #4
    stmfd sp!, {r0-r12,lr}
    mov r0, sp
    bl fiq_C
    LDMIA sp!, {r0-r12,pc}^

reset:
    mov r0,r0

prefetch_abort:
    sub lr, #4
    stmfd sp!, {r0-r12,lr}
    mov r0, sp
    bl prefetch_abort_C
    LDMIA sp!, {r0-r12,pc}^

data_abort:
    sub lr, #8
    stmfd sp!, {r0-r12,lr}
    mov r0, sp
    bl data_abort_C
    LDMIA sp!, {r0-r12,pc}^


.global _INIT_IVT
_INIT_IVT:
    ldr r0, =_ivt
    mcr p15, 0, r0, c12, c0, 0  
    bx lr

    
.global _ivt
.balign 64
_ivt:
    b reset
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
operating-system arm interrupt
1个回答
0
投票

中断由外部事件触发。异常(故障和陷阱)由指令触发。如果您正在处理已纠正的错误,您可以重新启动导致错误的指令。

如果您正在处理中断,您可以返回到进程的指令流,或者可以调用调度程序并选择要执行的进程。

© www.soinside.com 2019 - 2024. All rights reserved.