?? int.s
字號(hào):
@----------------------------------------------------
@Copyright (C), 2005-2008, lst.
@版權(quán)所有 (C), 2005-2008, lst.
@所屬模塊: 中斷模塊
@作者: lst
@版本: V1.00
@初始版本完成日期:2008-08-30
@文件描述: 中斷模塊中的匯編部分
@其他說明: 無
@修訂歷史:
@ 2. ...
@ 1. 日期:
@ 作者:
@ 新版本號(hào):
@ 修改說明:
@------------------------------------------------------
@在44bx中謹(jǐn)慎使用fiq中斷,除非你只有一個(gè)中斷被設(shè)置成fiq,否則,沒有任何直接的信息
@會(huì)告訴你正在響應(yīng)哪個(gè)中斷.FIQ模式不支持向量中斷,你只能通過F_ISPR來確認(rèn)中斷源,
@ARM7沒有直接返回前導(dǎo)0個(gè)數(shù)的指令,只能用循環(huán)移位的方法。確定中斷源所需的時(shí)間開
@銷很大,故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 @中斷宏調(diào)用
stmfd sp!,{r0-r12,lr} @保護(hù)寄存器,以及返回地址
@LR_irq包含中斷返回地址
@SP_sys是獨(dú)立寄存器,無需保護(hù)
@r0-r12是被中斷的上下文寄存器,如果不是
@嵌套中斷,就是用戶態(tài)上下文
mov r0,#\int_no @r0用于記錄中斷號(hào),'\'是取宏參數(shù)的語法
b start_int
.endm
@中斷相關(guān)的棧安排:
@1、IRQ_stack放被中斷的上下文,順序:lr,r12-r0,cpsr,共14字
@2、SVC_stack運(yùn)行中斷服務(wù)函數(shù),包括用戶編寫的中斷服務(wù)函數(shù)。
@3、SYS_stack,除非要在中斷里切換上下文,否則無關(guān)
start_int:
ldr r9,=I_ISPR @44b0x中斷控制器bug
ldr r9,[r9]
cmp r9, #0x0 @I_ISPR=0,說明44b0x 的bug發(fā)作.
beq error_int
mrs r1,spsr
stmfd sp!,{r1} @保護(hù)SPSR_irq,以支持中斷嵌套
msr cpsr_c,#SVCMODE|NOIRQ @進(jìn)入SVCMODE,以便允許中斷嵌套
stmfd sp!,{r0-r3,lr} @保存lr_svc,
ldr r2,=user_irq @取異步信號(hào)地址
mov lr,pc @這兩條指令模擬函數(shù)調(diào)用(4G空間),調(diào)用用戶中斷處理函數(shù),
ldr pc,[r2] @int_isr_real和int_isr_asyn_signal分別是實(shí)時(shí)中斷和異步
@事件處理函數(shù)的入口地址,該函數(shù)原型為
@void int_isr_asyn_signal(ucpu_t intn);intn為中斷號(hào),
@根據(jù)atpcs,intn用r0傳遞
ldmfd sp!,{r0-r3,lr} @恢復(fù)lr_svc,
msr cpsr_c,#IRQMODE|NOINT @更新cpsr,進(jìn)入IRQ模式并禁止中斷
ldmfd sp!,{r0} @spsr->r0
msr spsr_cxsf,r0 @恢復(fù)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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -