|
ARM7 от Atmel. Запрет прерываний., почему он заходит в Spurious Interrupt |
|
|
|
Jun 8 2012, 14:17
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jun 10 2012, 14:15
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
А если вот такая ситуация к примеру: 1. Фоновый процесс считывает в регистр индекс, дабы увеличить его на 1 с целью записать в FIFO новый байт для отправки. 3. Возникает прерывание по отправке данных. Считывается, опять же индекс из памяти дабы уменьшить индекс FIFO, так как очередной байт отправлен. 4. Декрементированый индекс записывается в память. Обработчик прерывания завершается. 5. Фоновый процесс инкрементирует индекс и записывает его в память. Как Вам ситуация?  ИМХО, запрещать прерывание нужно обязательно перед записью в буфер.
--------------------
|
|
|
|
Сообщений в этой теме
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 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 aaarrr Жарко у вас тут
Действительно, запрещать прерыва... Jun 10 2012, 16:53 jcxz Только когда пишет один процессор, а читает - друг... Jun 10 2012, 17:11  aaarrr Цитата(jcxz @ Jun 10 2012, 21:11) Только ... Jun 10 2012, 17:17 Genadi Zawidowski Цитата(aaarrr @ Jun 10 2012, 20:53) Дейст... Jun 10 2012, 18:04  jcxz Смотрим на название форума
В ARM все 8-/16-/32-ра... Jun 10 2012, 18:17   Shein Цитата(jcxz @ Jun 10 2012, 21:17) Смотрим... Jun 11 2012, 22:31  aaarrr Цитата(Genadi Zawidowski @ Jun 10 2012, 22... Jun 10 2012, 18:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|