📄 sys_isr.s
字号:
###########################################################
# 文 件 名: Sys_isr.S
# 功能描述: 中断向量处理文件
# 使用时,用户不需要修改此文件中的内容
# 维护记录: 2007年1月11日 V1.0 by hongyan.Feng
###########################################################
#define SP r0
.section .exception_vec,"ax" //定义异常中断段,在*.ld中已经定义了其起始地址为0xa00001fc
###########################################################
# 定义两个软件中断向量入口
###########################################################
.align 2
norm_debug_vec: //Normal debug异常向量入口
j norm_debug_service
.align 2
general_vec: //General异常向量入口
j general_service
###########################################################
# 定义63个硬件中断向量入口
###########################################################
.align 2
int1_vec: //中断向量IRQ1入口
j int_service //调用int_service函数
.align 2
int2_vec: //中断向量IRQ2入口
j int_service //调用int_service函数
.align 2
int3_vec: //中断向量IRQ3入口
j int_service //调用int_service函数
.align 2
int4_vec: //中断向量IRQ4入口
j int_service //调用int_service函数
.align 2
int5_vec: //中断向量IRQ5入口
j int_service //调用int_service函数
.align 2
int6_vec: //中断向量IRQ6入口
j int_service //调用int_service函数
.align 2
int7_vec: //中断向量IRQ7入口
j int_service //调用int_service函数
.align 2
int8_vec: //中断向量IRQ8入口
j int_service //调用int_service函数
.align 2
int9_vec: //中断向量IRQ9入口
j int_service //调用int_service函数
.align 2
int10_vec: //中断向量IRQ10入口
j int_service //调用int_service函数
.align 2
int11_vec: //中断向量IRQ11入口
j int_service //调用int_service函数
.align 2
int12_vec: //中断向量IRQ12入口
j int_service //调用int_service函数
.align 2
int13_vec: //中断向量IRQ13入口
j int_service //调用int_service函数
.align 2
int14_vec: //中断向量IRQ14入口
j int_service //调用int_service函数
.align 2
int15_vec: //中断向量IRQ15入口
j int_service //调用int_service函数
.align 2
int16_vec: //中断向量IRQ16入口
j int_service //调用int_service函数
.align 2
int17_vec: //中断向量IRQ17入口
j int_service //调用int_service函数
.align 2
int18_vec: //中断向量IRQ18入口
j int_service //调用int_service函数
.align 2
int19_vec: //中断向量IRQ19入口
j int_service //调用int_service函数
.align 2
int20_vec: //中断向量IRQ20入口
j int_service //调用int_service函数
.align 2
int21_vec: //中断向量IRQ21入口
j int_service //调用int_service函数
.align 2
int22_vec: //中断向量IRQ22入口
j int_service //调用int_service函数
.align 2
int23_vec: //中断向量IRQ23入口
j int_service //调用int_service函数
.align 2
int24_vec: //(Reserved)中断向量IRQ24入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int25_vec: //(Reserved)中断向量IRQ25入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int26_vec: //(Reserved)中断向量IRQ26入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int27_vec: //(Bufctl + TV vblanking end)中断向量IRQ27入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int28_vec: //(GPIO)中断向量IRQ28入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int29_vec: //(C3--ECC Module)中断向量IRQ29入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int30_vec: //(MP4)中断向量IRQ30入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int31_vec: //(RTC)中断向量IRQ31入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int32_vec: //(APBDMA CH4)中断向量IRQ32入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int33_vec: //(APBDMA CH3)中断向量IRQ33入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int34_vec: //(BIN DMA)中断向量IRQ34入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int35_vec: //(LDM DMA)中断向量IRQ35入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int36_vec: //(APBDMA CH2)中断向量IRQ36入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int37_vec: //(APBDMA CH1)中断向量IRQ37入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int38_vec: //(I2S)中断向量IRQ38入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int39_vec: //(I2C)中断向量IRQ39入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int40_vec: //(SD)中断向量IRQ40入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int41_vec: //(Nand)中断向量IRQ41入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int42_vec: //(UART)中断向量IRQ42入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int43_vec: //(SPI)中断向量IRQ43入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int44_vec: //(SIO)中断向量IRQ44入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int45_vec: //(USB host+device)中断向量IRQ45入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int46_vec: //(Reserved)中断向量IRQ46入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int47_vec: //(TV coordinate hit)中断向量IRQ47入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int48_vec: //(CSI capture done)中断向量IRQ48入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int49_vec: //(CSI motion frame end)中断向量IRQ49入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int50_vec: //(CSI coordinate hit)中断向量IRQ50入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int51_vec: //(CSI frame end)中断向量IRQ51入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int52_vec: //(Light Gun)中断向量IRQ52入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int53_vec: //(Reserved)中断向量IRQ53入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int54_vec: //(LCD vblanking start)中断向量IRQ54入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int55_vec: //(TV vblanking start)中断向量IRQ55入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int56_vec: //(Timer)中断向量IRQ56入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int57_vec: //(TMB)中断向量IRQ57入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int58_vec: //(ADC)中断向量IRQ58入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int59_vec: //(MIC OV)中断向量IRQ59入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int60_vec: //(Reserved)中断向量IRQ60入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int61_vec: //(Reserved)中断向量IRQ61入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int62_vec: //(Reserved)中断向量IRQ62入口
j save_reg //调用save_reg函数取得中断向量号
.align 2
int63_vec: //(Reserved)中断向量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, 38*4 //保存现场:保存r1~r31寄存器,保存条件寄存器cr1和中断计数器cr5
sw r1, [SP, 1*4]
sw r2, [SP, 2*4]
sw r3, [SP, 3*4]
sw r4, [SP, 4*4]
sw r5, [SP, 5*4]
sw r6, [SP, 6*4]
sw r7, [SP, 7*4]
sw r8, [SP, 8*4]
sw r9, [SP, 9*4]
sw r10, [SP, 10*4]
sw r11, [SP, 11*4]
sw r12, [SP, 12*4]
sw r13, [SP, 13*4]
sw r14, [SP, 14*4]
sw r15, [SP, 15*4]
sw r16, [SP, 16*4]
sw r17, [SP, 17*4]
sw r18, [SP, 18*4]
sw r19, [SP, 19*4]
sw r20, [SP, 20*4]
sw r21, [SP, 21*4]
sw r22, [SP, 22*4]
sw r23, [SP, 23*4]
sw r24, [SP, 24*4]
sw r25, [SP, 25*4]
sw r26, [SP, 26*4]
sw r27, [SP, 27*4]
sw r28, [SP, 28*4]
sw r29, [SP, 29*4]
sw r30, [SP, 30*4]
sw r31, [SP, 31*4]
mfcr r13, cr1
mfcr r15, cr5
sw r13, [SP, 33*4]
sw r15, [SP, 35*4]
mfcr r4, cr2 //通过cr2的b23~b16读取中断请求的向量号,并把此数据作为调用函数的入口参数
jl irq_dispatch //调用irq_dispatch函数,此函数在Sys_IRQ.c中定义
lw r1, [SP, 1*4]
lw r2, [SP, 2*4]
lw r3, [SP, 3*4]
lw r4, [SP, 4*4]
lw r5, [SP, 5*4]
lw r6, [SP, 6*4]
lw r7, [SP, 7*4]
lw r8, [SP, 8*4]
lw r9, [SP, 9*4]
lw r10, [SP, 10*4]
lw r11, [SP, 11*4]
lw r12, [SP, 12*4]
lw r13, [SP, 13*4]
lw r14, [SP, 14*4]
lw r15, [SP, 15*4]
lw r16, [SP, 16*4]
lw r17, [SP, 17*4]
lw r18, [SP, 18*4]
lw r19, [SP, 19*4]
lw r20, [SP, 20*4]
lw r21, [SP, 21*4]
lw r22, [SP, 22*4]
lw r23, [SP, 23*4]
lw r24, [SP, 24*4]
lw r25, [SP, 25*4]
lw r26, [SP, 26*4]
lw r27, [SP, 27*4]
lw r28, [SP, 28*4]
lw r29, [SP, 29*4]
lw r30, [SP, 30*4]
lw r31, [SP, 31*4]
lw r30, [SP, 33*4]
lw r31, [SP, 35*4]
mtcr r30, cr1
mtcr r31, cr5
addi SP, 38*4
rte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -