Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Spurious Interrupt
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
xelax
Народ, кто как в своём софте реагирует на эти вектора? 07.gif

Как их корректно обрабатывать? И можно ли их избежать или их необходимо принимать как данность?

К стати в даташите написанно:
Код
The programmer must store the address of a spurious
interrupt handler in AIC_SPU as part of the application, to enable an as fast as possible return to
the normal execution flow. This handler writes in AIC_EOICR and performs a return from
interrupt.
aaarrr
Цитата(xelax @ Apr 3 2008, 11:50) *
Как их корректно обрабатывать?

Просто записать что-нибудь в AIC_EOICR. Ну, можно еще отметить факт возникновения этой ситуации для диагностических целей, хотя особого смысла это не имеет.

Цитата(xelax @ Apr 3 2008, 11:50) *
И можно ли их избежать или их необходимо принимать как данность?

Принимать необходимо всегда - иначе можно просто завесить процессор. В обычной жизни встречаются, как правило, только при использовании внешних прерываний.
xelax
Как раз на внешнем прерывании висит радиочип. smile.gif И программа периодически залетает в spurioos вектор.

внешнее прерывание настраиваю на срабатывание по фронту, то есть из трёх причин описанных в даташите две первых отметаются сразу.
Остаётся одна:
Код
• An interrupt occurs just a few cycles before the software begins to mask it, thus resulting in a
pulse on the interrupt source.


А внутренние источники прерывания (исключая Watchdog) могут такую подлянку подложить?
Есть у кого-нибудь такая инфа?

З.Ы. К стати настраиваю прерывания от всей внутренней перефирии по уровню (где-то такую рекоммендацию читал).
aaarrr
Стоит посмотреть, откуда именно программа вылетает в Spurious IRQ - нет ли там какого-нибудь криминала (ситуации, когда из-за действий основной программы возможен сброс разрешенного прерывания).
xelax
Цитата(aaarrr @ Apr 3 2008, 13:11) *
Стоит посмотреть, откуда именно программа вылетает в Spurious IRQ - нет ли там какого-нибудь криминала (ситуации, когда из-за действий основной программы возможен сброс разрешенного прерывания).


Как посмотреть из какого куска кода я попал в прерывание?
Как это сдеалть? Что-то пока не могу сообразить... laughing.gif
Сергей Борщ
Цитата(xelax @ Apr 3 2008, 12:39) *
Как это сдеалть? Что-то пока не могу сообразить... laughing.gif
Посмотреть, куда указывает LR_irq -4 в точке входа.
xelax
К стати, каким образом происходит сохранение контекста? Ведь spurious могут быть как irq так и fiq. Или для этой функции необходимо писать обёртку для сохранения и восстановления контекста?
aaarrr
Какое сохранение контекста? Достаточно оформить функцию как IRQ, и она будет прекрасно выполняться как в IRQ, так и в FIQ режимах.

UPD: Spurious FIQ быть не может.
xelax
Согласен, но у меня проект на gcc реализован, а тем есть известная бага при формировании пролога и эпилога функций, объявленных как IRQ.

Так вот и получается, что надо для этой функции рукописное сохранение и восстановление контекста делать.
aaarrr
Для этой функции надо делать точно такое же оформление, как и для других IRQ. Это обычное прерывание.
defunct
Цитата(aaarrr @ Apr 3 2008, 12:55) *
Для этой функции надо делать точно такое же оформление, как и для других IRQ. Это обычное прерывание.

Зачем?
Обычное да не совсем. Отличие от остальных в том, что оно ложное, значит обрабатывать его не надо.
Просто выход с мимимумом сохранения контекста.
Если в AIC_EOICR можно писать любое число (сигнал о завершении прерывания), то и сохранять нечего.
aaarrr
Цитата(defunct @ Apr 3 2008, 15:33) *
Обычное да не совсем.

Для процессора - самое обычное.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.