📄 isr.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 + -