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

 
 
 
Reply to this topicStart new topic
> Непонятная проблема с прерываниями ARM7 Atmel'a, Через некоорое время перестает вызываться обработчик
Shein
сообщение Jan 21 2011, 15:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Доброго времени суток, коллеги.

Итак, ситуация:
Контроллер AT91RM3400.
используются прерывания:
FIQ - по отрицательному фронту на соответствующей ноге контроллера.
таймер - вызывается каждые 100мкс. Обработчик порядка 15-20мкс.
системній таймер - период порядка 250мс.
UART's - прерывания на прием/передачу с 0 приоритетом. (работают нормально)

Все замечательно работало достаточно длительное время.
Сейчас понадобилось внести некоторые доработки, в результате обработчик таймера перестает выполняться через несколько минут работы программы. При этом FIQ, системный таймер и UART'ы продолжают выполняться нормально.
Предполагаю причина в том, что раньше обработчик FIQ выполнялся порядка 80-85мкс. После дополнения, стал иногда выполняться до 103-105мкс. Поставив на вход и выход из обоих обрабочиков дергание ножками, вижу что FIQ может прерывать обработчик таймера.
Поймать непосредственно момент пропадания прерываний таймера осциллографом не удалось. Мне кажется, что это происходит когда FIQ прерывает обработчик таймера, и новое прерывание таймера приходит когда FIQ еще не вернул управление. Может такое быть или надо искать причину в другом?

JTAG или иным отладчиком "залезть внутрь" и посмотреть что происходит возможности нет.

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

Рад буду любым идеям по решению данной проблемы.

Да, забыл - в sturtup на оба вектора стоит
LDR PC,[PC,#-0XF20]
т.е. обработка идет через AIC.

Сообщение отредактировал Shein - Jan 21 2011, 15:55
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2011, 17:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Прерывание от таймера, случайно, не по фронту срабатывает?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 21 2011, 17:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Пропуск прерываний таймера не есть причина для зависания, если только как-то специально не постарались написать.
Смотрите для начала просто размеры стеков и наползание FIQ стека на чужой.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Shein
сообщение Jan 22 2011, 14:08
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(aaarrr @ Jan 21 2011, 19:45) *
Прерывание от таймера, случайно, не по фронту срабатывает?

Да по фронту. В битах AIC_SRCTYPE соответствующего регистра AIC_SMR устанавливается значение 3

Цитата(zltigo @ Jan 21 2011, 19:47) *
Пропуск прерываний таймера не есть причина для зависания, если только как-то специально не постарались написать.

Я тоже так думаю. Но уом пока не понимаю что может пиводить к прекращению вызовов обработчика.
Цитата(zltigo @ Jan 21 2011, 19:47) *
Смотрите для начала просто размеры стеков и наползание FIQ стека на чужой.

Стеки увеличил первым делом. Видимого эффекта не дало. smile3046.gif Да и при наползании стеков, мне кажется, было бы более неадекватное поведение программы. FIQ может накладываться и на другие прерывания, хоть и с меньшей вероятностью т.к. они реже. Но глюк наблюдается именно с таймером.
Все же надо будет сделать контроль переполнения для FIQ и IRQ стеков...

Сообщение отредактировал Shein - Jan 22 2011, 14:10
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 22 2011, 17:37
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Shein @ Jan 22 2011, 17:08) *
Да по фронту. В битах AIC_SRCTYPE соответствующего регистра AIC_SMR устанавливается значение 3

...пока не понимаю что может пиводить к прекращению вызовов обработчика.

Теряете где-то фронт, скорее всего. Переставьте на срабатывание по уровню. Смысла работать с внутренними источниками прерывания по фронту в 99.9% случаев нет ни малейшего.
Go to the top of the page
 
+Quote Post
Shein
сообщение Jan 24 2011, 13:39
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(aaarrr @ Jan 22 2011, 19:37) *
Теряете где-то фронт, скорее всего. Переставьте на срабатывание по уровню. Смысла работать с внутренними источниками прерывания по фронту в 99.9% случаев нет ни малейшего.

