2. Инициализация обработчика данного прерывания:
Код
void int_init() {
alt_irq_init (ALT_IRQ_BASE);
alt_irq_register(TESTCOMP_IRQ,NULL,testcomp_isr);
alt_irq_enable(TESTCOMP_IRQ);
}
alt_irq_init (ALT_IRQ_BASE);
alt_irq_register(TESTCOMP_IRQ,NULL,testcomp_isr);
alt_irq_enable(TESTCOMP_IRQ);
}
В обработчике прерывания осуществляется dma-транспортировка данных:
Код
void dma_init() {
if ((txchan = alt_dma_txchan_open("/dev/dma")) == NULL) printf ("Failed to open transmit channel");
if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL) printf ("Failed to open receive channel");
}
void dma_done (void* handle, void* data) {
alt_dcache_flush_all();
rx_done++;
}
void testcomp_isr(void* context, alt_u32 id) {
rx_done = 0;
alt_dma_txchan_send (txchan,(void*) TESTCOMP_BASE,1500*4,NULL,NULL);
alt_dma_rxchan_prepare (rxchan,(void*) buffer,1500*4,dma_done,NULL);
while (!rx_done);
}
Но обработчик первого же прерывания зависает на цикле while (!rx_done);. С чем это может быть связано? Что будет, если прерывания возникают быстрее, чем обрабатываются? Вне обработчика пересылка осуществляется успешно (пересылается 1500 слов). if ((txchan = alt_dma_txchan_open("/dev/dma")) == NULL) printf ("Failed to open transmit channel");
if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == NULL) printf ("Failed to open receive channel");
}
void dma_done (void* handle, void* data) {
alt_dcache_flush_all();
rx_done++;
}
void testcomp_isr(void* context, alt_u32 id) {
rx_done = 0;
alt_dma_txchan_send (txchan,(void*) TESTCOMP_BASE,1500*4,NULL,NULL);
alt_dma_rxchan_prepare (rxchan,(void*) buffer,1500*4,dma_done,NULL);
while (!rx_done);
}
PS: замечания и критика по коду и общей реализации приветствуются. Спасибо.