Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Правильно ли организую прерывания?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Shevnnov
Необходимо организовать обработку прерывания для SOPC системы. Когда прерывание выполняется необходимо выполнить функцию eth_receive_data() и получить принятый данные из регистров. Раскурив документацию Alter'ы попытался написать обработку. Правильно ли я делаю

CODE
void init_eth_rx_interrupts(int *data)
{
volatile void* data_context = (volatile void*)data;
alt_irq_register(ETH_RECEIVE_IRQ, data_context, eth_receive_data);
}

int eth_receive_data(int *data, int *data_len)
{
int i;
int rx_p_len = 0;

rx_p_len = IORD_ETH_CONTROL_RECEIVED_BYTES(ETH_CONTROL_BASE);

// data = (int*)malloc(rx_p_len);

for (i=0; i < rx_p_len/4; i++)
data[i] = IORD_ETH_RECEIVE(ETH_RECEIVE_BASE,i);

*data_len = rx_p_len;

if (data[0])
return 1;
else
return 0;
}


и в main пишу следующее:

CODE
rx_data = (int*)malloc(pack_count*sizeof(int));

init_eth_rx_interrupts(rx_data);
alt_irq_enable_all(*rx_data);

printf("\n Received: \t");
for (i=0; i< rx_data_len/4; i++)
printf("%x",rx_data[i]);

alt_irq_disable_all();


Правильно ли так или надо по другому это делать?
И еще проблема для функции eth_receive_data нужно передавать два указателя - одно на место под данные, второе под длину принятых данных. Пока получается только один.
vadimuzzz
достаточно этого (alt_irq_register в последних версиях объявлена устаревшей): alt_irq_register(ETH_RECEIVE_IRQ, data_context, eth_receive_data); в параметре context обычно передают указатель на структуру, связанную с устройством, но это опционально.
Цитата(Shevnnov @ Apr 27 2010, 14:36) *
И еще проблема для функции eth_receive_data нужно передавать два указателя - одно на место под данные, второе под длину принятых данных. Пока получается только один.

а зачем обработчику прерывания что-то передавать? и, главное, кто это будет делать?
Shevnnov
Как мне тогда в данном случае сделать, если у меня по прерыванию ETH_RECEIVE_IRQ нужно выполнить действия, описываемые функцией eth_receive_data()?
vadimuzzz
Цитата(Shevnnov @ Apr 27 2010, 20:14) *
Как мне тогда в данном случае сделать, если у меня по прерыванию ETH_RECEIVE_IRQ нужно выполнить действия, описываемые функцией eth_receive_data()?

так там ничего не делается, берем данные из регистров и кидаем в переменные, а смысл? обработчик должен что-то сделать с пакетом (например, кинуть в очередь), приготовиться к приему след. пакета и выйти. если массив с его длиной в памяти свести надо, ну заведите структуру.
Shevnnov
Хорошо, буду тогда передавать указатель на структуру.
ТО что я привел в начале при попытке запуска ничего не выдало. Это показывает, что функционал описанный eth_receive_data не запускается по прерыванию. Вчем проблема? (помимо моих кривых рук)
Пока сейчас обработка примитивна - но это с целью разобраться как с перываниями работать. В дальнейшем будет больше действий выполняться (как то работа с DMA, чтение заголовка пакета Ethernet, проверка СRC)
vadimuzzz
Цитата(Shevnnov @ Apr 27 2010, 21:18) *
Пока сейчас обработка примитивна - но это с целью разобраться как с перываниями работать. В дальнейшем будет больше действий выполняться (как то работа с DMA, чтение заголовка пакета Ethernet, проверка СRC)

типичная ошибка - разбираться одновременно с софтом и железом. возьмите готовый рабочий компонент (тот же jtag_uart) и поиграйтесь с прерываниями. потом свой компонент в тестбенче погоняйте, на предмет соответствия авалоновским спекам. потом уже в связке.
Shevnnov
Попробовал посмотреть как работают прерывания не примере простейшего компонента button_PIO. Вроде понял как описывать функцию обработки прерывания на Си. Тестировал в режиме Debug на железе - всё работает. Сейчас нужно просимулировать это же. Вопрос: как имитировать нажатие кнопки через команды IOWR* и можно ли?
vadimuzzz
заведите в моделсиме нужные сигналы на порты: http://www.altera.com/literature/an/an351.pdf
Shevnnov
За ссылку спасибо, это я уже читал, документ полезный. Вопрос конкретный, какие сигналы заводить?
Там есть два варианта: либо IOWR_ALTERA_AVALON_PIO_DATA или IOWR_ALTERA_AVALON_PIO_EDGE_CAP
vadimuzzz
Цитата(Shevnnov @ Sep 6 2010, 15:21) *
За ссылку спасибо, это я уже читал, документ полезный. Вопрос конкретный, какие сигналы заводить?
Там есть два варианта: либо IOWR_ALTERA_AVALON_PIO_DATA или IOWR_ALTERA_AVALON_PIO_EDGE_CAP

IOWR/IORD - это операции над соотв. внутренними регистрами а в моделсиме воздействие подается на порт. что касается EDGE_CAP, то он используется, если прерывание должно срабатывать по перепаду, а не по уровню.
Shevnnov
Спасибо. Мне по идею нужно по уровню. Покопался в настройках соответсвующего компонента, нашел место где меняется тип срабатывания прерывания. Буду эксперементировать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.