📄 os_cpu_a.asm
字号:
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
; All Rights Reserved
;
;
; 8051/8052 Specific code
; LARGE MEMORY MODEL
;
; Keil C Compiler V6.23a
; (MSC51 Compatible Target)
;
; File : OS_CPU_A.ASM
; By : Jean J. Labrosse
; Replant : wl.peng
;********************************************************************************************************
NAME OS_CPU_A
;********************************************************************************************************
; PUBLIC and EXTERNAL REFERENCES
;********************************************************************************************************
?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
?STACK SEGMENT IDATA
DT?OS_CPU_A SEGMENT DATA
PUBLIC _?OSTickISR
PUBLIC _?OSStartHighRdy
PUBLIC _?OSCtxSw
PUBLIC _?OSIntCtxSw
PUBLIC OSTickRate
PUBLIC OSTickCtr
EXTRN DATA (?C_XBP)
EXTRN XDATA (OSTCBCur)
EXTRN XDATA (OSTCBHighRdy)
EXTRN XDATA (OSPrioCur)
EXTRN XDATA (OSPrioHighRdy)
EXTRN XDATA (OSRunning)
EXTRN CODE (_?OSIntEnter)
EXTRN CODE (_?OSIntExit)
EXTRN CODE (_?OSTimeTick)
EXTRN CODE (_?OSTaskSwHook)
;********************************************************************************************************
; MACRO DEFINE
;********************************************************************************************************
PUSHALL MACRO
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
IRP REG, <R0, R1, R2, R3, R4, R5, R6, R7>
MOV A, REG
PUSH ACC
ENDM
ENDM
POPALL MACRO
IRP REG, <R7, R6, R5, R4, R3, R2, R1, R0>
POP ACC
MOV REG, A
ENDM
POP PSW
POP DPL
POP DPH
POP B
POP ACC
ENDM
LoadXBP MACRO
MOV DPH, ?C_XBP
MOV DPL, ?C_XBP+1
ENDM
SaveXBP MACRO
;PUSH IE
;CLR EA
MOV ?C_XBP, DPH
MOV ?C_XBP+1,DPL
;POP IE
ENDM
LoadReg MACRO REG
MOVX A, @DPTR
MOV REG, A
ENDM
SaveReg MACRO REG
MOV A, REG
MOVX @DPTR, A
ENDM
;********************************************************************************************************
; VARIABLE DEFINE
;********************************************************************************************************
RSEG ?STACK
DS 1 ; SP start address (acllocation by keil c)
RSEG DT?OS_CPU_A
OSTickRate:
DS 1
OSTickCtr:
DS 1
;********************************************************************************************************
; void _?OSStartHighRdy(void);
;********************************************************************************************************
RSEG ?PR?_?OSStartHighRdy?OS_CPU_A
_?OSStartHighRdy:
LCALL _?OSTaskSwHook
; OSRunning = TRUE;
MOV DPL, #LOW(OSRunning)
MOV DPH, #HIGH(OSRunning)
SaveReg #01
LJMP ?C_XBP_Load
;********************************************************************************************************
; void OSCtxSw(void);
;********************************************************************************************************
RSEG ?PR?_?OSCtxSw?OS_CPU_A
_?OSCtxSw:
PUSHALL
SP_Offset:
LoadXBP
MOV A, SP
CLR C
SUBB A, #?STACK-1
MOV R5, A
INC A
CLR C
XCH A, DPL
SUBB A, DPL
JNC SP_Save
DEC DPH
SP_Save:
MOV DPL, A
SaveXBP
SaveREG R5
MOV R0, #?STACK-1
Stack_Save_Loop:
INC DPTR
INC R0
SaveREG @R0
DJNZ R5, Stack_Save_Loop
;POPALL
; OSTCBCur->OSTCBStkPtr = ?C_XBP;
MOV DPL, #LOW(OSTCBCur)
MOV DPH, #HIGH(OSTCBCur)
INC DPTR
LoadReg R0
INC DPTR
LoadReg DPL
MOV DPH, R0
INC DPTR
SaveReg ?C_XBP
INC DPTR
SaveReg ?C_XBP+1
LCALL _?OSTaskSwHook
; OSTCBCur = OSTCBHighRdy;
MOV DPL, #LOW(OSTCBHighRdy)
MOV DPH, #HIGH(OSTCBHighRdy)
LoadReg R0
INC DPTR
LoadReg R1
INC DPTR
LoadReg R2
MOV DPL, #LOW(OSTCBCur)
MOV DPH, #HIGH(OSTCBCur)
SaveReg R0
INC DPTR
SaveReg R1
INC DPTR
SaveReg R2
; OSPrioCur = OSPrioHighRdy;
MOV DPL, #LOW(OSPrioHighRdy)
MOV DPH, #HIGH(OSPrioHighRdy)
LoadReg R0
MOV DPL, #LOW(OSPrioCur)
MOV DPH, #HIGH(OSPrioCur)
SaveReg R0
?C_XBP_Load:
; ?C_XBP = OSTCBCur->OSTCBStkPtr;
MOV DPL, #LOW(OSTCBCur)
MOV DPH, #HIGH(OSTCBCur)
INC DPTR
LoadReg R0
INC DPTR
LoadReg DPL
MOV DPH, R0
INC DPTR
LoadReg ?C_XBP
INC DPTR
LoadReg ?C_XBP+1
SP_Load:
LoadXBP
LoadREG R5
MOV R0, #?STACK-1
Stack_Load_Loop:
INC DPTR
INC R0
LoadREG @R0
DJNZ R5, Stack_Load_Loop
MOV SP, R0
INC DPTR
SaveXBP
; OSTCBCur->OSTCBStkPtr = ?C_XBP;
POPALL
RET
;********************************************************************************************************
; void OSIntCtxSw(void);
;********************************************************************************************************
RSEG ?PR?_?OSIntCtxSw?OS_CPU_A
_?OSIntCtxSw:
DEC SP
DEC SP
DEC SP
DEC SP
LJMP SP_Offset
;********************************************************************************************************
; void OSTickISR(void);
;********************************************************************************************************
CSEG AT 000BH
LJMP _?OSTickISR
RSEG ?PR?_?OSTickISR?OS_CPU_A
_?OSTickISR:
LCALL ResetHwIntr
PUSHALL
;DEC OSTickCtr
;MOV A, OSTickCtr
;JNZ OSTick_End
;MOV OSTickCtr, OSTickRate
LCALL _?OSIntEnter
LCALL _?OSTimeTick
LCALL _?OSIntExit
OSTick_End:
POPALL
RET
ResetHwIntr:
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -