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

 
 
> alt_irq_register()?
juvf
сообщение Dec 27 2010, 06:04
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Не могу разобраться с функцией alt_irq_register(). Нашел в пдф "HAL API Reference" описание.
Цитата
Prototype: int alt_irq_register (alt_u32 id,
void* context,
void (*isr)(void*, alt_u32))

что такое *contex? что туда подставлять и для чего он нужен?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vadimuzzz
сообщение Dec 27 2010, 06:14
Сообщение #2


Гуру
******

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



обычно там передается указатель на файл устройства, от которого приходит прерывание. если не нужен, можно 0 передавать.
Go to the top of the page
 
+Quote Post
Fynjisx
сообщение Feb 18 2012, 04:56
Сообщение #3


студент
****

Группа: Свой
Сообщений: 571
Регистрация: 3-07-08
Из: Russia
Пользователь №: 38 712



Цитата(vadimuzzz @ Dec 27 2010, 09:14) *
обычно там передается указатель на файл устройства, от которого приходит прерывание. если не нужен, можно 0 передавать.

Доброго времени!
Никак не получается вызвать свою процедуру по пррыванию. Сделал вроде все как описано, но не получается. В SOPC назначил приоритет, в NIOS SBT, регистрирую таким образом:
CODE

static void ISR_Name();

void Registration(alt_u32 base, alt_u8 irq_number)
{
contx.base = base;
alt_irq_register(irq_number, &contx, ISR_Name);
}

прерывание возникает каждую ms но не вызывается процедура ISR_Name... не заходит у меня туда отладчик...
Как считаете, куда нужно обратить ещё внимание??? Можетчего-то забыл?
Кстати, в руководстве описана функция alt_irq_register, которая располагается в файле <sys/alt_irq.h>, а реально я там не смог её найти, вместо неё описана функция alt_ic_isr_register()... Я сначало подумал, что на этапе компиляции даст ошибку, о том что данной функции нет, но нет...всё прошло нормально...И непоняно откуда он её берет...


--------------------
С Уважением...
Go to the top of the page
 
+Quote Post
barabek
сообщение Feb 18 2012, 06:50
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Fynjisx @ Feb 18 2012, 14:56) *
Кстати, в руководстве описана функция alt_irq_register, которая располагается в файле <sys/alt_irq.h>, а реально я там не смог её найти, вместо неё описана функция alt_ic_isr_register()... Я сначало подумал, что на этапе компиляции даст ошибку, о том что данной функции нет, но нет...всё прошло нормально...И непоняно откуда он её берет...

alt_irq_register - это сейчас устаревшая функция, вместо нее спользуется alt_ic_isr_register. И функцию alt_irq_register выкинули из sys/alt_irq.h в файл, название которого сейчас не скажу - какой-то набор из слов "приватный" (prev), irq, alt, legacy. Можете все-таки найти функцию поиском.


По существу вашей проблемы сказать что либо трудно. Остальные прерывания работают? Бит, соответствующий прерыванию в регистре ienable выставлен? Вы точно уверены, что флаг прерывания выставляется?

Go to the top of the page
 
+Quote Post
Fynjisx
сообщение Feb 18 2012, 14:45
Сообщение #5


студент
****

Группа: Свой
Сообщений: 571
Регистрация: 3-07-08
Из: Russia
Пользователь №: 38 712



Цитата(barabek @ Feb 18 2012, 09:50) *
alt_irq_register - это сейчас устаревшая функция, вместо нее спользуется alt_ic_isr_register. И функцию alt_irq_register выкинули из sys/alt_irq.h в файл, название которого сейчас не скажу - какой-то набор из слов "приватный" (prev), irq, alt, legacy. Можете все-таки найти функцию поиском.

понятно, спасибо...
Цитата(barabek @ Feb 18 2012, 09:50) *
Остальные прерывания работают?

остальных пока нет, это первое... попробовал от системного таймера прерваться, для этого тоже зарегал функцию подобным образом...но такая же байда - кручусь в бесконечном цикле и ни каких намеков на переброс в функцию-обработчик...

Цитата(barabek @ Feb 18 2012, 09:50) *
Бит, соответствующий прерыванию в регистре ienable выставлен? Вы точно уверены, что флаг прерывания выставляется?

да, в режиме отладки когда уже зарегил ф-ию, кручусь в бесконечном цикле и жду прерывания, ienable в окне registers при этом равен 1.

Цитата(barabek @ Feb 18 2012, 09:50) *
Вы точно уверены, что флаг прерывания выставляется?

запрос прерывания точно выставляется, смотрел сигналтапом. Кстати это мой собственный компонент... Может чего то не так сделал? но в sopc в принципе только выставляю приоритет, а в sbt при регистрации использую базовый адрес компонента и номер запроса...
грешил на свой компонент, что говорить, но у меня даже от таймера не получается прерваться...
что то я не так пишу, какие еще тонкости могут быть??? может static не надо писать у функции обработчика или в режиме отладки невозможно попасть в обработчик по прерыванию... Если произойдет прерывание от таймера то куда нужно глядеть, на какой регистр?


--------------------
С Уважением...
Go to the top of the page
 
+Quote Post
barabek
сообщение Feb 19 2012, 01:08
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Fynjisx @ Feb 19 2012, 00:45) *
остальных пока нет, это первое... попробовал от системного таймера прерваться, для этого тоже зарегал функцию подобным образом...но такая же байда - кручусь в бесконечном цикле и ни каких намеков на переброс в функцию-обработчик...
да, в режиме отладки когда уже зарегил ф-ию, кручусь в бесконечном цикле и жду прерывания, ienable в окне registers при этом равен 1.
грешил на свой компонент, что говорить, но у меня даже от таймера не получается прерваться...
что то я не так пишу, какие еще тонкости могут быть??? может static не надо писать у функции обработчика или в режиме отладки невозможно попасть в обработчик по прерыванию... Если произойдет прерывание от таймера то куда нужно глядеть, на какой регистр?


Функции прерывания написаны в таком виде void COM_ISR(void * Context,alt_u32 id) (или при Enhansed void COM_ISR(void * Context) )?


Соответствующий бит разрешения всех прерываний в регистре status выставлен? При возникновении (по сигналтапу или по "ЗубДаюВыставлен") флага прерывания соответствующий бит в ipending (такой же по номеру как и в ienable) возводится? И еще нужно попробовать поставить брекпоинт в обработчике прерываний alt_irq_handler.
UPD А для таймера должен быть выставлен бит ITO и с приходом переполнения выставляется флаг TO. Все это можно посмотреть в memory. Добейтесь сперва работоспособности прерывания от таймера.
Go to the top of the page
 
+Quote Post



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

 


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


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