|
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
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 23)
|
Jun 10 2012, 18:04
|

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

|
Цитата(aaarrr @ Jun 10 2012, 20:53)  Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса. Это могут читать дети! Ваш совет применим, если индексы представлены типами данных, которые на процессоре атомарны. В случае, когда индексы многобайтные, а компилятор выполняет операцию выборки или присваивания несколькми командами - всё будет работать не так как ожидает программист.
Сообщение отредактировал Genadi Zawidowski - Jun 10 2012, 18:31
|
|
|
|
|
Jun 11 2012, 22:31
|
Участник

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

|
Цитата(jcxz @ Jun 10 2012, 21:17)  Смотрим на название форума  В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными... Кстати, про атомарность этих операций на ARM'е я провтыкал самым позорным образом  Да-а, трудно иногда скакать, то AVR/PIC, то ARM... Убрал запрет прерываний, а сделал просто двойное чтение: если результаты разнятся - перечитать. А выходит и это лишнее.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|