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

📄 os_core.src

📁 在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释
💻 SRC
📖 第 1 页 / 共 5 页
字号:
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
;     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
; };
; 
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                             MAKE TASK READY TO RUN BASED ON EVENT OCCURING
; *
; * Description: This function is called by other uC/OS-II services and is used to ready a task that was
; *              waiting for an event to occur.
; *
; * Arguments  : pevent    is a pointer to the event control block corresponding to the event.
; *
; *              msg       is a pointer to a message.  This pointer is used by message oriented services
; *                        such as MAILBOXEs and QUEUEs.  The pointer is not used when called by other
; *                        service functions.
; *
; *              msk       is a mask that is used to clear the status byte of the TCB.  For example,
; *                        OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void  OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk) reentrant
; {
;     OS_TCB *ptcb;
;     INT8U   x;
;     INT8U   y;
;     INT8U   bitx;
;     INT8U   bity;
;     INT8U   prio;
; 
; 
;     y    = OSUnMapTbl[pevent->OSEventGrp];            /* Find highest prio. task waiting for message   */
;     bity = OSMapTbl[y];
;     x    = OSUnMapTbl[pevent->OSEventTbl[y]];
;     bitx = OSMapTbl[x];
;     prio = (INT8U)((y << 3) + x);                     /* Find priority of task getting the msg         */
;     if ((pevent->OSEventTbl[y] &= ~bitx) == 0) {      /* Remove this task from the waiting list        */
;         pevent->OSEventGrp &= ~bity;
;     }
;     ptcb                 =  OSTCBPrioTbl[prio];       /* Point to this task's OS_TCB                   */
;     ptcb->OSTCBDly       =  0;                        /* Prevent OSTimeTick() from readying task       */
;     ptcb->OSTCBEventPtr  = (OS_EVENT *)0;             /* Unlink ECB from this task                     */
; #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
;     ptcb->OSTCBMsg       = msg;                       /* Send message directly to waiting task         */
; #else
;     msg                  = msg;                       /* Prevent compiler warning if not used          */    
; #endif    
;     ptcb->OSTCBStat     &= ~msk;                      /* Clear bit associated with event type          */
;     if (ptcb->OSTCBStat == OS_STAT_RDY) {             /* See if task is ready (could be susp'd)        */
;         OSRdyGrp        |=  bity;                     /* Put task in the ready to run list             */
;         OSRdyTbl[y]     |=  bitx;
;     }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                   MAKE TASK WAIT FOR EVENT TO OCCUR
; *
; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
; *              not occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block for which the task will be waiting for.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void  OSEventTaskWait (OS_EVENT *pevent) reentrant
; {
;     OSTCBCur->OSTCBEventPtr = pevent;            /* Store pointer to event control block in TCB        */
;     if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {      /* Task no longer ready      */
;         OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
;     }
;     pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
;     pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                              MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
; *
; * Description: This function is called by other uC/OS-II services to make a task ready to run because a
; *              timeout occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block which is readying a task.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void  OSEventTO (OS_EVENT *pevent) reentrant
; {
;     if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
;         pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
;     }
;     OSTCBCur->OSTCBStat     = OS_STAT_RDY;       /* Set status to ready                                */
;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;     /* No longer waiting for event                        */
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                 INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
; *
; * Description: This function is called by other uC/OS-II services to initialize the event wait list.
; *
; * Arguments  : pevent    is a pointer to the event control block allocated to the event.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void  OSEventWaitListInit (OS_EVENT *pevent) reentrant
; {
;     INT8U i;
;     
;     
;     pevent->OSEventGrp = 0x00;                   /* No task waiting on event                           */
;     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;         pevent->OSEventTbl[i] = 0x00;
;     }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                             INITIALIZATION
; *
; * Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
; *              creating any uC/OS-II object and, prior to calling OSStart().
; *
; * Arguments  : none
; *
; * Returns    : none
; *********************************************************************************************************
; */
; 
; void OSInit (void) reentrant

	RSEG  ?PR?_?OSInit?OS_CORE
_?OSInit:
	USING	0
			; SOURCE LINE # 225
	MOV  	DPTR,#0FFFEH
	LCALL	?C?ADDXBP
; {
;     INT16U i;
; 
; 
;     OSTime        = 0L;                                    /* Clear the 32-bit system clock            */
			; SOURCE LINE # 230
	MOV  	DPTR,#OSTime
	LCALL	?C?LSTKXDATA
	DB   	00H
	DB   	00H
	DB   	00H
	DB   	00H
;     OSIntNesting  = 0;                                     /* Clear the interrupt nesting counter      */
			; SOURCE LINE # 231
	CLR  	A
	MOV  	DPTR,#OSIntNesting
	MOVX 	@DPTR,A
;     OSLockNesting = 0;                                     /* Clear the scheduling lock counter        */
			; SOURCE LINE # 232
	MOV  	DPTR,#OSLockNesting
	MOVX 	@DPTR,A
; #if OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
;     OSTaskCtr     = 0;                                     /* Clear the number of tasks                */
			; SOURCE LINE # 234
	MOV  	DPTR,#OSTaskCtr
	MOVX 	@DPTR,A
; #endif
;     OSRunning     = FALSE;                                 /* Indicate that multitasking not started   */
			; SOURCE LINE # 236
	MOV  	R0,#LOW (OSRunning)
	MOV  	@R0,A
;     OSIdleCtr     = 0L;                                    /* Clear the 32-bit idle counter            */
			; SOURCE LINE # 237
	MOV  	DPTR,#OSIdleCtr
	LCALL	?C?LSTKXDATA
	DB   	00H
	DB   	00H
	DB   	00H
	DB   	00H
; #if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
;     OSIdleCtrRun  = 0L;
;     OSIdleCtrMax  = 0L;
;     OSStatRdy     = FALSE;                                 /* Statistic task is not ready              */
; #endif
;     OSCtxSwCtr    = 0;                                     /* Clear the context switch counter         */
			; SOURCE LINE # 243
	MOV  	DPTR,#OSCtxSwCtr
	LCALL	?C?LSTKXDATA
	DB   	00H
	DB   	00H
	DB   	00H
	DB   	00H
;     OSRdyGrp      = 0;                                     /* Clear the ready list                     */
			; SOURCE LINE # 244
	CLR  	A
	MOV  	DPTR,#OSRdyGrp
	MOVX 	@DPTR,A
;     for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
			; SOURCE LINE # 245
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
?C0001:
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#04H
	MOV  	A,R6
	SUBB 	A,#00H
	JNC  	?C0002
;         OSRdyTbl[i] = 0;
			; SOURCE LINE # 246
	MOV  	A,#LOW (OSRdyTbl)
	ADD  	A,R7
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (OSRdyTbl)
	MOV  	DPH,A
	CLR  	A
	MOVX 	@DPTR,A
;     }
			; SOURCE LINE # 247
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOV  	B,#01H
	LCALL	?C?IILDX
	SJMP 	?C0001
?C0002:
;                 
;     OSPrioCur     = 0;
			; SOURCE LINE # 249
	CLR  	A
	MOV  	R0,#LOW (OSPrioCur)
	MOV  	@R0,A
;     OSPrioHighRdy = 0;                                           
			; SOURCE LINE # 250
	INC  	R0
	MOV  	@R0,A
;     OSTCBHighRdy  = (OS_TCB *)0;                                 /* TCB Initialization                 */
			; SOURCE LINE # 251
	MOV  	R0,#LOW (OSTCBHighRdy)
	MOV  	@R0,A
	INC  	R0
	MOV  	@R0,A
	INC  	R0
	MOV  	@R0,A
;     OSTCBCur      = (OS_TCB *)0;
			; SOURCE LINE # 252
	MOV  	R0,#LOW (OSTCBCur)
	MOV  	@R0,A
	INC  	R0
	MOV  	@R0,A
	INC  	R0
	MOV  	@R0,A
;     OSTCBList     = (OS_TCB *)0;
			; SOURCE LINE # 253
	MOV  	R1,A
	MOV  	DPTR,#OSTCBList
	XCH  	A,R1
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
;     for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table           */
			; SOURCE LINE # 254
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
?C0004:
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#01DH
	MOV  	A,R6
	SUBB 	A,#00H
	JNC  	?C0005
;         OSTCBPrioTbl[i] = (OS_TCB *)0;
			; SOURCE LINE # 255
	MOV  	DPTR,#OSTCBPrioTbl
	MOV  	B,#03H
	MOV  	A,R7
	LCALL	?C?OFFXADD
	MOV  	A,R6
	MOV  	B,#03H
	MUL  	AB
	ADD  	A,DPH
	MOV  	DPH,A
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
;     }
			; SOURCE LINE # 256
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOV  	B,#01H
	LCALL	?C?IILDX
	SJMP 	?C0004
?C0005:
;     for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs            */
			; SOURCE LINE # 257
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
?C0007:
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#01BH
	MOV  	A,R6
	SUBB 	A,#00H
	JNC  	?C0008
;         OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
			; SOURCE LINE # 258
	MOV  	R4,#00H
	MOV  	R5,#011H
	LCALL	?C?IMUL
	MOV  	A,#LOW (OSTCBTbl+011H)
	ADD  	A,R7
	MOV  	R1,A
	MOV  	A,#HIGH (OSTCBTbl+011H)
	ADDC 	A,R6
	MOV  	R2,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	DPTR,#OSTCBTbl+03H
	MOV  	B,#011H
	LCALL	?C?OFFXADD
	MOV  	A,R6
	MOV  	B,#011H
	MUL  	AB
	ADD  	A,DPH
	MOV  	DPH,A
	MOV  	A,#01H
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R2
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
;     }
			; SOURCE LINE # 259
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	CLR  	A
	MOV  	B,#01H
	LCALL	?C?IILDX
	SJMP 	?C0007
