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

📄 os_cpu_c.src

📁 我移植的uCos 2.86 版本,可以在单片51上运行,在AT89C51ED2上测试过.
💻 SRC
📖 第 1 页 / 共 3 页
字号:
; 	PUSH(1);                   // should be R1
			; SOURCE LINE # 103
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0027
	DEC  	stk?044+01H
?C0027:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#01H
	LCALL	?C?CSTPTR
; 	PUSH(2);                   // should be R2
			; SOURCE LINE # 104
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0028
	DEC  	stk?044+01H
?C0028:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#02H
	LCALL	?C?CSTPTR
; 	PUSH(3);                   // should be R3
			; SOURCE LINE # 105
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0029
	DEC  	stk?044+01H
?C0029:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#03H
	LCALL	?C?CSTPTR
; 
; //	stk				+= sizeof(void *);      /* Keil C uses R1,R2,R3 to pass the */
; //	*(void**)stk	 = vd;                  /* arguments of functions.          */
; 
; 	PUSH(4);                   /* R4  */
			; SOURCE LINE # 110
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0030
	DEC  	stk?044+01H
?C0030:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#04H
	LCALL	?C?CSTPTR
; 	PUSH(5);                   /* R5  */
			; SOURCE LINE # 111
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0031
	DEC  	stk?044+01H
?C0031:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#05H
	LCALL	?C?CSTPTR
; 	PUSH(6);                   /* R6  */
			; SOURCE LINE # 112
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0032
	DEC  	stk?044+01H
?C0032:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#06H
	LCALL	?C?CSTPTR
; 	PUSH(7);                   /* R7  */
			; SOURCE LINE # 113
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0033
	DEC  	stk?044+01H
?C0033:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#07H
	LCALL	?C?CSTPTR
; 
; /* Following is the registers pushed into hardware stack manually to support the dallas 390 */
;     PUSH(0x80);                /* IE, EA is enabled  */
			; SOURCE LINE # 116
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0034
	DEC  	stk?044+01H
?C0034:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#080H
	LCALL	?C?CSTPTR
; /*
;     Next is calculating the hardware stack pointer.
; */	
;     PUSH((INT8U) (STACK_START-2      /* Initial value when main was called    */
; 	                   +1                   /* IE */
; 	                   +8                   /* R0-R7, eight registers was saved      */
;                        +5                   /* ACC, B, DPH, DPL, PSW, five registers */
;                        //+1                   /* Dallas 390 extra registers DPX1 */
; //                       +4                   /* Dallas 390 extra registers for second DPTR - DPL1 DPH1 DPX1 DPS */
;                        +sizeof(INT16U))      /* The PC value to be loaded             */
;                        //+sizeof(INT8U)       /* The third byte of PC value to be loaded for dallas 390  */
; 					   );
			; SOURCE LINE # 128
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0035
	DEC  	stk?044+01H
?C0035:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	MOV  	A,#LOW (STACK_START+0EH)
	LCALL	?C?CSTPTR
; 	PUSH(0);				   /* C_IBP  *--CIBP */
			; SOURCE LINE # 129
	MOV  	R3,stk?044
	MOV  	A,stk?044+02H
	DEC  	stk?044+02H
	JNZ  	?C0036
	DEC  	stk?044+01H
?C0036:
	DEC  	A
	MOV  	R1,A
	MOV  	R2,stk?044+01H
	CLR  	A
	LCALL	?C?CSTPTR
;     return ((void *)stk);
			; SOURCE LINE # 130
	MOV  	R6,stk?044+01H
	MOV  	R7,stk?044+02H
; }
			; SOURCE LINE # 131
?C0001:
	RET  	
; END OF _OSTaskStkInit

; 
; //OS_EXT  OS_TCB  *OSTCBHighRdy;                    /* Pointer to highest priority TCB ready to run  */
; extern void LoadCtx() KCREENTRANT;   /* Save the current working registers to stack, defined in OS_CPU_A.ASM */
; 
; /*
; ***********************************************************************************************************
; * OSStartHighRdy: START MULTITASKING
; *     
; * Duty:     a) Call OSTaskSwHook() then,
; *           b) Set OSRunning to TRUE,
; *           c) Switch to the highest priority task.
; *
; ***********************************************************************************************************
; */
; void OSStartHighRdy(void) KCREENTRANT

	RSEG  ?PR?OSStartHighRdy?OS_CPU_C
OSStartHighRdy:
	USING	0
			; SOURCE LINE # 146
; {
			; SOURCE LINE # 147
;     OSTaskSwHook();
			; SOURCE LINE # 148
	LCALL	OSTaskSwHook
; 	OSRunning=1;
			; SOURCE LINE # 149
	MOV  	OSRunning,#01H
; 
; 	C_XBP = OSTCBHighRdy->OSTCBStkPtr;
			; SOURCE LINE # 151
	MOV  	R0,#LOW (OSTCBHighRdy)
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	DPL,A
	MOV  	DPH,R6
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	C_XBP,R6
	MOV  	C_XBP+01H,A
; 
; 	LoadCtx();
			; SOURCE LINE # 153
	LJMP 	LoadCtx
; END OF OSStartHighRdy

; }
; 
; /**********************************************************************************************************
; * C_OSCtxSw is the c part of OSCtxSw.
; * When control passes to this function, the processor registers have been saved in external stack
; ***********************************************************************************************************/
; void C_OSCtxSw(void) KCREENTRANT

	RSEG  ?PR?C_OSCtxSw?OS_CPU_C
C_OSCtxSw:
	USING	0
			; SOURCE LINE # 160
; {
			; SOURCE LINE # 161
; /*	Save processor registers; DONE in the OSCtxSw part in OS_CPU_ASM.ASM                                  */
; 
; /*	Save the current task's stack pointer into the current task's OS_TCB:  
; 		OSTCBCur->OSTCBStkPtr = Stack pointer;
; 	Call user definable OSTaskSwHook();                                    
; 	OSTCBCur  = OSTCBHighRdy;                                              
; 	OSPrioCur = OSPrioHighRdy;                                             
; 	Get the stack pointer of the task to resume:                           
; 		Stack pointer = OSTCBHighRdy->OSTCBStkPtr;
; 	Restore all processor registers from the new task's stack;             
; 	Execute a return from interrupt instruction;                           */
; 
;     OSTCBCur->OSTCBStkPtr = C_XBP;
			; SOURCE LINE # 174
	MOV  	R0,#LOW (OSTCBCur)
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	DPL,A
	MOV  	DPH,R6
	MOV  	A,C_XBP
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,C_XBP+01H
	MOVX 	@DPTR,A
;     
; 	OSTaskSwHook();
			; SOURCE LINE # 176
	LCALL	OSTaskSwHook
;     OSTCBCur  = OSTCBHighRdy;
			; SOURCE LINE # 177
	MOV  	R0,#LOW (OSTCBHighRdy)
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	R7,A
	MOV  	R0,#LOW (OSTCBCur)
	MOV  	@R0,AR6
	INC  	R0
	MOV  	@R0,AR7
;     OSPrioCur = OSPrioHighRdy;
			; SOURCE LINE # 178
	MOV  	OSPrioCur,OSPrioHighRdy
; 
;     C_XBP       = OSTCBCur->OSTCBStkPtr;
			; SOURCE LINE # 180
	DEC  	R0
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	DPL,A
	MOV  	DPH,R6
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	C_XBP,R6
	MOV  	C_XBP+01H,A
;     LoadCtx();
			; SOURCE LINE # 181
	LJMP 	LoadCtx
; END OF C_OSCtxSw

; }
; 
; INT8U data SaveSP;
; INT8U * data SaveC_IBP;
; 
; void OSIntCtxSw(void) KCREENTRANT

	RSEG  ?PR?OSIntCtxSw?OS_CPU_C
OSIntCtxSw:
	USING	0
			; SOURCE LINE # 187
