Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по лпц2148
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
_artem_
Содерживмое регистра VICDefVectAddr используется :
а. для загрузки VICVectAddr если совершившееся прерывание не векторное и не быстрое fiq
б. для прямого вызова спуриос обработчика прерываний

В случае а. Если мы собираемся вызвать функцию невекторного прерывания (из обработчика прерываний чей адрес записан в таблице векторов) ее декларация будет записываться в простом виде без атрибутики __irq.

В случае б. приведена однозначная декларация с приведенным выше аттрибютoм (как описывается в ан10414), так как при спуриос вызов пойдет напрямую в обход обработчика irq прерываний

Почему такая двухсмысленность в исполнении или это только моя фантазия?

Второй вопрос - нужно ли при невекторных и fiq быстрых прерываниях записывать что нибудь в VICVectAddr , для сброса контроллера перед выходом из обработчика прерываний?
etoja
Синтаксис объявления прерывания зависит от компилятора.
_artem_
Это понятно , только непонятно почему для одного случая я должен его обьявляь как функцию прерывания в то же время для другого это не требуется .
aaarrr
Цитата(_artem_ @ Dec 7 2007, 05:24) *
Почему такая двухсмысленность в исполнении или это только моя фантазия?

Почему двусмысленность? Если уж попали на вектор 0x18, то возвращаться всегда нужно специфическим образом.

Цитата(_artem_ @ Dec 7 2007, 05:24) *
Второй вопрос - нужно ли при невекторных и fiq быстрых прерываниях записывать что нибудь в VICVectAddr , для сброса контроллера перед выходом из обработчика прерываний?

По-идее, нет: FIQ всегда имеет высший приоритет, а невекторные прерывания - всегда низший.
Впрочем, невекторные прерывания использовать не приходилось, векторов хватало всегда smile.gif
_artem_
Спасибо за ответ.

Двухсмысленность в том что если VICDefVectAddr будет загружен адресом обработчика для спуриоус прерываний то этот обработчик должен декларироваться с атрибютом __irq.
А если также используются больше чем 16 прерываний то некоторые прерывания придется использовать как невекторные , что означает вызов этих прерываний через IRQ векторный обрабочик который прочтет адрес обрабочика невекторного прерывания из VICVectAddr (потому что при невекторном прерывании VICVectAddr содержит адрес из VICDefVectAddr, но он уже загружен адресом обработчика спуриоус, который можно по идее использоват для обработйки невекторных прерываний также ) и вызовет его как обычную функцию (в этом случае функция с атрибютом __irq будет вызвана из функции с тем же атрибютом).
Можно конечно же обойти путем сравнения адреса из VICVectAddr с VICDefVectAddr прежде чем вызвать функцию по адресу из VICVectAddr.

Конечно 16 прерываний это много , но чем черт не шутит ).


По моему ошибка в nxp аппноте (и в моем понимании функции прерываний ) где они задекларировали спуриоус обработчик как __irq хотя он таковым не должен быть.
aaarrr
Какая разница, векторное прерывание, или нет? В любом случае процессор окажется в режиме IRQ, и обработчик должен позаботиться о правильном выходе.
_artem_
Верно. В этом и была моя ошибка .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.