ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
84157 Топик полностью
grau (22.03.2007 14:29, просмотров: 1) ответил Сергей Борщ на Может, но
еще вариант.. Можно кешировать обращения к регистрам. К примеру:
// 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 не сообразил, а кострукции из мануала (заккоментированы в коде) просто не работали. Насколько понимаю, они пытаются тупо бит прерывания менять. По поводу пропуска прерываний - не подумал..