еще вариант.. Можно кешировать обращения к регистрам. К примеру:
// interrupts.cpp
static volatile unsigned TmpIntEnable = 0;
static volatile unsigned IntDisableCnt = 0;
void EnableInterrupt()
{
//__enable_interrupt();
VICIntEnClr = ~0;
switch(IntDisableCnt)
{
case 0:
VICIntEnable = TmpIntEnable;
break;
case 1:
--IntDisableCnt;
VICIntEnable = TmpIntEnable;
break;
default:
--IntDisableCnt;
}
};
void DisableInterrupt()
{
//__disable_interrupt();
VICIntEnClr = ~0;
++IntDisableCnt;
};
bool IsIntDisa()
{
return (bool)IntDisableCnt;
};
void SetInterruptHandler(int SlotNum, // Number of slot to vector install
int Vector, // Number of vector to set
TIntHandler p // Pointer to sevice function
)
{
VICProtection = 0;
//DisableInterruptVector(Vector);
DisableInterrupt();
VICIntSelect&=~(1<<Vector);
(&VICVectAddr0)[SlotNum]=(DWORD)(void*)p;
(&VICVectCntl0)[SlotNum]=Vector|0x20;
EnableInterrupt();
};
void EnableInterruptVector(int v)
{
DisableInterrupt();
VICVectAddr = 0;
//VICIntEnable|=1<<v;
TmpIntEnable |= (1<<v);
EnableInterrupt();
};
void DisableInterruptVector(int v)
{
DisableInterrupt();
TmpIntEnable &= ~(1<<v);
VICIntEnClr=1<<v;
EnableInterrupt();
};
void ForceInterrupt(int v)
{
VICSoftInt = (1<<v);
};
void ClearInterrupt(int v)
{
VICSoftIntClr = (1<<v);
};
extern "C" {
// __irq __arm void VectInterruptHandler() {
void VectInterruptHandler() __irq{
TIntHandler p=(TIntHandler)VICVectAddr;
p();
VICVectAddr = 0;
};
};
Это все возникло по следующей причине: в keil функция main стартует в user mode. Как перейти в system не сообразил, а кострукции из мануала (заккоментированы в коде) просто не работали. Насколько понимаю, они пытаются тупо бит прерывания менять.
По поводу пропуска прерываний - не подумал..