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

 
 
 
Reply to this topicStart new topic
> Правильно ли организую прерывания?
Shevnnov
сообщение Apr 27 2010, 07:36
Сообщение #1


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

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Необходимо организовать обработку прерывания для 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 нужно передавать два указателя - одно на место под данные, второе под длину принятых данных. Пока получается только один.

Сообщение отредактировал Shevnnov - Apr 27 2010, 07:37
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 27 2010, 08:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

а зачем обработчику прерывания что-то передавать? и, главное, кто это будет делать?
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Apr 27 2010, 13:14
Сообщение #3


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

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Как мне тогда в данном случае сделать, если у меня по прерыванию ETH_RECEIVE_IRQ нужно выполнить действия, описываемые функцией eth_receive_data()?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 27 2010, 13:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

так там ничего не делается, берем данные из регистров и кидаем в переменные, а смысл? обработчик должен что-то сделать с пакетом (например, кинуть в очередь), приготовиться к приему след. пакета и выйти. если массив с его длиной в памяти свести надо, ну заведите структуру.
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Apr 27 2010, 14:18
Сообщение #5


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

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Хорошо, буду тогда передавать указатель на структуру.
ТО что я привел в начале при попытке запуска ничего не выдало. Это показывает, что функционал описанный eth_receive_data не запускается по прерыванию. Вчем проблема? (помимо моих кривых рук)
Пока сейчас обработка примитивна - но это с целью разобраться как с перываниями работать. В дальнейшем будет больше действий выполняться (как то работа с DMA, чтение заголовка пакета Ethernet, проверка СRC)
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 27 2010, 14:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

типичная ошибка - разбираться одновременно с софтом и железом. возьмите готовый рабочий компонент (тот же jtag_uart) и поиграйтесь с прерываниями. потом свой компонент в тестбенче погоняйте, на предмет соответствия авалоновским спекам. потом уже в связке.
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Sep 6 2010, 08:12
Сообщение #7


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

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Попробовал посмотреть как работают прерывания не примере простейшего компонента button_PIO. Вроде понял как описывать функцию обработки прерывания на Си. Тестировал в режиме Debug на железе - всё работает. Сейчас нужно просимулировать это же. Вопрос: как имитировать нажатие кнопки через команды IOWR* и можно ли?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Sep 6 2010, 08:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



заведите в моделсиме нужные сигналы на порты: http://www.altera.com/literature/an/an351.pdf
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Sep 6 2010, 08:21
Сообщение #9


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

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



За ссылку спасибо, это я уже читал, документ полезный. Вопрос конкретный, какие сигналы заводить?
Там есть два варианта: либо IOWR_ALTERA_AVALON_PIO_DATA или IOWR_ALTERA_AVALON_PIO_EDGE_CAP
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Sep 6 2010, 09:09
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Shevnnov @ Sep 6 2010, 15:21) *
За ссылку спасибо, это я уже читал, документ полезный. Вопрос конкретный, какие сигналы заводить?
Там есть два варианта: либо IOWR_ALTERA_AVALON_PIO_DATA или IOWR_ALTERA_AVALON_PIO_EDGE_CAP

IOWR/IORD - это операции над соотв. внутренними регистрами а в моделсиме воздействие подается на порт. что касается EDGE_CAP, то он используется, если прерывание должно срабатывать по перепаду, а не по уровню.
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Sep 6 2010, 09:24
Сообщение #11


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

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Спасибо. Мне по идею нужно по уровню. Покопался в настройках соответсвующего компонента, нашел место где меняется тип срабатывания прерывания. Буду эксперементировать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:45
Рейтинг@Mail.ru


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