📄 os_cpu_a.s
字号:
AREA |subr|, CODE, READONLY
EXPORT OSStartHighRdy
IMPORT OSTaskSwHook
IMPORT OSTCBHighRdy
IMPORT OSRunning
OSStartHighRdy
BL OSTaskSwHook
LDR r4,=OSRunning
MOV r5, #1
STRB r5, [r4]
LDR r4, =OSTCBHighRdy
LDR r4, [r4]
LDR sp, [r4]
LDMFD sp!, {r4}
MSR cpsr_cxsf, r4
LDMFD sp!, {r0-r12,lr,pc}
EXPORT OSCtxSw
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSTCBCur
IMPORT OSTaskSwHook
IMPORT OSTCBHighRdy
OSCtxSw
STMFD sp!, {lr} ;push pc
STMFD sp!, {r0-r12,lr} ;push lr ®ister file
MRS r4, cpsr
STMFD sp!, {r4} ;push current psr
LDR r4, =OSTCBCur
LDR r5, [r4]
STR sp, [r5] ;store sp in preempted tasks's TCB
; *****OSCtxSw OSIntCtxSw*****
EXPORT OSIntCtxSw
IMPORT OSTaskSwHook
OSIntCtxSw
BL OSTaskSwHook
LDR r4, =OSTCBHighRdy
LDR r4, [r4]
LDR r5, =OSTCBCur
STR r4, [r5] ;OSTCBCur=OSTCBHighRdy
LDR r6, =OSPrioHighRdy
LDRB r6, [r6]
LDR r5, =OSPrioCur
STRB r6, [r5] ;OSPrioCur=OSPrioHighRdy
LDR sp, [r4]
LDMFD sp!, {r4} ;pop new task cpsr
MSR cpsr_cxsf, r4
LDMFD sp!, {r0-r12,lr,pc} ;pop new task ro-r12,lr&pc
; *****OSTickISR*****
EXPORT OSTickISR
IMPORT OSIntEnter
IMPORT OSTimeTick
IMPORT OSIntExit
LINK_SAVE DCD 0
PSR_SAVE DCD 0
OSTickISR
STMFD sp!, {r4}
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}
ORR lr, lr, #0x80
MSR cpsr_cxsf, lr ;Mask irq for context switching before returning back from irq mode
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 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
EXPORT ARMDisableInt
ARMDisableInt
MRS r0, cpsr
STMFD sp!, {r0}
ORR r0, r0, #0xc0
MSR cpsr_c, r0
MOV pc, lr
EXPORT ARMEnableInt
ARMEnableInt
LDMFD sp!, {r0}
MSR cpsr_c, r0
MOV pc, lr
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -