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

📄 isr.c

📁 在S3C44b0上移植ucos并实现哲学家就餐问题的演示
💻 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 + -