www.pudn.com > uCOSV262.rar > 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