📄 os_cpu_a.s
字号:
#; Functions defined in this module:
.EQU SwiV, 0x08
.EQU IrqV, 0x18
.EQU FiqV, 0x1C
.EQU NoInt, 0x80
.EQU OSEnterSWI, 0x00
.EQU OS_EnterOS, 0xff
#; External symbols we need the addresses of
.extern OSTCBCur
.extern OSTCBHighRdy
.extern OSPrioCur
.extern OSPrioHighRdy
.extern OSTaskSwHook
.extern OSRunning
.extern OSTaskSwHook
.extern OSTimeTick
.extern OSIntEnter
.extern OSIntExit
.global OSTickISR
.global ARMDisableInt
.global ARMEnableInt
.global ARMIsDisableInt
.global OSStartHighRdy
.global OS_TASK_SW
.global OSIntCtxSw
.text
OSTickISR:
MOV ip, sp
STMDB sp!, {fp, ip, lr, pc}
SUB fp, ip, #4
# BL OSIntEnter
BL OSTimeTick
# BL OSIntExit
LDMDB fp, {fp, sp, pc}
#--------------------------------------------------------------------------------------
ARMDisableInt:
STMDB sp!, {r0}
MRS r0, CPSR
ORR r0, r0, #NoInt
MSR CPSR_cxsf, r0
LDMIA sp!, {r0}
MOV pc, lr
#--------------------------------------------------------------------------------------
ARMEnableInt:
STMDB sp!, {r0}
MRS r0, CPSR
BIC r0, r0, #NoInt
MSR CPSR_cxsf, r0
LDMIA sp!, {r0}
MOV pc, lr
#--------------------------------------------------------------------------------------
ARMIsDisableInt:
MRS a1, CPSR
AND a1, a1, #NoInt
MOV pc, lr
#--------------------------------------------------------------------------------------
OSStartHighRdy:
SWI OS_EnterOS
BL OSTaskSwHook
MOV R0, #1
LDR R1, =OSRunning
STRB R0, [R1]
LDR R1, =OSTCBHighRdy
LDR R1, [R1]
LDR R0, [R1, #0]
LDMFD R0!, {R1, R14}
MSR SPSR_all, R1
LDMFD R0, {R0-R14}^
NOP
MOVS PC,R14
#--------------------------------------------------------------------------------------
OS_TASK_SW:
MOV R2, R14
MRS R1, CPSR
BIC R0, R1, #0x1f
ORR R0, R0, #0x92
MSR CPSR_all, R0
NOP
MSR SPSR_all, R1
ADD R14, R2, #0
#; Now in a state just like as if at 0x18
B OSCtxSw
#--------------------------------------------------------------------------------------
OSCtxSw:
STMFD R13!, {R14}
#; Save current task context
STMDB R13, {R13}^
LDMDB R13, {R14}
STMFD R14, {R0-R14}^
MRS R1, SPSR
SUB R0, R14, #15*4
LDMFD R13!, {R14}
STMFD R0!, {R1, R14}
LDR R1, =OSTCBCur
LDR R1, [R1]
STR R0, [R1, #0]
BL OSTaskSwHook
LDR R2, =OSTCBHighRdy
LDR R3, =OSTCBCur
LDR R4, =OSPrioHighRdy
LDR R5, =OSPrioCur
LDR R0, [R2]
LDRB R1, [R4]
STR R0, [R3]
STRB R1, [R5]
LDR R1, =OSTCBHighRdy
LDR R1, [R1]
LDR R0, [R1,#0]
LDMFD R0!, {R1, R14}
MSR SPSR_all, R1
LDMFD R0, {R0-R14}^
NOP
MOVS PC, R14
#--------------------------------------------------------------------------------------
OSIntCtxSw:
LDMDB fp, {fp, sp, lr}
LDMDB fp, {fp, sp, lr}
# LDMDB fp, {fp, sp, lr}
LDMFD sp!, {r0-r12, lr}
SUB lr, lr, #4
#; Perform normal task swap
B OSCtxSw
#--------------------------------------------------------------------------------------
# END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -