#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; }