Ситуация: после инициализации процессора разрешается прерывание,
в результате в регистре VICADDRESS я вижу адрес входной точки прерывания таймера Timer0IntrHandler (код ниже),
однако ловушки (breakpoints) в обработчике прерываний не срабатывают::
продолжает крутиться main() - "мотает" счётчик loops,
считают аппаратные счётчики таймера, а
lbolt (изменяемый в обработчике прерывания) стоит в нуле.
Регистры:
CPSR = 0x3F
VICIRQSTATUS = 0x0000010 // timer0
VICPRIORITY4 = 9
VICINTENABLE = 0x000010 // timer0
Куда б ещё поглядеть, чтоб понять причину невхода в обработчик прерывания?
Подскажите, кто знает, пож.
Станок: Olimex-LPC2378 + JLINK, инструмент: IAR.
Код
void main(void)
{
PlatformInit();
timer_initialize();
i2c_initialize(false);
uart_initialize();
__enable_interrupt();
while(1){
loops++;
}//end while(1)
} // main ()
Таблица векторов:
Код
__irq __arm void IRQ_Handler (void) {
void (*interrupt_function)();
UINT32 vector;
vector = VICVectAddr; // Get the interrupt vector.
interrupt_function = (void(*)())vector; // <--- breakpont is set here ---
if(interrupt_function != NULL) {
interrupt_function(); // Call vectored interrupt function.
} else {
VICVectAddr = 0; // Clear interrupt request in VIC.
}
} // void IRQ_Handler
__irq __arm void Abort_Handler (void) { while (true); }
__irq __arm void FIQ_Handler (void) { while (true); }
__irq __arm void Prefetch_Handler (void) { while (true); }
__irq __arm void SWI_Handler (void) { while (true); }
__irq __arm void Undefined_Handler (void) { while (true); }
Обработчик прерываний таймера:
Код
void Timer0IntrHandler (void)
{
lbolt++; // <--- breakpont is set here ---
T0IR = 1; // T0IR.MR0INT = 1; -- Clear interrupt flag */
VICVectAddr = 0; // Acknowledge Interrupt.
} // Timer0IntrHandler