Цитата(BlackHead @ Mar 31 2009, 15:56)

Вылетаю в Abort_Handler !
Видимо, программа обращается по запрещенному адресу ?!
Странный обработчик прерывания....
Код
irq __arm void Timer0_Handler(void)
{
T0IR = 1; // сброс флага прерывания
counter++;
VICADDRESS = 0;
}
Должно быть так (вроде бы):
Код
//Функция обработки прерывания IRQ
__arm __irq void IRQ_Handler(){
void (*pISR)();
pISR=(void(*)())VICADDRESS;
(*pISR)();
VICADDRESS=0;
}
Потом что за функция - install_handler? Какие то манипуляции .... Ничего не понял, да и не разбирался. А где настройка контроллера прерываний - VIC?
Что-то типа этого:
Код
//Настройка VIC на обработку прерываний от таймера (TIMER0)
void VIC_init(){
void (*pIRQ)();
VICINTENCLEAR = 0xFFFFFFFF;
VICINTENABLE = (1UL << VIC_TIMER0);
pIRQ=timer_isr;
VICVECTADDR4=(unsigned long)pIRQ;
}
Это куски из моей первой программы, правда для LPC2478, но они вроде с LPC23xx похожи в этом плане.
Светодиод мигал как миленький. Фунция timer_isr описана где-то дальше, в ней собственно и делаете все, что нужно (очистка флага прерывания от таймера, включить-выключить светодиод и т.д.).
Советую почитать User Manual, при контроллер прерываний VIC.
Кстати, вещи типа
Код
vec |= 0xea000000; /* add opcode for B instruction */
делать вроде бы не нужно. При объявлении(определении) __arm __irq функции компилятор поместит в таблице векторов исключений команду перехода на нее.
Идея тут вообщем такая - описываете функцию __arm __irq void IRQ_Handler(), ничего с таблицей векторов мудрить не надо. В этой функции - читаете из VICADDRESS (регистр в VIC - см. доку) адресс попрограммы обработки прерывания и вызываете ее. Если источников прерываний несколько, то VIC выставит нужный адресс , для каждого источника прерывания свой, с учетом приоритетов и т.д. Естественно предварительно необходимо настроить сам VIC - разрешить нужные прерывания, расставить приоритеты, прописать адреса обработчиков прерываний.