⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.c

📁 uCOS-II 移植到ARM7上
💻 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 + -