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

📄 os_core.src

📁 在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释
💻 SRC
📖 第 1 页 / 共 5 页
字号:
	MOV  	DPL,?C_XBP+01H
	CLR  	A
	MOV  	B,#01H
	LCALL	?C?IILDX
	SJMP 	?C0010
?C0011:
;     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
			; SOURCE LINE # 267
	MOV  	DPTR,#OSEventTbl+0BH
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
;     OSEventFreeList                          = &OSEventTbl[0];    
			; SOURCE LINE # 268
	MOV  	R3,#01H
	MOV  	DPTR,#OSEventFreeList
	INC  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#HIGH (OSEventTbl)
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#LOW (OSEventTbl)
	MOVX 	@DPTR,A
; #endif
; 
; #if OS_Q_EN && (OS_MAX_QS >= 2)
;     OSQInit();                                             /* Initialize the message queue structures  */
; #endif
; 
; #if OS_MEM_EN && OS_MAX_MEM_PART >= 2
;     OSMemInit();                                           /* Initialize the memory manager            */
; #endif    
; 
; #if OS_STK_GROWTH == 1
;     #if OS_TASK_CREATE_EXT_EN
;     OSTaskCreateExt(OSTaskIdle, 
;                     (void *)0,                                 /* No arguments passed to OSTaskIdle()  */
;                     &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Top-Of-Stack                     */
;                     OS_IDLE_PRIO,                              /* Lowest priority level                */
;                     OS_TASK_IDLE_ID,
;                     &OSTaskIdleStk[0],                         /* Set Bottom-Of-Stack                  */
;                     OS_TASK_IDLE_STK_SIZE, 
;                     (void *)0,                                 /* No TCB extension                     */
;                     OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack  */
;     #else
;     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
;     #endif
; #else
;     #if OS_TASK_CREATE_EXT_EN
;     OSTaskCreateExt(OSTaskIdle, 
;                     (void *)0,                                 /* No arguments passed to OSTaskIdle()  */
;                     &OSTaskIdleStk[0],                         /* Set Top-Of-Stack                     */
;                     OS_IDLE_PRIO,                              /* Lowest priority level                */
;                     OS_TASK_IDLE_ID,
;                     &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Bottom-Of-Stack                  */
;                     OS_TASK_IDLE_STK_SIZE, 
;                     (void *)0,                                 /* No TCB extension                     */
;                     OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack  */
;     #else
;     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
			; SOURCE LINE # 305
	MOV  	DPTR,#0FFFFH
	LCALL	?C?ADDXBP
	MOV  	A,#01CH
	MOVX 	@DPTR,A
	MOV  	R3,#01H
	MOV  	R2,#HIGH (OSTaskIdleStk)
	MOV  	R1,#LOW (OSTaskIdleStk)
	MOV  	DPTR,#0FFFDH
	LCALL	?C?ADDXBP
	MOV  	A,R3
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R2
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
	MOV  	R3,#00H
	MOV  	R2,#00H
	MOV  	R1,#00H
	MOV  	DPTR,#0FFFDH
	LCALL	?C?ADDXBP
	MOV  	A,R3
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R2
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
	MOV  	R3,#0FFH
	MOV  	R2,#HIGH (_?OSTaskIdle)
	MOV  	R1,#LOW (_?OSTaskIdle)
	LCALL	_?OSTaskCreate
;     #endif
; #endif
; 
; #if OS_TASK_STAT_EN 
;     #if OS_TASK_CREATE_EXT_EN
;         #if OS_STK_GROWTH == 1
;         OSTaskCreateExt(OSTaskStat, 
;                         (void *)0,                                /* No args passed to OSTaskStat()    */
;                         &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],/* Set Top-Of-Stack                  */
;                         OS_STAT_PRIO,                             /* One higher than the idle task     */
;                         OS_TASK_STAT_ID,
;                         &OSTaskStatStk[0],                        /* Set Bottom-Of-Stack               */
;                         OS_TASK_STAT_STK_SIZE, 
;                         (void *)0,                                /* No TCB extension                  */
;                         OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
;         #else
;         OSTaskCreateExt(OSTaskStat, 
;                         (void *)0,                                /* No args passed to OSTaskStat()    */
;                         &OSTaskStatStk[0],                        /* Set Top-Of-Stack                  */
;                         OS_STAT_PRIO,                             /* One higher than the idle task     */
;                         OS_TASK_STAT_ID,
;                         &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],/* Set Bottom-Of-Stack               */
;                         OS_TASK_STAT_STK_SIZE, 
;                         (void *)0,                                /* No TCB extension                  */
;                         OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
;         #endif
;     #else
;         #if OS_STK_GROWTH == 1
;         OSTaskCreate(OSTaskStat, 
;                      (void *)0,                                   /* No args passed to OSTaskStat()    */
;                      &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Top-Of-Stack                  */
;                      OS_STAT_PRIO);                               /* One higher than the idle task     */
;         #else
;         OSTaskCreate(OSTaskStat, 
;                      (void *)0,                                   /* No args passed to OSTaskStat()    */
;                      &OSTaskStatStk[0],                           /* Set Top-Of-Stack                  */
;                      OS_STAT_PRIO);                               /* One higher than the idle task     */
;         #endif
;     #endif
; #endif
; }
			; SOURCE LINE # 346
	MOV  	DPTR,#02H
	LJMP 	?C?ADDXBP
; END OF _?OSInit

; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                              ENTER ISR
; *
; * Description: This function is used to notify uC/OS-II that you are about to service an interrupt
; *              service routine (ISR).  This allows uC/OS-II to keep track of interrupt nesting and thus
; *              only perform rescheduling at the last nested ISR.
; *
; * Arguments  : none
; *
; * Returns    : none
; *
; * Notes      : 1) Your ISR can directly increment OSIntNesting without calling this function because 
; *                 OSIntNesting has been declared 'global'.  You MUST, however, be sure that the increment
; *                 is performed 'indivisibly' by your processor to ensure proper access to this critical
; *                 resource.
; *              2) You MUST still call OSIntExit() even though you increment OSIntNesting directly.
; *              3) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
; *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
; *                 end of the ISR.
; *********************************************************************************************************
; */
; 
; void OSIntEnter (void) reentrant

	RSEG  ?PR?_?OSIntEnter?OS_CORE
