Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ISR и DMA
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Veg@
1. Для реализации прерывания в компоненте задействован сигнал irq, устанавливаемый в лог. 1 для вызова прерывания. Через какой промежуток времени он должен / может быть сброшен в 0 ?
2. Инициализация обработчика данного прерывания:
Код
void int_init() {
  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 слов).

PS: замечания и критика по коду и общей реализации приветствуются. Спасибо.
wolfman
Цитата(Veg@ @ Aug 4 2010, 02:03) *
1. Для реализации прерывания в компоненте задействован сигнал irq, устанавливаемый в лог. 1 для вызова прерывания. Через какой промежуток времени он должен / может быть сброшен в 0 ?
2. Инициализация обработчика данного прерывания:
Код
void int_init() {
  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 слов).

PS: замечания и критика по коду и общей реализации приветствуются. Спасибо.



Так вы не в ту ветку форума свой вопрос запостили. Вообще ISR стоит сбрасывать по чтению из него, т.е проц прочитал содержимое регистра и регистр нужно сбросить, чтобы проц в вечном инте не висел.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.