?C0008:
;     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
			; SOURCE LINE # 260
	MOV  	DPTR,#OSTCBTbl+01CEH
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
;     OSTCBFreeList                                         = &OSTCBTbl[0];
			; SOURCE LINE # 261
	MOV  	DPTR,#OSTCBFreeList
	INC  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#HIGH (OSTCBTbl)
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#LOW (OSTCBTbl)
	MOVX 	@DPTR,A
; 
; #if OS_MAX_EVENTS >= 2
;     for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {            /* Init. list of free EVENT control blocks  */
			; SOURCE LINE # 264
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	CLR  	A
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
?C0010:
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#01H
	MOV  	A,R6
	SUBB 	A,#00H
	JNC  	?C0011
;         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
			; SOURCE LINE # 265
	MOV  	R4,#00H
	MOV  	R5,#0BH
	LCALL	?C?IMUL
	MOV  	A,#LOW (OSEventTbl+0BH)
	ADD  	A,R7
	MOV  	R1,A
	MOV  	A,#HIGH (OSEventTbl+0BH)
	ADDC 	A,R6
	MOV  	R2,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	DPTR,#OSEventTbl
	MOV  	B,#0BH
	LCALL	?C?OFFXADD
	MOV  	A,R6
	MOV  	B,#0BH
	MUL  	AB
	ADD  	A,DPH
	MOV  	DPH,A
	MOV  	A,#01H
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R2
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
;     }
			; SOURCE LINE # 266
	MOV  	DPH,?C_XBP

⌨️ 快捷键说明

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