_?OSIntEnter:
			; SOURCE LINE # 371
; {
;     OS_ENTER_CRITICAL();
			; SOURCE LINE # 373
	CLR  	EA
;     OSIntNesting++;                              /* Increment ISR nesting level                        */
			; SOURCE LINE # 374
	MOV  	DPTR,#OSIntNesting
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
;     OS_EXIT_CRITICAL();
			; SOURCE LINE # 375
	SETB 	EA
; }
			; SOURCE LINE # 376
	RET  	
; END OF _?OSIntEnter

; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                               EXIT ISR
; *
; * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR.  When 
; *              the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
; *              a new, high-priority task, is ready to run.
; *
; * Arguments  : none
; *
; * Returns    : none
; *
; * Notes      : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
; *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
; *                 end of the ISR.
; *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
; *********************************************************************************************************
; */
; 
; void OSIntExit (void) reentrant

	RSEG  ?PR?_?OSIntExit?OS_CORE
_?OSIntExit:
	USING	0
			; SOURCE LINE # 397
; {
;     OS_ENTER_CRITICAL();
			; SOURCE LINE # 399
	CLR  	EA
;     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
			; SOURCE LINE # 400
	MOV  	DPTR,#OSLockNesting
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#OSIntNesting
	MOVX 	A,@DPTR
	DEC  	A
	MOV  	R6,A
	MOVX 	@DPTR,A
	MOV  	A,R7
	ORL  	A,R6
	JNZ  	?C0015
;         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
			; SOURCE LINE # 401
	MOV  	DPTR,#OSRdyGrp
	MOVX 	A,@DPTR
	MOV  	DPTR,#OSUnMapTbl
	MOVC 	A,@A+DPTR
	MOV  	DPTR,#OSIntExitY
	MOVX 	@DPTR,A
;         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
			; SOURCE LINE # 402
	MOVX 	A,@DPTR
	MOV  	R7,A
	ADD  	A,#LOW (OSRdyTbl)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (OSRdyTbl)
	MOV  	DPH,A
	MOVX 	A,@DPTR
	MOV  	DPTR,#OSUnMapTbl
	MOVC 	A,@A+DPTR
	MOV  	R6,A
	MOV  	A,R7
	RLC  	A
	RLC  	A
	RLC  	A
	ANL  	A,#0F8H
	MOV  	R7,A
	MOV  	A,R6
	ADD  	A,R7
	MOV  	R7,A
	MOV  	R0,#LOW (OSPrioHighRdy)
	MOV  	@R0,A
;         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
			; SOURCE LINE # 403
	DEC  	R0
	MOV  	A,@R0
	XRL  	A,R7
	JZ   	?C0015
;             OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
			; SOURCE LINE # 404
	INC  	R0
	MOV  	A,@R0
	MOV  	B,#03H
	MUL  	AB
	ADD  	A,#LOW (OSTCBPrioTbl)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (OSTCBPrioTbl)
	MOV  	DPH,A
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R0,#LOW (OSTCBHighRdy)
	MOV  	@R0,AR3
	INC  	R0
	MOV  	@R0,AR2
	INC  	R0
	MOV  	@R0,A
;             OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
			; SOURCE LINE # 405
	MOV  	DPTR,#OSCtxSwCtr
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	ADD  	A,#01H
	MOV  	R7,A
	CLR  	A
	ADDC 	A,R6
	MOV  	R6,A
	CLR  	A
	ADDC 	A,R5
	MOV  	R5,A
	CLR  	A
	ADDC 	A,R4
	MOV  	R4,A
	MOV  	DPTR,#OSCtxSwCtr
	LCALL	?C?LSTXDATA
;             OSIntCtxSw();                        /* Perform interrupt level context switch             */
			; SOURCE LINE # 406
	LCALL	OSIntCtxSw
;         }
			; SOURCE LINE # 407
