реклама на сайте
подробности

 
 
> sam7 вложенные прерывания (nested interruptsm)
Neon_613
сообщение Mar 7 2012, 09:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 19-09-10
Пользователь №: 59 574



Здравствуйте!

Вопрос о вложенных прерываниях.

Код
Mode_USR            EQU     0x10
Mode_FIQ            EQU     0x11
Mode_IRQ            EQU     0x12
Mode_SVC            EQU     0x13
Mode_ABT            EQU     0x17
Mode_UND               EQU     0x1B
Mode_SYS            EQU     0x1F

BASE_AIC            EQU        0xFFFFF000
AIC_EOICR_offset    EQU        0x130    
AIC_IVR_offset        EQU        0x100

I_Bit               EQU     0x80  


                EXTERN _IRQ_SYS

                EXPORT    IRQ_Entry
                                
                AREA    IRQIRQ, CODE, READONLY
                ARM
                            
IRQ_Entry

sub         LR, LR, #4;Корректировка значения
stmfd       SP!, {LR};Сохраняем LR_irq в стек IRQ.
mrs         R14, SPSR;Сохраняем SPSR
stmfd       SP!, {R14};в стек IRQ.
stmfd       SP!, {R0};Сохраняем R0 в стек IRQ.

ldr         R14, =BASE_AIC        ;Достаем адресс обработчика                    
ldr         R0 , [R14, #AIC_IVR_offset];прерывания    из IAC (AIC_IVR).
;str         r14, [r14, #AIC_IVR_offset]
    
mrs           R14, CPSR            ;
bic            R14, R14, #I_Bit    ;Разрешаем IRQ прерывания и
orr            R14, R14, #Mode_SVC    ;переходим Supervisor mod.
msr            CPSR_c, R14            ;

stmfd       SP!, { R1-R3, R12, R14};Сохраняем используемые регистры в IRQ-стеке

mov         LR, PC                ;точка возврата
bx          R0                    ;Вызываем обработчик


ldmia       SP!, {R1-R3, R12, R14};Востанавливаем регистры

mrs            R0, CPSR            ;
bic            R0, R0, #Mode_SYS    ;
orr            R0, R0, #I_Bit :OR: Mode_IRQ;Заприщаем IRQ прерывания и
msr            CPSR_c, R0            ;переходим в IRQ mode.

ldr         R14, =BASE_AIC        ;Отмечаем окончания
str         R14, [R14, #AIC_EOICR_offset];прерывания

ldmia       SP!, {R0}            ;Востанавливаем R0
ldmia       SP!, {R14}            ;
msr         SPSR_cxsf, R14        ;и SPSR
ldmia       SP!, {PC}^            ;

                END


указал адресс IRQ_Entry в там где должен быть вектор оброботчика IRQ прерывания. все работает.
Только вопрос. я так понимаю AIC не будет не чего пред пренимать пока в AIC_EOICR не будет не чего записано.
а я записываю в него на выходе. и какое же это тогда вложенное?
или AIC будет генерировать прерывание только если его приоритет выше?

Сообщение отредактировал Neon_613 - Mar 7 2012, 09:18
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016