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

 
 
 
Reply to this topicStart new topic
> Прерывания SAM
beer_warrior
сообщение Jun 3 2006, 21:55
Сообщение #1


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Написал прием/передачу по USART по прерываниям.
До этого прерывания использовал PIT, на котором базируется системный таймер.
Вызова приема/передачи в теле программы нет, присутствует только сама функция прерывания,
тем не менее программа в это прерывание залетает(включается светодиод), при этом таймер тихо сходит с ума.(Если пишу в AIC_EOICR, зависает, если нет увеличивется частота). Такое впечетление, что влет в оба прерывания происходит по переполнению PIT.
Прерывания конфигурил по AT91F_AIC_ConfigureIt, приоритет PIT = 7, USART = 6.Компилятор gcc, режим ARM, о баге с thumb режимом осведомлен, атрибут прерывания поставлен.
Я что-то не понял в конфигурации AIC? или на выходе из USART Interrupt нужны какие-то танцы?
Помогите ибо день на это уже убил.sad.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 4 2006, 21:51
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(beer_warrior @ Jun 4 2006, 00:55) *
(Если пишу в AIC_EOICR, зависает, если нет увеличивется частота).

Писать AIC_EOICR нужно обязательно.
Зависает возможно из-за того, что в обработчике прерывания вы не читаете регистр US_CSR для идентификации прерывания...
imho трабла не с AIC'ом в общем, а с тем, что AIC'у сообщается о завершении обработки прерывания, а USART'у - нет.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jun 5 2006, 04:44
Сообщение #3


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
imho трабла не с AIC'ом в общем, а с тем, что AIC'у сообщается о завершении обработки прерывания, а USART'у - нет.

ОК, с AIC_EOICR понятно - закрытие прерывания в AIC.
Чтение PIT_PIVR - сброс флажка прерывания в PIT.
Чтение US_CSR - сброс флажка прерывания в USART? (регистр read-only).

У меня сейчас складыватся впечетление, что я что-то упустил на уровне ядра - вроде бы не сохраняется контекст, из-за этого и проблемы: у функций стоит атрибут nacked и используются макросы
ISR_ENTRY и ISR_EXIT позаимствованые из примера с прерывниями.
Ключик компилятора -marm для всего или -mthumb-interworking для основной программы и -marm для файла с прерываниями - ситуация в любом случае одинаковая.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 5 2006, 08:57
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(beer_warrior @ Jun 5 2006, 07:44) *
У меня сейчас складыватся впечетление, что я что-то упустил на уровне ядра - вроде бы не сохраняется контекст, из-за этого и проблемы:....

Не думаю что тогда было бы это:

Цитата
.. если нет увеличивется частота


это imho два взаимоисключающих фактора.

все должно быть проще..
Сокращенный код обработчика usart'a был бы весьма кстати.
Go to the top of the page
 
+Quote Post
gmax
сообщение Jun 5 2006, 13:41
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954



Цитата(beer_warrior @ Jun 4 2006, 00:55) *
Написал прием/передачу по USART по прерываниям.
До этого прерывания использовал PIT, на котором базируется системный таймер.
Вызова приема/передачи в теле программы нет, присутствует только сама функция прерывания,
тем не менее программа в это прерывание залетает(включается светодиод), при этом таймер тихо сходит с ума.(Если пишу в AIC_EOICR, зависает, если нет увеличивется частота). Такое впечетление, что влет в оба прерывания происходит по переполнению PIT.
Прерывания конфигурил по AT91F_AIC_ConfigureIt, приоритет PIT = 7, USART = 6.Компилятор gcc, режим ARM, о баге с thumb режимом осведомлен, атрибут прерывания поставлен.
Я что-то не понял в конфигурации AIC? или на выходе из USART Interrupt нужны какие-то танцы?
Помогите ибо день на это уже убил.sad.gif

Победил подобное поведение, сконфигурировав оба прерывания (и PIT, и UART) как level sensetive (НЕ edge sensetive).

Сообщение отредактировал gmax - Jun 5 2006, 13:42
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 5 2006, 13:47
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(gmax @ Jun 5 2006, 16:41) *
Победил подобное поведение, сконфигурировав оба прерывания (и PIT, и UART) как level sensetive (НЕ edge sensetive).

