Цитата(Burenkov Sergey @ Nov 15 2016, 10:22)

В обработчике нужно сразу сбросить флаг прерывания у того модуля кто его генерит. Если модуль самописный, проверьте что прерывания выставляется правильно, и сбрасывается правильно при записи в соответствующий адрес. Так же в самом обработчике не надо ничего делать, кроме выставления флага о том что было прерывание. Саму логику обработки пишете в главном цикле.
У вас не вывод прекращается, а вообще процессор виснет полностью.
Хммм... У меня прерывания приходят на, специально для этих целей установленные, pio состоящие из 1 контакта. Обработчик прерывания 1 в 1 как из даташита алтеры. Прерывания регистрируются по переднему(восходящему) фронту. Само прерывание не сбрасывается сразу. По причине того что оно фактически работает только по фронту, то требований таких мы и не выставляли. После всех действий необходимых для обработчика прерывания от pio(из даташита) вызывается функция которая и выполняет требуемые действия. код вот такой выходит:
Код
volatile int edge_capture_mpvs_ctrl;
static void init_brightness_irq(){
/* Recast the edge_capture pointer to match the
alt_irq_register() function prototype. */
void* edge_capture_ptr = (void*) &edge_capture_mpvs_ctrl;
/* Enable all 4 button interrupts. */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(LB_MPVS_IRQ_BRIGHTNESS_BASE, 0xf);
/* Reset the edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE, 0x0);
/* Register the ISR. */
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(
LB_MPVS_IRQ_BRIGHTNESS_IRQ_INTERRUPT_CONTROLLER_ID,
LB_MPVS_IRQ_BRIGHTNESS_IRQ,
brightness_irq,
edge_capture_ptr,
0x0
);
#else
alt_irq_register(
LB_MPVS_IRQ_BRIGHTNESS_IRQ,
edge_capture_ptr,
brightness_irq
);
#endif
}
static void brightness_irq(void* context) {
volatile int* edge_capture_ptr = (volatile int*) context;
/*
* Read the edge capture register on the button PIO.
* Store value.
*/
*edge_capture_ptr =IORD_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE);
/* Write to the edge capture register to reset it. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE, 0);
/* Read the PIO to delay ISR exit. This is done to prevent a
spurious interrupt in systems with high processor -> pio
latency and fast interrupts. */
IORD_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE);
//реагирование на прерывание
}
Исходя из вышеописанных особенностей реализации прерывания и выложенного кода программ, вы считаете что процессор зависает?
Сообщение отредактировал RLC - Nov 15 2016, 14:08