; {
			; SOURCE LINE # 188
; 	EA=0;
			; SOURCE LINE # 189
	CLR  	EA
; #pragma ASM
; 	// SP=SaveSP
	  
; 	// C_IBP=SaveC_IBP;
	  
; 	MOV SP,SaveSP
	  MOV SP,SaveSP
; 	MOV	?C_IBP,SaveC_IBP
	  MOV	?C_IBP,SaveC_IBP
; #pragma ENDASM
; 
;     C_XBP = OSTCBCur->OSTCBStkPtr;
			; SOURCE LINE # 197
	MOV  	R0,#LOW (OSTCBCur)
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	DPL,A
	MOV  	DPH,R6
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	C_XBP,R6
	MOV  	C_XBP+01H,A
; 
; #pragma ASM
; 	EXTRN   CODE(_?KCOSCtxSw)
	  EXTRN   CODE(_?KCOSCtxSw)
; 	//MOV		A, #BYTE0( _?KCOSCtxSw)
	  
; 	//PUSH	ACC
	  
; 	//MOV		A, #BYTE1(_?KCOSCtxSw)
	  
; 	//PUSH	ACC
	  
; 	MOV		A, #LOW( _?KCOSCtxSw)
	  MOV		A, #LOW( _?KCOSCtxSw)
; 	PUSH	ACC
	  PUSH ACC
; 	MOV		A, #HIGH(_?KCOSCtxSw)
	  MOV		A, #HIGH(_?KCOSCtxSw)
; 	PUSH	ACC
	  PUSH ACC
; 	//MOV		A, #BYTE2(_?KCOSCtxSw)
	  
; 	//PUSH	ACC
	  
; 	RETI
	  RETI
; #pragma ENDASM	
; }
			; SOURCE LINE # 213
	RET  	
; END OF OSIntCtxSw

CSEG	AT	0000BH
	LJMP	OSTickISR

; 
; /* OSTickISR can be writen in c language now, so it is more easy for user to write code for their own */
; void OSTickISR(void) interrupt BSP_OS_TMR_SEL

	RSEG  ?PR?OSTickISR?OS_CPU_C
	USING	0
OSTickISR:
	PUSH 	ACC
	PUSH 	B
	PUSH 	DPH
	PUSH 	DPL
	XRL  	AUXR1,#01H
	PUSH 	DPH
	PUSH 	DPL
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR1
	PUSH 	AR2
	PUSH 	AR3
	PUSH 	AR4
	PUSH 	AR5
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 216
; {
; TH0=(OS_Time_Count)>>8;
			; SOURCE LINE # 218
	MOV  	TH0,#0B8H
; TL0+=OS_Time_Count;
			; SOURCE LINE # 219
; /* Do this first */
;     OSIntNesting++;                      /* Increment ISR nesting level directly to speed up processing */
			; SOURCE LINE # 221
	INC  	OSIntNesting
; //	OSIntEnter();					/* Must be called first at every hardware interrupt entry point */
;     if(OSIntNesting==1)                     /* Only at the outerest interrupt we do these. */
			; SOURCE LINE # 223
	MOV  	A,OSIntNesting
	CJNE 	A,#01H,?C0005
; 		{
			; SOURCE LINE # 224
; #pragma ASM
; 		PUSH IE
	  PUSH IE
; #pragma ENDASM 
; 		EA=0;
			; SOURCE LINE # 228
	CLR  	EA
; #pragma ASM
; 		//SaveC_IBP=C_IBP;
	  
; 		//SaveSP=SP;		
	  
; 		MOV	SaveC_IBP,?C_IBP	
	  MOV	SaveC_IBP,?C_IBP	
; 		MOV SaveSP,SP
	  MOV SaveSP,SP
; #pragma ENDASM
;         OSTCBCur->OSTCBStkPtr = C_XBP;	/* OSTCBCur->OSTCBStkPtr is free now, so it can be used to story the value of SP */
			; SOURCE LINE # 235
	MOV  	R0,#LOW (OSTCBCur)
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	DPL,A
	MOV  	DPH,R6
	MOV  	A,C_XBP
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,C_XBP+01H
	MOVX 	@DPTR,A
; 		EA=1;
			; SOURCE LINE # 236
	SETB 	EA
;     	}
			; SOURCE LINE # 237
?C0005:
;    	OSTimeTick();					/* Must be called during tick isr */
			; SOURCE LINE # 238
	LCALL	OSTimeTick
;    	OSIntExit();					/* Must be called finally at every hardware interupt exit point */
			; SOURCE LINE # 239
	LCALL	OSIntExit
;     if(OSIntNesting==0)
			; SOURCE LINE # 240
	MOV  	A,OSIntNesting
	JNZ  	?C0007
; 	{
			; SOURCE LINE # 241
; 		EA=0;
			; SOURCE LINE # 242

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -