bus16 (23.07.2007 14:25, просмотров: 1) ответил Pahan на Операционка у меня своя...в прерывании переключаю контексты задач, предварительно сохранив в стек контекст текущей задачи...
ИМХО не там копаем - для OS специально был сделан Supervisor Mode. И, не изобретая велосипеда, подглядим, как делают другие: <c>
OS_IRQ_SERVICE:
;
; Save temp. registers
;
stmdb SP!,{R0-R3,R12,LR} ; push
;
; push SPSR (req. if we allow nested interrupts)
;
mrs R0, SPSR ; load SPSR
stmdb SP!,{R0} ; push SPSR_irq on IRQ stack
;
; Switch to supervisor mode (svc mode)
;
msr CPSR_c, #SVC_MODE| I_FLAG ; Write CPSR: MODE = SVC, interrupt disabled
stmdb SP!, {LR} ; push LR_svc on SVC stack
; Switch back to IRQ mode
;
msr CPSR_c, #IRQ_MODE| I_FLAG ; Write CPSR: MODE = IRQ, interrupt disabled
;
; pop SPSR
;
ldmia SP!, {R1} ; pop SPSR_irq from IRQ stack
msr SPSR_cxfs, R1
;
; Restore temp registers
;
ldmia SP!, {R0-R3,R12,LR} ; pop
subs PC, LR, #4 ; RETI
</c>