isr.c

来自「基于S3C44b0的键盘LED接口设计」· C语言 代码 · 共 83 行

C
83
字号
/********************************************************************************
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 ClearISR_Interrupt(int vector)
{
#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] = NULL;

	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 + =
减小字号Ctrl + -
显示快捷键?