Точно, и в даташите есть информация об этом:

31.5.3 Interrupt
The USART interrupt line is connected on one of the internal sources of the Advanced Interrupt
Controller. Using the USART interrupt requires the AIC to be programmed first. Note that
it is not recommended to use the USART interrupt line in edge sensitive mode.
Go to the top of the page
 
+Quote Post
gmax
сообщение Jun 5 2006, 14:48
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954



Цитата(defunct @ Jun 5 2006, 16:47) *
Цитата(gmax @ Jun 5 2006, 16:41) *

Победил подобное поведение, сконфигурировав оба прерывания (и PIT, и UART) как level sensetive (НЕ edge sensetive).

Точно, и в даташите есть информация об этом:

31.5.3 Interrupt
The USART interrupt line is connected on one of the internal sources of the Advanced Interrupt
Controller. Using the USART interrupt requires the AIC to be programmed first. Note that
it is not recommended to use the USART interrupt line in edge sensitive mode.


Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).
Go to the top of the page
 
+Quote Post
PrSt
сообщение Jun 6 2006, 13:16
Сообщение #8


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(gmax @ Jun 5 2006, 17:48) *
Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).

интересно, что значит "я конфигурирую НЕ ТАК"?
а как можно еще так то, если в даташите сказано конкретно как?
жутко интересно 8))


--------------------
Go to the top of the page
 
+Quote Post
gmax
сообщение Jun 6 2006, 14:39
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954



Цитата(PrSt @ Jun 6 2006, 16:16) *
Цитата(gmax @ Jun 5 2006, 17:48) *

Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).

интересно, что значит "я конфигурирую НЕ ТАК"?
а как можно еще так то, если в даташите сказано конкретно как?
жутко интересно 8))

В datasheet РЕКОМЕНДУЕТСЯ, а не СКАЗАНО конкретно как! А НЕ ТАК значит, что если в datasheet написано edge sensitive, то я конфигурирую НЕ ТАК, то есть level sensitive. wink.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 6 2006, 20:52
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(gmax @ Jun 6 2006, 17:39) *
В datasheet РЕКОМЕНДУЕТСЯ, а не СКАЗАНО конкретно как! А НЕ ТАК значит, что если в datasheet написано edge sensitive, то я конфигурирую НЕ ТАК, то есть level sensitive. wink.gif

А! понятно, у вас просто проблемы с переводом smile.gif
В даташите сказано, что НЕ рекомендуется использовать линию прерывания USART в edge sensitive режиме.

т.е. вы делаете как раз так, как там написано ;>
Go to the top of the page
 
+Quote Post
gmax
сообщение Jun 7 2006, 15:09
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 25-08-05
Из: Украина, Харьков
Пользователь №: 7 954



Цитата(defunct @ Jun 6 2006, 23:52) *
Цитата(gmax @ Jun 6 2006, 17:39) *

В datasheet РЕКОМЕНДУЕТСЯ, а не СКАЗАНО конкретно как! А НЕ ТАК значит, что если в datasheet написано edge sensitive, то я конфигурирую НЕ ТАК, то есть level sensitive. wink.gif

А! понятно, у вас просто проблемы с переводом smile.gif
В даташите сказано, что НЕ рекомендуется использовать линию прерывания USART в edge sensitive режиме.

т.е. вы делаете как раз так, как там написано ;>

Точно! smile.gif Не дочитал...
2 beer_barrior
проблема обнаружилась? озвучьте результаты, пожалуйста
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jun 8 2006, 04:20
Сообщение #12


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
проблема обнаружилась? озвучьте результаты, пожалуйста


чем дальше в лес - тем толще патизаны sad.gif
Провел время в разборе листингов,такое впечетление, что проблема в линкере, строка
Код
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS ] = (unsigned int) SysTimerInterrupt

в отдельно взятом файле interrupts.c честно пишет точку входа в прерывание в виде метки. В собранном main.lss эта метка подменяется на абсолютно левый адрес. Причем меняется в зависимости от режима компиляции, а закономерности я не могу найти sad.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post

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

 


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


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