version 1.3, 2007/11/04 22:39:27 |
version 1.5, 2007/11/23 13:37:42 |
|
|
nop |
nop |
|
|
_vector_irq: |
_vector_irq: |
|
/* decrement pc by one insn */ |
|
sub lr, lr, #4 |
|
|
bl irq_trampoline |
/* store all system mode registers */ |
|
stmdb sp!, {r0-r12, lr} |
|
|
mrs r0, spsr |
/* store sys_mode's cpsr */ |
msr cpsr, r0 |
// mrs r1, spsr |
|
// stmdb sp!, {r1} |
|
|
subs pc, r14, #4 |
/* pass sp (which now contains struct pcb of interrupted task) to irq_trampoline */ |
|
mov r0, sp |
|
|
|
bl irq_trampoline |
|
|
|
/* load r0-r12 and pc from the stack */ |
|
/* note ^ that copies SPSR into CPSR */ |
|
/** here we may return to different task (if pcb was changed in the stack memory) **/ |
|
ldmia sp!, {r0-r12, pc}^ |
|
|
_vector_fiq: |
_vector_fiq: |
nop |
nop |