2025-06-27 00:32:57 +08:00
|
|
|
|
#include "irq_vector.h"
|
|
|
|
|
#include "base.h"
|
|
|
|
|
#include "mymem.h"
|
|
|
|
|
#include "rthw.h"
|
|
|
|
|
|
2025-06-29 11:20:46 +08:00
|
|
|
|
extern int isr_vector_start;
|
|
|
|
|
extern int isr_vector_end;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void *g_base=0;
|
|
|
|
|
static void **g_irq_vector=0;
|
|
|
|
|
//void *g_irq_vector[0x1ac] __attribute__((at(0x20000200)));
|
|
|
|
|
|
|
|
|
|
void irq_vector_init(void)
|
|
|
|
|
{
|
2025-06-29 11:20:46 +08:00
|
|
|
|
int size=(int)&isr_vector_end-(int)&isr_vector_start;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if(g_irq_vector==0)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x200<30>ֽڶ<D6BD><DAB6>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x200<30>ֽڵ<D6BD><DAB5>ڴ棬Ȼ<E6A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>0x200<30><30><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
2025-06-29 11:20:46 +08:00
|
|
|
|
g_base=mymalloc((int)size+0x200);
|
2025-10-19 20:11:51 +08:00
|
|
|
|
g_irq_vector=(void **)(((int)g_base+0x1ff)&0xfffffe00);
|
2025-06-29 11:20:46 +08:00
|
|
|
|
mymemcpy(g_irq_vector,(void *)&isr_vector_start,size);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
rt_base_t level=rt_hw_interrupt_disable();
|
2025-10-19 20:11:51 +08:00
|
|
|
|
NVIC_SetVectorTable(NVIC_VectTab_RAM,(u32)g_irq_vector-NVIC_VectTab_RAM);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
rt_hw_interrupt_enable(level);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>жϺ<D0B6><CFBA><EFBFBD>,ͬʱ<CDAC><CAB1><EFBFBD>ؾɵ<D8BE><C9B5>жϺ<D0B6><CFBA><EFBFBD><EFBFBD><EFBFBD>irq_fun==0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void *irq_vector_set_irq(int irq_num,void *irq_fun)
|
|
|
|
|
{
|
|
|
|
|
void *ret=0;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
irq_num+=16;//ǰ16<31><36><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ں<EFBFBD><DABA>жϣ<D0B6><CFA3>жϺ<D0B6>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|