Files
player/Project/Src/MyApp/irq_vector.c
2025-10-19 20:12:24 +08:00

46 lines
1.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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+0x1ff)&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;
}