#include "regs.h"
#include "common.h"
void do_irq(void)
{
void (*handler)(void) = NULL;//函数指针,函数的地址
if(VIC0ADDRESS)//这两个寄存器只能有一个非0
{
handler = (void *)VIC0ADDRESS;
}
else if(VIC1ADDRESS)
{
handler = (void *)VIC1ADDRESS;
}
VIC0ADDRESS = 0;
VIC1ADDRESS = 1;
if(handler)
{
handler();
}
handler = 0;
}
int irq_request(int num, void (*handler)(void))//用于设置enable和select以及对应的中断处理号(num)对应的中断处理函数(handler)地址放到相应的中断处理寄存器中
{
if(num >= 0 && num <= 31)
{
VIC0INTENABLE |= 1 << num;
VIC0INTSELECT &= ~(1 << num);
VIC0VECTADDR[num] = (unsigned int)handler;
}
else if(num >= 32 && num <= 63)
{
num -= 31;
VIC1INTENABLE |= 1 << num;
VIC1INTSELECT &= ~(1 << num);
VIC1VECTADDR[num] = (unsigned int)handler;
}
else
{
return -1;
}
__asm__ __volatile__(
"mrs r0,cpsr\n" //读cpsr的值
//"and r0,r0,#0xffffff7f\n" //修改,将cpsr第7位置0 ,其他位不变
"bic r0,r0,#0x80\n" //修改,将cpsr第7位置为0
"msr cpsr,r0\n" //写入修改后的cpsr的值
);
return 0;
}