sm.gif ну наверное просто привычка срабатывает - ставить срабатывание по фронту. А пропуск фронта может приводить к нарушению логики работы AIC? Ну т.е что он перестанет реагировать на это прерывание?
На данный момент проблема была решена обходным путем: после определенных манипуляций снова уменьшено время обработки FIQ. Но решение-то все равно интересно найти sm.gif
Попробую поставить по уровню.

Добавлено: Хм... Действительно, поставил по уровню. проблема с пропаданиями ушла. Возможно и теряется какой-то тик таймера, в моем случае это не так критично, главное что он не пропадает насовсем.

Сообщение отредактировал Shein - Jan 24 2011, 14:43
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 24 2011, 15:11
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Shein @ Jan 24 2011, 16:39) *
А пропуск фронта может приводить к нарушению логики работы AIC? Ну т.е что он перестанет реагировать на это прерывание?

Разумеется. Достаточно по каким-либо причинам не снять источник прерывания перед выходом из обработчика, или же по небрежности сбросить его вручную записью в ICCR, чтобы прерывание больше никогда не регистрировалось AIC'ом.
Для работы по фронту надо иметь веские основания и писать код предельно внимательно.
Go to the top of the page
 
+Quote Post
Shein
сообщение Jan 24 2011, 17:47
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(aaarrr @ Jan 24 2011, 17:11) *
Разумеется. Достаточно по каким-либо причинам не снять источник прерывания перед выходом из обработчика, или же по небрежности сбросить его вручную записью в ICCR, чтобы прерывание больше никогда не регистрировалось AIC'ом.
Для работы по фронту надо иметь веские основания и писать код предельно внимательно.

Век живи - век учись. Спасибо за помощь, впредь буду знать.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 24 2011, 20:44
Сообщение #9


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Самое удивительное, что про эту особенность (прерывания от внутренних устройств только по уровню) Atmel'овских процессоров на нашем форуме уже столько раз писалось. Ан нет. Поиском пользоваться ни в какую.
Go to the top of the page
 
+Quote Post
Shein
сообщение Jan 25 2011, 08:18
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(sergeeff @ Jan 24 2011, 22:44) *
Самое удивительное, что про эту особенность (прерывания от внутренних устройств только по уровню) Atmel'овских процессоров на нашем форуме уже столько раз писалось. Ан нет. Поиском пользоваться ни в какую.

Охотно верю что я не один такой sm.gif Поиком пользовался (возможно плохо, но все же). Просто проблемы с одной и той же причиной кождый может описать по своему. Зачастую трудно вычленить что имено ты ищешь. Сейчас, зная уже причину, гораздо проще найти что об этом уже писалось но уже не нужно. sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2011, 08:36
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sergeeff @ Jan 24 2011, 22:44) *
Самое удивительное, что про эту особенность (прерывания от внутренних устройств только по уровню) Atmel'овских процессоров на нашем форуме уже столько раз писалось.
Самое интересное, что сам Атмел про эту особенность ничего не знает. Более того, в описании они явно указывают:
QUOTE
The internal interrupt sources wired on the interrupt outputs of the embedded peripherals can be programmed either in level-sensitive mode or in edge-triggered mode. The active level of the internal interrupts is not important for the user.
Давайте разберемся, каким образом пропуск фронта прерывания при корректной обработке остальных источников может вызвать "отваливание" обработчика. Я не вижу объективных причин, возможно я чего-то недопонимаю.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 25 2011, 10:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Сергей Борщ @ Jan 25 2011, 11:36) *
Давайте разберемся, каким образом пропуск фронта прерывания при корректной обработке остальных источников может вызвать "отваливание" обработчика. Я не вижу объективных причин, возможно я чего-то недопонимаю.

Две возможных причины я указал:
1. Источник прерывания не был снят в обработчике. Линия осталась в активном уровне, никаких фронтов на ней уже не будет.
2. "Случайная" запись ICCR при активном прерывании приведет к тем же последствиям.

В обоих случаях виноват, разумеется, код и его автор. Но частота возникновения подобных "граблей" почему-то совсем не удивляет.
Если уж человек не задается вопросом зачем именно ему нужно прерывание именно по фронту, то не стоит ждать и тщательного прогнозирования последствий такого неосознанного выбора sad.gif
Go to the top of the page
 
+Quote Post

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

 


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


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