Цитата(torik @ Feb 27 2008, 14:35)

Что это значит, ошибка где? Все что не касается прерываний этого PIO работает нормально...
Аналогичная ситуация. Вот, такой же текст, только на 4-е кнопки (BUTTON_PIO по SOPC):
........
volatile int edge_capture;
........
static void handle_button_interrupts(void* context, alt_u32 id)
{volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
}
static void init_button_pio()
{void* edge_capture_ptr = (void*) &edge_capture;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
alt_irq_register(BUTTON_PIO_IRQ, edge_capture_ptr, handle_button_interrupts);
}
int main()
{
........
init_button_pio();
........
}
Только я отлаживал в железе. Все работает в другой программе при программном опросе через 1мс. А при таком,
с прерыванием, похоже, что в
handle_button_interrupts совсем не заходит (ставил там ловушки). Вроде все по учебнику, а не понятно...
Функция
alt_irq_register() возвращает ноль (проверено), она же должна разрешить прерывания (так написано в учебнике).
Кто уже осилил прерывания? Что еще здесь не так?