46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "irq_vector.h"
 | 
						||
#include "base.h"
 | 
						||
#include "mymem.h"
 | 
						||
#include "rthw.h"
 | 
						||
 | 
						||
extern int isr_vector_start;
 | 
						||
extern int isr_vector_end;
 | 
						||
 | 
						||
 | 
						||
static void *g_base=0;
 | 
						||
static void **g_irq_vector=0;
 | 
						||
//void *g_irq_vector[0x1ac] __attribute__((at(0x20000200)));
 | 
						||
 | 
						||
void irq_vector_init(void)
 | 
						||
{
 | 
						||
	int size=(int)&isr_vector_end-(int)&isr_vector_start;
 | 
						||
	if(g_irq_vector==0)
 | 
						||
	{
 | 
						||
		//向量表必须0x200字节对齐,这里申请大于0x200字节的内存,然后所申请的内存一定有0x200对齐的部分
 | 
						||
		g_base=mymalloc((int)size+0x200);
 | 
						||
		g_irq_vector=(void **)(((int)g_base+0x200)&0xfffffe00);
 | 
						||
		mymemcpy(g_irq_vector,(void *)&isr_vector_start,size);
 | 
						||
		rt_base_t level=rt_hw_interrupt_disable();
 | 
						||
		NVIC_SetVectorTable(NVIC_VectTab_RAM,(u32)g_irq_vector-NVIC_VectTab_RAM);		
 | 
						||
		rt_hw_interrupt_enable(level);
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//设置中断函数,同时返回旧的中断函数,irq_fun==0时不做修改
 | 
						||
void *irq_vector_set_irq(int irq_num,void *irq_fun)
 | 
						||
{
 | 
						||
	void *ret=0;
 | 
						||
	irq_num+=16;//前16个中断是内核中断,中断号为负数
 | 
						||
	rt_base_t level=rt_hw_interrupt_disable();
 | 
						||
	ret=g_irq_vector[irq_num];
 | 
						||
	if(irq_fun)
 | 
						||
		g_irq_vector[irq_num]=irq_fun;
 | 
						||
	rt_hw_interrupt_enable(level);
 | 
						||
	return ret;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 |