📄 os_cpu_a.xff
字号:
NAME OS_CPU_A
?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSTickISR?OS_CPU_A SEGMENT CODE
PUBLIC ?C_XBP
PUBLIC OSIntCtxSw
;PUBLIC Stack
PUBLIC OSCtxSw
PUBLIC OSStartHighRdy
EXTRN CODE(_?OSTaskSwHook)
EXTRN CODE(_?OSIntEnter)
EXTRN CODE(_?OSIntExit)
EXTRN CODE(_?OSTimeTick)
;EXTRN DATA (?C_XBP)
EXTRN iDATA(OSRunning)
EXTRN iDATA(OSTCBHighRdy)
EXTRN iDATA(OSPrioHighRdy)
EXTRN iDATA(OSPrioCur)
EXTRN iDATA(OSTCBCur)
?STACK SEGMENT IDATA
RSEG ?STACK
OSStack:
DS 40H
OSStkStart IDATA OSStack-1
DT?C_XBP SEGMENT DATA
RSEG DT?C_XBP
?C_XBP:
DS 2
;------------------------------------------------------------------------------------------------------------
PUSHALL MACRO
PUSH PSW
PUSH ACC
PUSH B
PUSH DPL
PUSH DPH
PUSH 0
PUSH 1
PUSH 2
PUSH 3
PUSH 4
PUSH 5
PUSH 6
PUSH 7
ENDM
POPALL MACRO
POP 7
POP 6
POP 5
POP 4
POP 3
POP 2
POP 1
POP 0
POP DPH
POP DPL
POP B
POP ACC
POP PSW
ENDM
;----------------------------------------------------------------------------------------------------
RSEG ?PR?OSStartHighRdy?OS_CPU_A ;SEGMENT CODE
OSStartHighRdy:
USING 0
LCALL _?OSTaskSwHook
OSCtxSw_in :
; 获得当前TCB指针
MOV R0, #LOW (OSTCBCur)
INC R0
MOV DPH, @R0
INC R0
MOV DPL, @R0
;获得堆栈印象指针
INC DPTR
MOVX A, @DPTR
MOV R0, A
INC DPTR
MOVX A, @DPTR
MOV R1, A
MOV DPH, R0
MOV DPL, R1
;获得堆栈映像长度
MOVX A, @DPTR
MOV R5, A
;把待运行任务堆栈映像的内容复制到系统堆栈
MOV R0, #OSStkStart
restore_stack:
INC DPTR
INC R0
MOVX A, @DPTR
MOV @R0, A
DJNZ R5, restore_stack
;复制系统堆栈指针SP
MOV SP, R0
;恢复任务堆栈映像指针?C_XBP
INC DPTR
MOVX A, @DPTR
MOV ?C_XBP, A
INC DPTR
MOVX A, @DPTR
MOV ?C_XBP+1, A
;OSRunning = TRUE
MOV R0, #LOW(OSRunning)
MOV @R0, #01
POPALL ;把系统堆栈内容弹入CPU
SETB EA
RETI
;------------------------------------------------------------------------------------------------
RSEG ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:
PUSHALL
OSIntCtxSw_in:
MOV A, SP
CLR C
SUBB A, #OSStkStart
MOV R5, A
MOV R0, #LOW(OSTCBCur)
INC R0
MOV DPH, @R0
INC R0
MOV DPL, @R0
INC DPTR
MOVX A, @DPTR
MOV R0, A
INC DPTR
MOVX A, @DPTR
MOV R1, A
MOV DPH, R0
MOV DPL, R1
MOV A, R5
MOVX @DPTR,A
MOV R0, #OSStkStart
save_stack:
INC DPTR
INC R0
MOV A, @R0
MOVX @DPTR, A
DJNZ R5, save_stack
INC DPTR
MOV A, ?C_XBP
MOVX @DPTR,A
INC DPTR
MOV A, ?C_XBP+1
MOVX @DPTR,A
LCALL _?OSTaskSwHook
MOV R0, #OSTCBCur
MOV R1, #OSTCBHighRdy
MOV A, @R1
MOV @R0, A
INC R0
INC R1
MOV A, @R1
MOV @R0, A
INC R0
INC R1
MOV A, @R1
MOV @R0, A
MOV R0, #OSPrioCur
MOV R1, #OSPrioHighRdy
MOV A, @R1
MOV @R0, A
LJMP OSCtxSw_in
;--------------------------------------------------------------------------------------------------------
RSEG ?PR?OSIntCtxSw?OS_CPU_A
OSIntCtxSw:
MOV A, SP
CLR C
SUBB A, #4
MOV SP, A
LJMP OSIntCtxSw_in
CSEG AT 000BH
LJMP OSTickISR
RSEG ?PR?OSTickISR?OS_CPU_A
OSTickISR:
USING 0
CLR TR0
MOV TH0, #0B8H
MOV TL0, #00H
SETB TR0
PUSHALL
LCALL _?OSIntEnter
LCALL _?OSTimeTick
LCALL _?OSIntExit
POPALL
RETI
;--------------------------------------------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -