В этом примере два прерывания. Внешнее и внутреннее(интервальный таймер).
Внутреннее прерывание - функция system_int, ссылка на которую и программируется в соответствующий AIC_SVR. Написана на Си.
Цитата
pAIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) system_int;
Вход в эту функцию system_int - STMDB R13!,{R0-R5,R12,R14}, выход - LDMIA R13!,{R0-R5,R12,R14}
Тут непонятно - почему не выполняются процедуры переключения режима, сохранения регистров.
Внешнее прерывание выполняется по - другому. Ссылка на ассемблерную вставку irq0_int
Код
irq0_int FUNCTION
SUB LR, LR, #4 ; Update Link Register
STMFD SP!, {R0-R12, LR} ; Save Workspace & LR to Stack
MRS R0, SPSR ; Copy SPSR to R0
STMFD SP!, {R0, R1} ; Save SPSR to Stack (8-byte)
MSR CPSR_c, #0x1F ; Enable IRQ (Sys Mode)
STMFD SP!, {R0, LR} ; Save LR_sys to Stack (8-byte)
LDR R0, =irq0_nint ; Get IRQ Function Address
MOV LR, PC ; Return Address
BX R0 ; Call IRQ Function
LDMFD SP!, {R0, LR} ; Restore LR_sys
MSR CPSR_c, #0x92 ; Disable IRQ (IRQ Mode)
LDMFD SP!, {R0, R1} ; Restore SPSR to R0
MSR SPSR_cxsf, R0 ; Copy R0 to SPSR
LDMFD SP!, {R0-R12, PC}^; Return to program
ENDFUNC
программируется в соответствующий AIC_SVR. Эта вставка, выполняет все процедуры, описанные в даташите.
Почему при внутреннем прерывании такой вставки не делается??
Почему процедура прерывания (ссылка irq0_nint ) выполняется в Sys Mode? Какой в этом заложен смысл? Подозреваю, что связанно это с вложениями прерываний.
И еще если можно - какой режим соответствует SPSR_cxsf. Не нашел в даташите.
Спасибо.
Сообщение отредактировал Димон Безпарольный - Mar 10 2011, 13:23