⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.xff

📁 ucos v2.62 安装程序 附带已移植到C8051F020的UCOS源码
💻 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 + -