📄 isr.c
字号:
/*----------------------------------------------------------------------------------
#说明:中断处理函数
#接口函数
---------------------------------- Bug --------------------------------------
---------------------------------- TODO list --------------------------------------
----------------------------------修正--------------------------------------
2004-1-2 修正扩展中断的清楚标志的错误。未测试
-------------------------------------------------------------------------------------*/
#include "..\startup\44b.h"
#include "isr.h"
#include "def.h"
#include "includes.h"
void (*InterruptHandlers[MAXHNDLRS])(void)={NULL,};
void (*ExInt4567Handlers[4])(void)={NULL,};
static unsigned int exIntMask=0; //中断注册寄存器,是 1 的时候表示有中断注册了
void ExInt4567() //外部中断4567的共享函数
{
int i,exinpnd=rEXTINPND,tmp=1;//temp bit
exinpnd&=exIntMask;
for(i=0;i<4;i++){
if(exinpnd&tmp){
if(ExInt4567Handlers[i])
(*ExInt4567Handlers[i])();
rEXTINPND=tmp; //clear Extint bit
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){
return i-1;
}
tmp>>=1;
}
return -1;
}
void SetISR_Interrupt(int vector, void (*handler)(), int ExInt)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
if(vector>MAXHNDLRS || vector<0)
return;
if(vector==EINT4567_OFFSET){
if(rI_ISPR&BIT_EINT4567)
rI_ISPC=BIT_EINT4567;
rINTMSK&=(~BIT_EINT4567);
exIntMask|=(1<<ExInt);
InterruptHandlers[vector] = ExInt4567;
ExInt4567Handlers[ExInt] = handler;
}
else {
if(rI_ISPR&(1<<vector))
rI_ISPC=(1<<vector);
rINTMSK&=(~(1<<vector));
InterruptHandlers[vector] = handler;
}
OS_EXIT_CRITICAL();
}
void ISR_IrqHandler()
{
int IntOffset=GetISROffsetClr(); //得到中断向量的偏移地址
if(IntOffset<0)
return;
if(InterruptHandlers[IntOffset]==NULL)
return;
OSIntEnter();
(*InterruptHandlers[IntOffset])(); // Call interrupt service routine
rI_ISPC=(1<<IntOffset);
OSIntExit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -