📄 isr.c
字号:
/********************************************************************************
NAME:ISR.C 中断处理函数 接口函数
Modified by WangZengzhi 2008.6
*********************************************************************************/
#include "..\inc\WOPTIONS.H"
#include "..\ucos\includes.h"
#include "..\porting\port.h"
/*********************************************************************************/
void (*InterruptHandlers[MAXHNDLRS])(void)={NULL,};
/*********************************************************************************/
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(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 + -