;     }
			; SOURCE LINE # 408
?C0015:
;     OS_EXIT_CRITICAL();
			; SOURCE LINE # 409
	SETB 	EA
; }
			; SOURCE LINE # 410
	RET  	
; END OF _?OSIntExit

; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                              SCHEDULER
; *
; * Description: This function is called by other uC/OS-II services to determine whether a new, high
; *              priority task has been made ready to run.  This function is invoked by TASK level code
; *              and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
; *
; * Arguments  : none
; *
; * Returns    : none
; *
; * Notes      : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
; *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
; *********************************************************************************************************
; */
; 
; void OSSched (void) reentrant

	RSEG  ?PR?_?OSSched?OS_CORE
_?OSSched:
	USING	0
			; SOURCE LINE # 429
	MOV  	DPTR,#0FFFFH
	LCALL	?C?ADDXBP
; {
;     INT8U y;
; 
; 
;     OS_ENTER_CRITICAL();
			; SOURCE LINE # 434
	CLR  	EA
;     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
			; SOURCE LINE # 435
	MOV  	DPTR,#OSIntNesting
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#OSLockNesting
	MOVX 	A,@DPTR
	ORL  	A,R7
	JNZ  	?C0018
;         y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
			; SOURCE LINE # 436
	MOV  	DPTR,#OSRdyGrp
	MOVX 	A,@DPTR
	MOV  	DPTR,#OSUnMapTbl
	MOVC 	A,@A+DPTR
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	@DPTR,A
;         OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
			; SOURCE LINE # 437
	MOVX 	A,@DPTR
	MOV  	R7,A
	ADD  	A,#LOW (OSRdyTbl)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (OSRdyTbl)
	MOV  	DPH,A
	MOVX 	A,@DPTR
	MOV  	DPTR,#OSUnMapTbl
	MOVC 	A,@A+DPTR
	MOV  	R6,A
	MOV  	A,R7
	RLC  	A
	RLC  	A
	RLC  	A
	ANL  	A,#0F8H
	MOV  	R7,A
	MOV  	A,R6
	ADD  	A,R7
	MOV  	R7,A
	MOV  	R0,#LOW (OSPrioHighRdy)
	MOV  	@R0,A
;         if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
			; SOURCE LINE # 438
	DEC  	R0
	MOV  	A,@R0
	XRL  	A,R7
	JZ   	?C0018
;             OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
			; SOURCE LINE # 439
	INC  	R0
	MOV  	A,@R0
	MOV  	B,#03H
	MUL  	AB
	ADD  	A,#LOW (OSTCBPrioTbl)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (OSTCBPrioTbl)
	MOV  	DPH,A
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R0,#LOW (OSTCBHighRdy)
	MOV  	@R0,AR3
	INC  	R0
	MOV  	@R0,AR2
	INC  	R0
	MOV  	@R0,A
;             OSCtxSwCtr++;                        /* Increment context switch counter                   */
			; SOURCE LINE # 440
	MOV  	DPTR,#OSCtxSwCtr
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	ADD  	A,#01H
	MOV  	R7,A
	CLR  	A
	ADDC 	A,R6
	MOV  	R6,A
	CLR  	A
	ADDC 	A,R5
	MOV  	R5,A
	CLR  	A
	ADDC 	A,R4
	MOV  	R4,A
	MOV  	DPTR,#OSCtxSwCtr
	LCALL	?C?LSTXDATA
;             OS_TASK_SW();                        /* Perform a context switch                           */
			; SOURCE LINE # 441
	LCALL	OSCtxSw
;         }
			; SOURCE LINE # 442
;     }
			; SOURCE LINE # 443
?C0018:
;     OS_EXIT_CRITICAL();
			; SOURCE LINE # 444
	SETB 	EA
; }
			; SOURCE LINE # 445
	MOV  	DPTR,#01H
	LJMP 	?C?ADDXBP
; END OF _?OSSched

; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                          PREVENT SCHEDULING
; *

⌨️ 快捷键说明

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