Есть вот такой код фика
CODE
FIQ_Handler_Entry:
stmfd sp!, {r0, lr}
ldr lr, =AT91C_BASE_AIC
ldr r0, [lr, #AIC_FVR]
str lr, [lr, #AIC_FVR]
msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC
//;- Save scratch/used registers and LR in User Stack
stmfd sp!, {r1-r3, r4, r12, lr}
//;- Branch to the routine pointed by the AIC_FVR
ldr r0, =fiq
mov r14, pc
bx r0
//;- Restore scratch/used registers and LR from User Stack
ldmia sp!, {r1-r3, r4, r12, lr}
//;- Leave Interrupts disabled and switch back in FIQ mode
msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ
mov r0, #0xFFFFFF
ldr r8, =AT91C_BASE_AIC
str r0, [r8, #AIC_EOICR]
//;- Restore the R0 ARM_MODE_SVC register
ldmia sp!, {r0, lr}
//;- Restore the Program Counter using the LR_fiq directly in the PC
subs pc,lr,#4
но работает он только если я в AIC_SMR[source] = AT91C_AIC_PRIOR_HIGHEST | 0;
а если использую другие варианты (0x2 << 5) или (0x1 << 5) или (0x3 << 5) то прерывание остается активным т.к. все время заходит в процедуру fiq и там прочитанный статус равен 0
если тот же обраотчик вешаю на IRQ то все работает отлично прерывания сбрасываются как положено
т.е. дело не в обработчике
вот код fiq
Код
void fiq(void)
{
volatile unsigned int dummy, reg;
unsigned int status;
status = AT91C_BASE_PIOA->PIO_ISR;
status &= AT91C_BASE_PIOA->PIO_IMR;
printf("HI %d \r\n", status);
if(status!=0)
{
dummy = AT91C_BASE_PIOA->PIO_ISR;
printf("HI fiq \r\n");
}
}
Подскажите в чем проблема?
И как сделать чтобы переходил по вектору на процедуру сохраненную через AIC
комментирую строку ldr r0, =fiq в фик не попадаю
жытага нет поэтому в слепую очень уж непросто разбираться и учиться
подскажите пожалуйста
Сообщение отредактировал Sergey1212 - May 2 2013, 05:48