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

📄 isr.c

📁 ucos ii串口通讯程序
💻 C
字号:
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.5.12
\***************************************************************************/
/***************************************************************************\
    #说明:中断处理函数
    #接口函数
	----------------------------------  Bug  --------------------------------------

	----------------------------------  TODO list  --------------------------------------
	2004-5-12	对于邋IO口的多中断源的共享
	----------------------------------修正--------------------------------------

	2004-5-12	1、移植
				2、改变了中断函数的定义,添加了一个标志中断号的参数
				3、添加了void ISR_Init(void)函数定义,系统初始化中断的时候调用

\***************************************************************************/
#include "../inc/drv/register.h"
#include "isr.h"
#include "includes.h"
#include "../inc/sys/lib.h"
#include <string.h>

typedef struct{
	Interrupt_func_t InterruptHandlers;
	void* data;
}struct_InterruptFunc;

static struct_InterruptFunc InterruptFunc[MAXHNDLRS];

//#define GetISROffsetClr()	IDR_GETIRQ

int GetISROffsetClr()
{
	//计算中断的偏移地址,低位优先
	int i,ispr=VICIRQStatus;	//temp bit

	for(i=0; i<MAXHNDLRS; i++){
		if(ispr&0x1){
			return i;
		}
		ispr>>=1;
	}
	return i;
}

void ISR_Init(void)
{
	VICIntEnClr = 0xffffffff;	//disable all interrupt
	VICVectAddr = 0;	//write vector address
	VICIntSelect = 0;	//set all interrupt to irq

	memset(InterruptFunc, 0, sizeof(InterruptFunc));
}

void SetISR_Interrupt(int vector, void (*handler)(int, void*), void* data)
{
#if OS_CRITICAL_METHOD == 3
	OS_CPU_SR  cpu_sr;
#endif
	OS_ENTER_CRITICAL();

	if(vector>=MAXHNDLRS || vector<0)
		return;

//	tmp=rINTC_STAT;	//clear interrupt status
	InterruptFunc[vector].InterruptHandlers = handler;
	InterruptFunc[vector].data = data;

	VICIntEnable|= (1<<vector);	//enable interrupt

	OS_EXIT_CRITICAL();
}

void ISR_Handler(void)
{
	unsigned int IntOffset=GetISROffsetClr();	//得到中断向量的偏移地址
	if(IntOffset>=14)
		printk("@%d  ",IntOffset);
	if(IntOffset>=MAXHNDLRS)
		return;
	
	if(InterruptFunc[IntOffset].InterruptHandlers==NULL){
		VICVectAddr = 0;	//write vector address
		printk("Unexpected Interrupt %d occur\n", IntOffset);
		return;
	}
	
	OSIntEnter();
	 // Call interrupt service routine
	(*InterruptFunc[IntOffset].InterruptHandlers)(IntOffset, InterruptFunc[IntOffset].data);
	VICVectAddr = 0;	//write vector address
	OSIntExit();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -