📄 isr.c
字号:
#include "44b.h"
#include "isr.h"
#include "def.h"
void (*InterruptHandlers[MAXHNDLRS])(void);
void (*ExInt4567Handlers[4])(void);
void ExInt4567() //外部中断4567的共享函数
{
int i,exinpnd=rEXTINPND,tmp=1;//temp bit
for(i=0;i<4;i++){
if(exinpnd&tmp){
rEXTINPND=tmp; //clear Extint bit
rI_ISPC=(1<<4); //clear i_ispc
(*ExInt4567Handlers[i])();
break;
}
tmp<<=1;
}
}
int GetISROffsetClr()
{
//计算中断的偏移地址,高位优先
int i,ispr=rI_ISPR,tmp=1<<(MAXHNDLRS-1);//temp bit
for(i=MAXHNDLRS;i>0;i--){
if(ispr&tmp){
rI_ISPC=tmp;
return i-1;
}
tmp>>=1;
}
return -1;
}
void SetISR_Interrupt(int vector, void (*handler)(), int ExInt)
{
if(vector==EINT4567_OFFSET){
InterruptHandlers[vector] = ExInt4567;
ExInt4567Handlers[ExInt] = handler;
}
else {
InterruptHandlers[vector] = handler;
}
}
void ISR_IrqHandler()
{
int IntOffset=GetISROffsetClr(); //得到中断向量的偏移地址
//OSIntEnter();
(*InterruptHandlers[IntOffset])(); // Call interrupt service routine
//OSIntExit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -