📄 osiickisr代码.txt
字号:
STMFD sp!, {r4} ; 这个SP是IRQ模式下的!
LDR r4, =LINK_SAVE
STR lr, [r4] ; LINK_SAVE = lr_irq
MRS lr, spsr
STR lr, [r4, #4] ; PSR_SAVE = spsr_irq
LDMFD sp!, {r4} ; 只好重新恢复R4
ORR lr, lr, #0x80 ; Mask irq for context switching before
MSR cpsr_cxsf, lr ; returning back from irq mode.我们还没有
; 保存好现场,如果打开中断,就有可能发生新的
; 抢占式调度,于是这个现场就OVER了。现场保
; 护和现场恢复都要一气呵成。
SUB sp, sp, #4 ; Space for PC
STMFD sp!, {r0-r12, lr}
LDR r4, =LINK_SAVE
LDR lr, [r4, #0]
SUB lr, lr, #4 ; PC = LINK_SAVE - 4,
STR lr, [sp, #(14*4)] ; SAVE PC [..]the return address for pc.
LDR r4, [r4, #4] ; r4 = PSR_SAVE,
STMFD sp!, {r4} ; CPSR of the task
LDR r4, =OSTCBCur
LDR r4, [r4]
STR sp, [r4] ; OSTCBCur -> stkptr = sp 保存现场完毕
BL OSIntEnter
BL OSTimeTick
BL tick_hook ; 我们在Tick_hook()里清除S3C44B0x的Tick_Int_Pend位,这个
; 函数在main.c里,是另加的.其实用uCOS-II自己的HOOK更好
BL OSIntExit ; 调度!
LDMFD sp!, {r4} ; pop current task cpsr
MSR cpsr_cxsf, r4
LDMFD sp!, {r0-r12,lr,pc} ; pop current task r0-r12,lr & pc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -