📄 asmisr.s
字号:
.EQU NoIRQ, 0x80
.EQU INTPEND, 0x03FF4004
.EQU BIT_TIMER0, (0x1<<10)
# .GLOBAL Timer0IRQHandler
#Timer0IRQHandler: @ 中断向量
# .extern TickHandler
# STMFD sp!, {r0-r12, lr} @ 中断栈保存
# BL TickHandler @ 中断C处理函数
# LDMFD sp!, {r0-r12, lr} @ 恢复中断栈
# SUBS pc, lr, #4 @ 返回中断前的程序指针
.GLOBAL Timer0IRQHandler
.GLOBAL IRQContextSwap
IRQContextSwap:
MOV a1, #0
MOV lr, pc
Timer0IRQHandler: @ 中断向量
.extern TickHandler
# SUBS lr,lr,#4
# STMFD sp!,{lr}
# ADD lr,lr,#4
STMFD sp!, {r0-r12, lr} @ 中断栈保存
# STMFD sp!, {r0-r12} @ 中断栈保存
MRS r4, CPSR
STMFD sp!, {r4} @ save current PSR
MRS r4, SPSR @ YYY+
STMFD sp!, {r4} @ YYY+ save SPSR
#(Clear pending bit of INTPEND that don't accessed it.)
# rI_ISPC= BIT_TIMER0;
LDR r0, =INTPEND
LDR r1, =BIT_TIMER0
STR r1, [r0]
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#Change Supervisor mode
#!!!r12 register don't preserved. (r12 that PC of task)
# MRS lr, SPSR
# AND lr, lr, #0xFFFFFFE0
# ORR lr, lr, #0x13
# MSR CPSR_cxsf, lr
# MOV a1, #1
BL IrqFinish @ 中断C处理函数
LDMFD sp!, {r4} @ YYY+
MSR SPSR_cxsf, r4 @ YYY+
LDMFD sp!, {r4} @ YYY+
MSR CPSR_cxsf, r4 @ YYY+
# LDMFD sp!, {r0-r12, lr} @ 恢复中断栈
# MOV pc,lr
# LDMFD sp!, {r0-r12, lr,pc} @ 恢复中断栈
LDMFD sp!, {r0-r12, lr} @ 恢复中断栈
SUBS pc, lr, #4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -