📄 sys_isr.s
字号:
//=========================================================// 文 件 名: Sys_isr.S// 功能描述: 中断向量处理文件// 使用时,用户不需要修改此文件中的内容// 维护记录: 2007年1月11日 V1.0 by hongyan.Feng// 2007年10月30日 V2.0 by Lijian (Add some registers to be saved)//=========================================================#define SP r0#define AT r1#define BP r2#define LR r3#define A0 r4#define A1 r5#define A2 r6#define A3 r7#define T0 r8#define T1 r9#define T2 r10#define T3 r11#define S0 r12#define S1 r13#define S2 r14#define S3 r15#define S4 r16#define S5 r17#define S6 r18#define S7 r19#define S8 r20#define S9 r21#define T4 r22#define T5 r23#define T6 r24#define T7 r25#define T8 r26#define T9 r27#define R28 r28#define JP r29#define K0 r30#define K1 r31// CP0 register define#define CP0_STATUS cr0#define CP0_COND cr1#define CP0_CAUSE cr2#define CP0_EPC cr5#define CP0_EXCPVEC cr3#define CP0_CCR cr4#define CP0_BADVA cr6#define CP0_WIRE cr7#define CP0_INDEX cr8#define CP0_CONTEXT cr9#define CP0_RANDOM cr10#define CP0_ENTRYHI cr11#define CP0_ENTRYLO cr12#define CP0_FMARLO cr13#define CP0_FMARHI cr14#define CP0_FMCR cr15#define CP0_FFMR cr16#define CP0_LLADDR cr17#define CP0_PREV cr18#define CP0_DREG cr29#define CP0_DEPC cr30#define CP0_DSAVE cr31#define SPR_HI sr1#define SPR_LO sr2//specification define#define SR_CNT sr0#define SR_LCR sr1#define SR_SCR sr2#define STACK_SIZE 32/* uC/OS-specific stuff from here on.. */#define E_SP 0*4#define E_AT 1*4#define E_BP 2*4#define E_LR 3*4#define E_A0 4*4#define E_A1 5*4#define E_A2 6*4#define E_A3 7*4#define E_T0 8*4#define E_T1 9*4#define E_T2 10*4#define E_T3 11*4#define E_S0 12*4#define E_S1 13*4#define E_S2 14*4#define E_S3 15*4#define E_S4 16*4#define E_S5 17*4#define E_S6 18*4#define E_S7 19*4#define E_S8 20*4#define E_S9 21*4#define E_T4 22*4#define E_T5 23*4#define E_T6 24*4#define E_T7 25*4#define E_T8 26*4#define E_T9 27*4#define E_R28 28*4#define E_JP 29*4#define E_K0 30*4#define E_K1 31*4#define E_CP0_STATUS 32*4#define E_CP0_COND 33*4#define E_CP0_CAUSE 34*4#define E_CP0_EPC 35*4#define E_SPR_HI 36*4#define E_SPR_LO 37*4#define E_SR_CNT 38*4#define E_SR_LCR 39*4#define E_SR_SCR 40*4#define E_SIZE 41*4 /* must be even */.section .exception_vec,"ax" //定义异常中断段,在*.ld中已经定义了其起始地址为0xa00001fc//=========================================================// 定义两个软件中断向量入口//=========================================================.align 2norm_debug_vec: //Normal debug异常向量入口 j norm_debug_service.align 2general_vec: //General异常向量入口 j general_service//=========================================================// 定义63个硬件中断向量入口//=========================================================.align 2int1_vec: //中断向量IRQ1入口 j int_service //调用int_service函数.align 2int2_vec: //中断向量IRQ2入口 j int_service //调用int_service函数.align 2int3_vec: //中断向量IRQ3入口 j int_service //调用int_service函数.align 2int4_vec: //中断向量IRQ4入口 j int_service //调用int_service函数.align 2int5_vec: //中断向量IRQ5入口 j int_service //调用int_service函数.align 2int6_vec: //中断向量IRQ6入口 j int_service //调用int_service函数.align 2int7_vec: //中断向量IRQ7入口 j int_service //调用int_service函数.align 2int8_vec: //中断向量IRQ8入口 j int_service //调用int_service函数.align 2int9_vec: //中断向量IRQ9入口 j int_service //调用int_service函数.align 2int10_vec: //中断向量IRQ10入口 j int_service //调用int_service函数.align 2int11_vec: //中断向量IRQ11入口 j int_service //调用int_service函数.align 2int12_vec: //中断向量IRQ12入口 j int_service //调用int_service函数.align 2int13_vec: //中断向量IRQ13入口 j int_service //调用int_service函数.align 2int14_vec: //中断向量IRQ14入口 j int_service //调用int_service函数.align 2int15_vec: //中断向量IRQ15入口 j int_service //调用int_service函数.align 2int16_vec: //中断向量IRQ16入口 j int_service //调用int_service函数.align 2int17_vec: //中断向量IRQ17入口 j int_service //调用int_service函数.align 2int18_vec: //中断向量IRQ18入口 j int_service //调用int_service函数.align 2int19_vec: //中断向量IRQ19入口 j int_service //调用int_service函数.align 2int20_vec: //中断向量IRQ20入口 j int_service //调用int_service函数.align 2int21_vec: //中断向量IRQ21入口 j int_service //调用int_service函数.align 2int22_vec: //中断向量IRQ22入口 j int_service //调用int_service函数.align 2int23_vec: //中断向量IRQ23入口 j int_service //调用int_service函数.align 2int24_vec: //(Reserved)中断向量IRQ24入口 j save_reg //调用save_reg函数取得中断向量号.align 2int25_vec: //(Reserved)中断向量IRQ25入口 j save_reg //调用save_reg函数取得中断向量号.align 2int26_vec: //(Reserved)中断向量IRQ26入口 j save_reg //调用save_reg函数取得中断向量号.align 2int27_vec: //(Bufctl + TV vblanking end)中断向量IRQ27入口 j save_reg //调用save_reg函数取得中断向量号.align 2int28_vec: //(GPIO)中断向量IRQ28入口 j save_reg //调用save_reg函数取得中断向量号.align 2int29_vec: //(C3--ECC Module)中断向量IRQ29入口 j save_reg //调用save_reg函数取得中断向量号.align 2int30_vec: //(MP4)中断向量IRQ30入口 j save_reg //调用save_reg函数取得中断向量号.align 2int31_vec: //(RTC)中断向量IRQ31入口 j save_reg //调用save_reg函数取得中断向量号.align 2int32_vec: //(APBDMA CH4)中断向量IRQ32入口 j save_reg //调用save_reg函数取得中断向量号.align 2int33_vec: //(APBDMA CH3)中断向量IRQ33入口 j save_reg //调用save_reg函数取得中断向量号.align 2int34_vec: //(BIN DMA)中断向量IRQ34入口 j save_reg //调用save_reg函数取得中断向量号.align 2int35_vec: //(LDM DMA)中断向量IRQ35入口 j save_reg //调用save_reg函数取得中断向量号.align 2int36_vec: //(APBDMA CH2)中断向量IRQ36入口 j save_reg //调用save_reg函数取得中断向量号.align 2int37_vec: //(APBDMA CH1)中断向量IRQ37入口 j save_reg //调用save_reg函数取得中断向量号.align 2int38_vec: //(I2S)中断向量IRQ38入口 j save_reg //调用save_reg函数取得中断向量号.align 2int39_vec: //(I2C)中断向量IRQ39入口 j save_reg //调用save_reg函数取得中断向量号.align 2int40_vec: //(SD)中断向量IRQ40入口 j save_reg //调用save_reg函数取得中断向量号.align 2int41_vec: //(Nand)中断向量IRQ41入口 j save_reg //调用save_reg函数取得中断向量号.align 2int42_vec: //(UART)中断向量IRQ42入口 j save_reg //调用save_reg函数取得中断向量号.align 2int43_vec: //(SPI)中断向量IRQ43入口 j save_reg //调用save_reg函数取得中断向量号.align 2int44_vec: //(SIO)中断向量IRQ44入口 j save_reg //调用save_reg函数取得中断向量号.align 2int45_vec: //(USB host+device)中断向量IRQ45入口 j save_reg //调用save_reg函数取得中断向量号.align 2int46_vec: //(Reserved)中断向量IRQ46入口 j save_reg //调用save_reg函数取得中断向量号.align 2int47_vec: //(TV coordinate hit)中断向量IRQ47入口 j save_reg //调用save_reg函数取得中断向量号.align 2int48_vec: //(CSI capture done)中断向量IRQ48入口 j save_reg //调用save_reg函数取得中断向量号.align 2int49_vec: //(CSI motion frame end)中断向量IRQ49入口 j save_reg //调用save_reg函数取得中断向量号.align 2int50_vec: //(CSI coordinate hit)中断向量IRQ50入口 j save_reg //调用save_reg函数取得中断向量号.align 2int51_vec: //(CSI frame end)中断向量IRQ51入口 j save_reg //调用save_reg函数取得中断向量号.align 2int52_vec: //(Light Gun)中断向量IRQ52入口 j save_reg //调用save_reg函数取得中断向量号.align 2int53_vec: //(Reserved)中断向量IRQ53入口 j save_reg //调用save_reg函数取得中断向量号.align 2int54_vec: //(LCD vblanking start)中断向量IRQ54入口 j save_reg //调用save_reg函数取得中断向量号.align 2int55_vec: //(TV vblanking start)中断向量IRQ55入口 j save_reg //调用save_reg函数取得中断向量号.align 2int56_vec: //(Timer)中断向量IRQ56入口 j save_reg //调用save_reg函数取得中断向量号.align 2int57_vec: //(TMB)中断向量IRQ57入口 j save_reg //调用save_reg函数取得中断向量号.align 2int58_vec: //(ADC)中断向量IRQ58入口 j save_reg //调用save_reg函数取得中断向量号.align 2int59_vec: //(MIC OV)中断向量IRQ59入口 j save_reg //调用save_reg函数取得中断向量号.align 2int60_vec: //(Reserved)中断向量IRQ60入口 j save_reg //调用save_reg函数取得中断向量号.align 2int61_vec: //(Reserved)中断向量IRQ61入口 j save_reg //调用save_reg函数取得中断向量号.align 2int62_vec: //(Reserved)中断向量IRQ62入口 j save_reg //调用save_reg函数取得中断向量号.align 2int63_vec: //(DAC)中断向量IRQ63入口 j save_reg //调用save_reg函数取得中断向量号.extern intmsg //该函数在Sys_IRQ.c文件中定义//=========================================================// 软件中断服务函数//=========================================================norm_debug_service: //软件中断1(Normal debug异常)中断服务程序 jl intmsg //调用intmsg函数general_service: //软件中断2(General异常)中断服务程序 jl intmsg //调用intmsg函数int_service: jl intmsg //调用intmsg函数.extern irq_dispatch //该函数在Sys_IRQ.c文件中定义.set r1//=========================================================// 汇编语言格式:save_reg// C 语 言 格式:void save_reg(void)// 功 能 描 述:中断服务函数,// 保护及恢复现场,调用irq_dispatch函数// 入 口 参 数:无// 出 口 参 数:无//=========================================================save_reg: subi SP, E_SIZE /* push general registers to stack */ sw AT, [SP,E_AT] sw BP, [SP,E_BP] sw LR, [SP,E_LR] sw A0, [SP,E_A0] sw A1, [SP,E_A1] sw A2, [SP,E_A2] sw A3, [SP,E_A3] sw T0, [SP,E_T0] sw T1, [SP,E_T1] sw T2, [SP,E_T2] sw T3, [SP,E_T3] sw S0, [SP,E_S0] sw S1, [SP,E_S1] sw S2, [SP,E_S2] sw S3, [SP,E_S3] sw S4, [SP,E_S4] sw S5, [SP,E_S5] sw S6, [SP,E_S6] sw S7, [SP,E_S7] sw S8, [SP,E_S8] sw S9, [SP,E_S9] sw T4, [SP,E_T4] sw T5, [SP,E_T5] sw T6, [SP,E_T6] sw T7, [SP,E_T7] sw T8, [SP,E_T8] sw T9, [SP,E_T9] sw R28,[SP,E_R28] sw JP, [SP,E_JP] sw K0, [SP,E_K0] sw K1, [SP,E_K1] /* push CP0 registers to stack */ mfcr S1, CP0_COND sw S1, [SP,E_CP0_COND] mfcr S3, CP0_EPC sw S3, [SP,E_CP0_EPC] mfcr S4, CP0_STATUS sw S4, [SP,E_CP0_STATUS] /* push special control registers to stack */ mfceh S1 sw S1, [SP,E_SPR_HI] mfcel S1 sw S1, [SP,E_SPR_LO] mfsr S1, SR_CNT sw S1, [SP,E_SR_CNT] mfsr S1, SR_LCR sw S1, [SP,E_SR_LCR] mfsr S1, SR_SCR sw S1, [SP,E_SR_SCR] mfcr A0, CP0_CAUSE jl irq_dispatchno_ctxsw: /* pop special registers from stack */ lw T0, [SP, E_SPR_HI] mtceh T0 lw T0, [SP, E_SPR_LO] mtcel T0 lw T0, [SP, E_SR_CNT] mtsr T0, SR_CNT lw T0, [SP, E_SR_LCR] mtsr T0, SR_LCR lw T0, [SP, E_SR_SCR] mtsr T0, SR_SCR /* pop general registers from stack */ lw AT, [SP,E_AT] lw BP, [SP,E_BP] lw LR, [SP,E_LR] lw A0, [SP,E_A0] lw A1, [SP,E_A1] lw A2, [SP,E_A2] lw A3, [SP,E_A3] lw T2, [SP,E_T2] lw T3, [SP,E_T3] lw S0, [SP,E_S0] lw S1, [SP,E_S1] lw S2, [SP,E_S2] lw S3, [SP,E_S3] lw S4, [SP,E_S4] lw S5, [SP,E_S5] lw S6, [SP,E_S6] lw S7, [SP,E_S7] lw S8, [SP,E_S8] lw S9, [SP,E_S9] lw T4, [SP,E_T4] lw T5, [SP,E_T5] lw T6, [SP,E_T6] lw T7, [SP,E_T7] lw T8, [SP,E_T8] lw T9, [SP,E_T9] lw R28,[SP,E_R28] lw JP, [SP,E_JP] lw K0, [SP,E_K0] lw K1, [SP,E_K1] /* pop CP0 registers from stack */ lw T0, [SP,E_CP0_COND] mtcr T0, CP0_COND lw T0, [SP,E_CP0_EPC] mtcr T0, CP0_EPC lw T0, [SP,E_CP0_STATUS] mtcr T0, CP0_STATUS pflush lw T0, [SP,E_T0] lw T1, [SP,E_T1] addi SP, E_SIZEscore_fun_rte1: rte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -