реклама на сайте
подробности

 
 
> ISR и DMA
Veg@
сообщение Aug 3 2010, 15:33
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



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: замечания и критика по коду и общей реализации приветствуются. Спасибо.

Сообщение отредактировал Veg@ - Aug 3 2010, 15:39
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
wolfman
сообщение Aug 3 2010, 18:15
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 529
Регистрация: 15-06-05
Из: Питер
Пользователь №: 6 032



Цитата(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 стоит сбрасывать по чтению из него, т.е проц прочитал содержимое регистра и регистр нужно сбросить, чтобы проц в вечном инте не висел.


--------------------
Россия это даже не страна.
Россия это секрет, завернутый в загадку и укрытый не проницаемой тайной...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Veg@   ISR и DMA   Aug 3 2010, 15:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.0135 секунд с 7
ELECTRONIX ©2004-2016