📄 int.s
字号:
@----------------------------------------------------
@Copyright (C), 2005-2008, lst.
@版权所有 (C), 2005-2008, lst.
@所属模块: 中断模块
@作者: lst
@版本: V1.00
@初始版本完成日期:2008-08-30
@文件描述: 中断模块中的汇编部分
@其他说明: 无
@修订历史:
@ 2. ...
@ 1. 日期:
@ 作者:
@ 新版本号:
@ 修改说明:
@------------------------------------------------------
@在44bx中谨慎使用fiq中断,除非你只有一个中断被设置成fiq,否则,没有任何直接的信息
@会告诉你正在响应哪个中断.FIQ模式不支持向量中断,你只能通过F_ISPR来确认中断源,
@ARM7没有直接返回前导0个数的指令,只能用循环移位的方法。确定中断源所需的时间开
@销很大,故44b0x中FIQ变得毫无意义,因此djyos在44b0x版本并不使用FIQ中断.
.equ NOINT, 0xc0
.equ NOIRQ, 0x80
.equ FIQMODE, 0x11
.equ IRQMODE, 0x12
.equ MODEMASK, 0x1f
.equ SVCMODE, 0x13
.equ I_ISPR, 0x1e00020
.equ I_PMST, 0x1e00014
.equ CN_irq_line_ADC, (0)
.equ CN_irq_line_RTC, (1)
.equ CN_irq_line_UTXD1, (2)
.equ CN_irq_line_UTXD0, (3)
.equ CN_irq_line_SIO, (4)
.equ CN_irq_line_IIC, (5)
.equ CN_irq_line_URXD1, (6)
.equ CN_irq_line_URXD0, (7)
.equ CN_irq_line_TIMER5, (8)
.equ CN_irq_line_TIMER4, (9)
.equ CN_irq_line_TIMER3, (10)
.equ CN_irq_line_TIMER2, (11)
.equ CN_irq_line_TIMER1, (12)
.equ CN_irq_line_TIMER0, (13)
.equ CN_irq_line_UERR01, (14)
.equ CN_irq_line_WDT, (15)
.equ CN_irq_line_BDMA1, (16)
.equ CN_irq_line_BDMA0, (17)
.equ CN_irq_line_ZDMA1, (18)
.equ CN_irq_line_ZDMA0, (19)
.equ CN_irq_line_TICK, (20)
.equ CN_irq_line_EINT4567, (21)
.equ CN_irq_line_EINT3, (22)
.equ CN_irq_line_EINT2, (23)
.equ CN_irq_line_EINT1, (24)
.equ CN_irq_line_EINT0, (25)
.equ CN_irq_line_GLOBAL, (26)
.extern tg_int_globe
.extern IRQ_stack
.global HandlerADC
.global HandlerRTC
.global HandlerUTXD1
.global HandlerUTXD0
.global HandlerSIO
.global HandlerIIC
.global HandlerURXD1
.global HandlerURXD0
.global HandlerTIMER5
.global HandlerTIMER4
.global HandlerTIMER3
.global HandlerTIMER2
.global HandlerTIMER1
.global HandlerTIMER0
.global HandlerUERR01
.global HandlerWDT
.global HandlerBDMA1
.global HandlerBDMA0
.global HandlerZDMA1
.global HandlerZDMA0
.global HandlerTICK
.global HandlerEINT4567
.global HandlerEINT3
.global HandlerEINT2
.global HandlerEINT1
.global HandlerEINT0
.macro M_vector_int int_no @中断宏调用
stmfd sp!,{r0-r12,lr} @保护寄存器,以及返回地址
@LR_irq包含中断返回地址
@SP_sys是独立寄存器,无需保护
@r0-r12是被中断的上下文寄存器,如果不是
@嵌套中断,就是用户态上下文
mov r0,#\int_no @r0用于记录中断号,'\'是取宏参数的语法
b start_int
.endm
@中断相关的栈安排:
@1、IRQ_stack放被中断的上下文,顺序:lr,r12-r0,cpsr,共14字
@2、SVC_stack运行中断服务函数,包括用户编写的中断服务函数。
@3、SYS_stack,除非要在中断里切换上下文,否则无关
start_int:
ldr r9,=I_ISPR @44b0x中断控制器bug
ldr r9,[r9]
cmp r9, #0x0 @I_ISPR=0,说明44b0x 的bug发作.
beq error_int
mrs r1,spsr
stmfd sp!,{r1} @保护SPSR_irq,以支持中断嵌套
msr cpsr_c,#SVCMODE|NOIRQ @进入SVCMODE,以便允许中断嵌套
stmfd sp!,{r0-r3,lr} @保存lr_svc,
ldr r2,=user_irq @取异步信号地址
mov lr,pc @这两条指令模拟函数调用(4G空间),调用用户中断处理函数,
ldr pc,[r2] @int_isr_real和int_isr_asyn_signal分别是实时中断和异步
@事件处理函数的入口地址,该函数原型为
@void int_isr_asyn_signal(ucpu_t intn);intn为中断号,
@根据atpcs,intn用r0传递
ldmfd sp!,{r0-r3,lr} @恢复lr_svc,
msr cpsr_c,#IRQMODE|NOINT @更新cpsr,进入IRQ模式并禁止中断
ldmfd sp!,{r0} @spsr->r0
msr spsr_cxsf,r0 @恢复spsr
ldmfd sp!,{r0-r12,lr}
subs pc,lr,#4 @此后,中断被重新打开
error_int:
ldr r8,=I_PMST @44b0x中断控制器bug
ldr r9,[r8]
str r9,[r8]
ldmfd sp!,{r0-r12,lr}
subs pc,lr,#4 @此后,中断被重新打开
.ltorg
HandlerADC: M_vector_int CN_irq_line_ADC
HandlerRTC: M_vector_int CN_irq_line_RTC
HandlerUTXD1: M_vector_int CN_irq_line_UTXD1
HandlerUTXD0: M_vector_int CN_irq_line_UTXD0
HandlerSIO: M_vector_int CN_irq_line_SIO
HandlerIIC: M_vector_int CN_irq_line_IIC
HandlerURXD1: M_vector_int CN_irq_line_URXD1
HandlerURXD0: M_vector_int CN_irq_line_URXD0
HandlerTIMER5: M_vector_int CN_irq_line_TIMER5
HandlerTIMER4: M_vector_int CN_irq_line_TIMER4
HandlerTIMER3: M_vector_int CN_irq_line_TIMER3
HandlerTIMER2: M_vector_int CN_irq_line_TIMER2
HandlerTIMER1: M_vector_int CN_irq_line_TIMER1
HandlerTIMER0: M_vector_int CN_irq_line_TIMER0
HandlerUERR01: M_vector_int CN_irq_line_UERR01
HandlerWDT: M_vector_int CN_irq_line_WDT
HandlerBDMA1: M_vector_int CN_irq_line_BDMA1
HandlerBDMA0: M_vector_int CN_irq_line_BDMA0
HandlerZDMA1: M_vector_int CN_irq_line_ZDMA1
HandlerZDMA0: M_vector_int CN_irq_line_ZDMA0
HandlerTICK: M_vector_int CN_irq_line_TICK
HandlerEINT4567:M_vector_int CN_irq_line_EINT4567
HandlerEINT3: M_vector_int CN_irq_line_EINT3
HandlerEINT2: M_vector_int CN_irq_line_EINT2
HandlerEINT1: M_vector_int CN_irq_line_EINT1
HandlerEINT0: M_vector_int CN_irq_line_EINT0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -