Цитата(GetSmart @ Sep 12 2011, 15:11)

Да потому, что при вызове первого прерывания глобально прерывания запрещаются и их нужно ручками разрешать (после IENABLE), а потом запрещать (перед IDISABLE).
Сделал. Вторая версия кода:
Код
#define IENABLE __asm { MRS sysreg, SPSR; MSR CPSR_c, #SYS32Mode }
#define IDISABLE __asm { MSR CPSR_c, #(IRQ32Mode|I_Bit); MSR SPSR_cxsf, sysreg }
...
DWORD install_irq( DWORD IntNumber, void *HandlerAddr, DWORD Priority )
{
DWORD *vect_addr;
DWORD *vect_cntl;
VICIntEnClr = 1 << IntNumber;
if ( IntNumber >= VIC_SIZE )
{
return ( FALSE );
}
else
{
vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber*4);
vect_cntl = (DWORD *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + IntNumber*4);
*vect_addr = (DWORD)HandlerAddr;
*vect_cntl = Priority;
VICIntEnable = 1 << IntNumber;
return( TRUE );
}
}
...
void UARTHandler (void) __irq
{
IENABLE;
install_irq(MCI_INT, (void*)MCI_IRQHandler, HIGHEST_PRIORITY);//включаем прерывание
...
//тут происходит вызов функции, инициирующей срабатывание вложенного прерывания
...
VICIntEnClr = 1 << IntNumber;//отключаем прерывание
IDISABLE;
VICVectAddr = 0;
}
Все равно не работает