Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ISR & VIC мутная документация +
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ken@t
sad.gif Кто так пишет юзер мануал... Конечно за пару часиков, разобрался с программированием VIC и перываниями , но.. остался осадок... blush.gif
И так, уарт подключен к каналу 6 ВИКа . я так понимаю , что

VICIntSelect_bit.INT6 &=~1;
// Тип вектора прерывания для слота 6 (UART) IRQ !
VICVectAddr0 = (unsigned int)&UART0Interrupt;
// Адрес процедуры обработки прерывания, так как пишем в 0 вектор - имеем самый высокий приоритет.
//
VICVectCntl0_bit.NUMBER = VIC_UART0;
// Вот здесь /\ на 0 вектрое имеем прерывание от канала 6 ?
VICVectCntl0_bit.ENABLED = 1;
// Прерывание разрешено. канал 6 за UART 0
VICIntEnable_bit.INT6 = 1;
// Прерывание разрешено

В результате мы имеем 15 векторов от вика и 27 различных прерываний от перефирии, то есть одновременно только половину можем поиметь реальных , а как же тогда остальные ? причём часть из них под ФИК...

Далее совсем мутно для меня, есть прерывание SWI и в тоже время от вика SWI ( Канал 1 )
Какие комманды отвечают за их генерацию ?

Вектор по умолчанию
VICDefVectAddr = (unsigned int)&DefDummyInterrupt;
В каких случаях вызывается ? в тех, когда произошло прерывание и нет вектора закреплённого за каналом ? В таком случае это программная ошибка или намеренно обработка разных прерываний в одной функции , тогда мне не понятно как это запрограммировать...

вот обработка irq
{
void (*interrupt_function)();
unsigned int vector;

vector = VICVectAddr; // Получить адрес вектора прерывания
interrupt_function = (void(*)())vector; // преобразовать в функцию
(*interrupt_function)(); // Вызвать функцию векторного прерывания

VICVectAddr = 0; // Очистить вектор прерывания в VIC.

}

а как сделать реентерабельность прерываний?

сенькс за ответы..
aaarrr
Скачайте на arm.com VIC Technical Reference Manual - там все очень подробно расписано.
DASM
ну да, явные вектора можно только 16-ти источникам задать
Остальные станут (если использованы) non-vectored. В этом случае в ISR в VicVectAdrr прочтем значение из VICDefVectAddr. Ну а там поллингом. Хотя ни разу не видел, чтобы кто-то 16 прерываний умудрился забить. Да, кстати не забываем, что IRQ вектор у АРМа все таки один, и уже через него прыгаем по VICVectAddr
Реентерабельность - сразу очищаем VICVectAddr и разрешаем прерывания заново, что тут сложного..
MiklPolikov
Правильно ли я понимаю назначение регистров VICDefVectAddr и VICVectAddr в LPC2148 ? ?

VICDefVectAddr :
Если прерывание разрешено везде но не включен ни один VICVectCntl0-15 , то управление передаётся функции , адрес которой записан в VICDefVectAddr . так ?


VICVectAddr :
После возникновения прерывания обработчик должен прочитать из VICVectAddr адрес , на который следует передти ? В кейле под отладкой , как только программа попадает в
обработчик смотрю значение VICVectAddr , там всё время 0 . Почему ? Потому что это значение уже где-то прочиталось в каком-то ассемблерном коде и только после этого программа
попала в мой обработчик, написанный на С ? Так ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.