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

 
 
> ARM7 от Atmel. Запрет прерываний., почему он заходит в Spurious Interrupt
Shein
сообщение Jun 8 2012, 14:17
Сообщение #1


Участник
*

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



Доброго всем времени суток.
Столкнулся с таким явлением как вызов обработчика Spurious Interrupt.
Суть вопроса:
Работа с UART через контроллер PDC. Обрабатываются прерывания END_RX и END_TX. Используются два кольцевых буфера, т.е. прием или передача по PDC идет непрерывно. Фактически работа с индексами этих буферов идет и из прерываний, и из основной программы.
Логично, что когда я, например, читаю из приемного буфера, то при обращении к индексам, запрещаю прерывания по приему END_RX. Аналогично, при записи в передающий буфер, при обращении к индексам, запрещаются прерывания передатчика END_TX.
Столкнулся с тем, что при интенсивном обмене данными, программа иногда залетает в Spurious Interrupt. Согласно даташиту, это происходит, если контроллер AIC выдал запрос на прерывание ядру, но на момент чтения вектора обработчика, запрос на прерывание уже был снят.
В процессе отладки программы эта версия абсолютно подтвердилась. Вход в Spurious Interrupt происходит если запрос на прерывание контроллеру AIC пришел в момент обработки инструкции запрета прерывания от приемника или передатчика. Соответственно запрет отрабатывается, бит interrupt pending снимается, и когда ядро читает вектор обработчика из AIC, получается что прерывания-то уже нет.

Собственно вопрос: это нормальная ситуация? Раньше у меня стояла заглушка (бесконечный цикл) на Spurious Interrupt и на всех неиспользуемых векторах в AIC. Когда на Spurious Interrupt поставил обработчик в котором просто формируется подтверждение (запись в AIC_EOICR) программа, в общем стала нормально работать. Но вызовы Spurious таки иногда наблюдаются. Вот я и думаю, оставить как есть, еле же есть некий корректный механизм, как запрещать прерывание без возникновения данного эффекта?
P.S. В догонку: наблюдал это явление на двух процессорах AT91RM3400 и AT91SAM7X256. Картина абсолютно идентичная.

Сообщение отредактировал Shein - Jun 8 2012, 14:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jun 10 2012, 16:53
Сообщение #2


Гуру
******

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



Жарко у вас тут sm.gif

Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса.
Сам долго пользовался подобной реализацией, но потом все же отказался - ущерб от кратковременного запрета прерываний мизерный, а вот незадействованный элемент FIFO раздражает сильно.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 10 2012, 18:04
Сообщение #3


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(aaarrr @ Jun 10 2012, 20:53) *
Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса.

Это могут читать дети! Ваш совет применим, если индексы представлены типами данных, которые на процессоре атомарны.
В случае, когда индексы многобайтные, а компилятор выполняет операцию выборки или присваивания несколькми командами -
всё будет работать не так как ожидает программист.

Сообщение отредактировал Genadi Zawidowski - Jun 10 2012, 18:31
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2012, 18:20
Сообщение #4


Гуру
******

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



Цитата(Genadi Zawidowski @ Jun 10 2012, 22:04) *
Это могут читать дети!

Если "дети" пишут реализацию FIFO, то такие грабли только на пользу. Как заметили уже, на ARM такое придется делать специально.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Shein   ARM7 от Atmel. Запрет прерываний.   Jun 8 2012, 14:17
- - aaarrr   Цитата(Shein @ Jun 8 2012, 18:17) Собстве...   Jun 8 2012, 14:50
- - Lotor   Эти прерывания типичны не только для атмелов, мне ...   Jun 9 2012, 06:55
- - jcxz   Цитата(Shein @ Jun 8 2012, 20:17) Вот я и...   Jun 9 2012, 06:56
|- - Shein   Народ, спасибо всем большое! Вы развеяли мои ...   Jun 10 2012, 13:46
- - Aaron   Если я не ошибаюсь, там же можно два буфера для пе...   Jun 9 2012, 09:29
- - prottoss   А если вот такая ситуация к примеру: 1. Фоновый пр...   Jun 10 2012, 14:15
|- - jcxz   Цитата(prottoss @ Jun 10 2012, 20:15) А е...   Jun 10 2012, 15:53
||- - prottoss   Цитата(jcxz @ Jun 10 2012, 21:53) Каждый ...   Jun 10 2012, 15:56
||- - jcxz   Читайте внимательнее: Цитата(jcxz @ Jun 10 20...   Jun 10 2012, 16:02
|||- - prottoss   Цитата(jcxz @ Jun 10 2012, 22:02) Читайте...   Jun 10 2012, 16:05
||- - jcxz   Цитата(jcxz @ Jun 10 2012, 21:53) Каждый...   Jun 10 2012, 16:07
||- - prottoss   Цитата(jcxz @ Jun 10 2012, 22:07) Ваши кр...   Jun 10 2012, 16:16
||- - jcxz   Цитата(prottoss @ Jun 10 2012, 22:16) Еще...   Jun 10 2012, 16:22
|- - MaslovVG   Цитата(prottoss @ Jun 10 2012, 18:15) А е...   Jun 10 2012, 16:17
|- - prottoss   Цитата(MaslovVG @ Jun 10 2012, 22:17) Зде...   Jun 10 2012, 16:24
|- - jcxz   Разруливается это двумя индексами - у каждого проц...   Jun 10 2012, 16:32
- - jcxz   Только когда пишет один процессор, а читает - друг...   Jun 10 2012, 17:11
|- - aaarrr   Цитата(jcxz @ Jun 10 2012, 21:11) Только ...   Jun 10 2012, 17:17
- - jcxz   Смотрим на название форума В ARM все 8-/16-/32-ра...   Jun 10 2012, 18:17
|- - Shein   Цитата(jcxz @ Jun 10 2012, 21:17) Смотрим...   Jun 11 2012, 22:31


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

 


RSS Текстовая версия Сейчас: 6th September 2025 - 10:51
Рейтинг@Mail.ru


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