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

Писать AIC_EOICR нужно обязательно.
Зависает возможно из-за того, что в обработчике прерывания вы не читаете регистр US_CSR для идентификации прерывания...
imho трабла не с AIC'ом в общем, а с тем, что AIC'у сообщается о завершении обработки прерывания, а USART'у - нет.
beer_warrior
Цитата
imho трабла не с AIC'ом в общем, а с тем, что AIC'у сообщается о завершении обработки прерывания, а USART'у - нет.

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

У меня сейчас складыватся впечетление, что я что-то упустил на уровне ядра - вроде бы не сохраняется контекст, из-за этого и проблемы: у функций стоит атрибут nacked и используются макросы
ISR_ENTRY и ISR_EXIT позаимствованые из примера с прерывниями.
Ключик компилятора -marm для всего или -mthumb-interworking для основной программы и -marm для файла с прерываниями - ситуация в любом случае одинаковая.
defunct
Цитата(beer_warrior @ Jun 5 2006, 07:44) *
У меня сейчас складыватся впечетление, что я что-то упустил на уровне ядра - вроде бы не сохраняется контекст, из-за этого и проблемы:....

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

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


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

все должно быть проще..
Сокращенный код обработчика usart'a был бы весьма кстати.
gmax
Цитата(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).
defunct
Цитата(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.
gmax
Цитата(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 по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).
PrSt
Цитата(gmax @ Jun 5 2006, 17:48) *
Прошу заметить, что я конфигурирую НЕ ТАК, как написано в datasheet. Хотя для PIT в datasheet по этому поводу никаких рекомендаций нет, а ведь именно он "останавливается" (не генерит прервыние), или "увеличивает частоту" (прерывание возникает постоянно).

интересно, что значит "я конфигурирую НЕ ТАК"?
а как можно еще так то, если в даташите сказано конкретно как?
жутко интересно 8))
gmax
Цитата(PrSt @ Jun 6 2006, 16:16) *
Цитата(gmax @ Jun 5 2006, 17:48) *

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

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

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

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

т.е. вы делаете как раз так, как там написано ;>
gmax
Цитата(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
проблема обнаружилась? озвучьте результаты, пожалуйста
beer_warrior
Цитата
проблема обнаружилась? озвучьте результаты, пожалуйста


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

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