ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
94847 Топик полностью
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>