📄 isr_handle.c.svn-base
字号:
#include "API_interrupt.h"#include "global.h"
extern unsigned int *mask;
static __inline__ void ISR(int ISR_name)
{
DisableAllInterrupts();
OSIntNesting++;
if(interrupt_routine[ISR_name].devISR==2)
{ /*open high priority interrupt pin SIMASK=(~(0xFFFFFFFF>>ISR_name))*/
unsigned int tmp1=0xFFFFFFFF, tmp2=0xFFFFFFFF;
__asm__ __volatile__( "srw %2, %1"
"xor %0, %2, %3"
:"=m"(*mask)
:"r"(ISR_name),"r"(tmp1),"r"(tmp2));
}
EnableAllInterrupts();
unsigned int *reg;
interrupt_source *point;
point=interrupt_routine[ISR_name].next;
while(point)//interrupt handle
{
point->action();
point=point->next;
}
switch(ISR_name)// interrupt reponse
{
case 1:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x4FFFFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x4FFFFFFF);
break;
case 2:
reg=(unsigned int *) SIPEND;//debugger
*reg=((*reg)&0x8FFFFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x8FFFFFFF);
// printf("IRQ1:%d\n",*reg);//debugger
// printf("SIPEND is:%x\n",SIPEND);
break;
case 3:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x01FFFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x01FFFFFF);
// printf("Level 1:%d\n",*reg);
// printf("SIPEND is:%x\n",SIPEND);
break;
case 4:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x02FFFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x02FFFFFF);
// printf("IRQ2:%d\n",*reg);
// printf("SIPEND is:%x\n",SIPEND);
break;
case 5:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x04FFFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x04FFFFFF);
//printf("Level 2:%d\n",*reg);
// printf("SIPEND is:%x\n",SIPEND);
break;
case 6:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x08FFFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x08FFFFFF);
//printf("IRQ3:%d\n",*reg);
//printf("SIPEND is:%x\n",SIPEND);
break;
case 7:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x001FFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x001FFFFF);
// printf("Level 3:%d\n",*reg);
break;
case 8:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x002FFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x002FFFFF);
// printf("IRQ4:%d\n",*reg);
break;
case 9:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x004FFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x004FFFFF);
// printf("Level 4:%d\n",*reg);
break;
case 10:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x008FFFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x008FFFFF);
// printf("IRQ5:%d\n",*reg);
break;
case 11:
reg=(unsigned int *) SIPEND;//debugger
*reg=((*reg)&0x0001FFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x0001FFFF);
// printf("Level 5:%d\n",*reg);
break;
case 12:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x0002FFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x0002FFFF);
// printf("IRQ6:%d\n",*reg);
break;
case 13:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x0004FFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x0004FFFF);
// printf("Level 6:%d\n",*reg);
break;
case 14:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x0008FFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x0008FFFF);
// printf("IRQ7:%d\n",*reg);
break;
default:
reg=(unsigned int *) SIPEND;
*reg=((*reg)&0x0008FFFF);
reg=(unsigned int *) UIPEND;
*reg=((*reg)&0x2FFFFFFF);
// printf("Level7-31 :%d\n",*reg);
break;
};
if((interrupt_routine[ISR_name].devISR==2)/*&&(OSTCBCur->preempt) debugger*/)
{ OSIntExit(); }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -