📄 os_cpu_a_i.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
;********************************************************************************************************
PUBLIC _?OSTickISR
PUBLIC _?OSStartHighRdy
PUBLIC _?OSCtxSw
PUBLIC _?OSIntCtxSw
EXTRN IDATA (OSTCBCur)
EXTRN IDATA (OSTCBHighRdy)
EXTRN IDATA (OSPrioCur)
EXTRN IDATA (OSPrioHighRdy)
EXTRN IDATA (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
;********************************************************************************************************
?STACK SEGMENT IDATA
RSEG ?STACK
OSStack: ; SP start address (acllocation by keil c)
DT?C_XBP SEGMENT DATA
RSEG DT?C_XBP
?C_XBP: ; Data stack pointer (acllocation by keil c)
C_XBP: DS 1
DT?OS_CPU_A SEGMENT DATA
RSEG DT?OS_CPU_A
OSTickRate:
DS 1
OSTickCtr:
DS 1
;********************************************************************************************************
; void OSStartHighRdy(void);
;********************************************************************************************************
?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
RSEG ?PR?OSStartHighRdy?OS_CPU_A
_?OSStartHighRdy:
LCALL _?OSTaskSwHook
; OSRunning = TRUE;
MOV R0, #OSRunning
MOV @R0, #01
LJMP C_XBP_Load
;********************************************************************************************************
; void OSCtxSw(void);
;********************************************************************************************************
?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
RSEG ?PR?OSCtxSw?OS_CPU_A
_?OSCtxSw:
PUSHALL
SP_Offset:
LoadXBP
MOV A, SP
CLR C
SUBB A, #OSStack-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
INC DPTR
MOV R0, #OSStack
Stack_Save_Loop:
SaveREG @R0
INC DPTR
INC R0
DJNZ R5, Stack_Save_Loop
;POPALL
; OSTCBCur->OSTCBStkPtr = C_XBP;
MOV R0, #LOW(OSTCBCur)
INC R0
MOV DPH, @R0
INC R0
MOV DPL, @R0
INC DPTR
MOV A, C_XBP
MOVX @DPTR, A
INC DPTR
MOV A, C_XBP+1
MOVX @DPTR, A
LCALL _?OSTaskSwHook
; OSTCBCur = OSTCBHighRdy;
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
; OSPrioCur = OSPrioHighRdy;
MOV R0, #OSPrioCur
MOV R1, #OSPrioHighRdy
MOV A, @R1
MOV @R0, A
C_XBP_Load:
; C_XBP = OSTCBCur->OSTCBStkPtr;
MOV R0, #LOW(OSTCBCur)
INC R0
MOV DPH, @R0
INC R0
MOV DPL, @R0
INC DPTR
MOVX A, @DPTR
MOV C_XBP, A
INC DPTR
MOVX A, @DPTR
MOV C_XBP+1,A
SP_Load:
LoadXBP
LoadREG R5
MOV R0, #OSStack-1
Stack_Load_Loop:
INC DPTR
INC R0
LoadREG @R0
DJNZ R5, Stack_Load_Loop
MOV SP, R5
SaveXBP
; OSTCBCur->OSTCBStkPtr = C_XBP;
POPALL
RET
;********************************************************************************************************
; void OSIntCtxSw(void);
;********************************************************************************************************
?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
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
?PR?OSTickISR?OS_CPU_A SEGMENT CODE
RSEG ?PR?OSTickISR?OS_CPU_A
_?OSTickISR:
LCALL ResetHwIntr
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 + -