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

📄 os_task.src

📁 在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释
💻 SRC
📖 第 1 页 / 共 4 页
字号:
;             OS_EXIT_CRITICAL();
;             return (OS_TASK_NOT_SUSPENDED);
;         }
;     }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                             STACK CHECKING 
; *
; * Description: This function is called to check the amount of free memory left on the specified task's
; *              stack.
; *
; * Arguments  : prio     is the task priority
; *
; *              pdata    is a pointer to a data structure of type OS_STK_DATA.
; *
; * Returns    : OS_NO_ERR           upon success
; *              OS_PRIO_INVALID     if the priority you specify is higher that the maximum allowed 
; *                                  (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
; *              OS_TASK_NOT_EXIST   if the desired task has not been created
; *              OS_TASK_OPT_ERR     if you did NOT specified OS_TASK_OPT_STK_CHK when the task was created
; *********************************************************************************************************
; */
; #if   OS_TASK_CREATE_EXT_EN
; INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *ppdata) reentrant
; {
;     OS_TCB  *ptcb;
;     OS_STK  *pchk;
;     INT32U   free;
;     INT32U   size;
; 
; 
;     ppdata->OSFree = 0;                                          /* Assume failure, set to 0 size       */
;     ppdata->OSUsed = 0;
;     if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {        /* Make sure task priority is valid    */
;         return (OS_PRIO_INVALID);
;     }
;     OS_ENTER_CRITICAL();
;     if (prio == OS_PRIO_SELF) {                        /* See if check for SELF                        */
;         prio = OSTCBCur->OSTCBPrio;
;     }
;     ptcb = OSTCBPrioTbl[prio];
;     if (ptcb == (OS_TCB *)0) {                         /* Make sure task exist                         */
;         OS_EXIT_CRITICAL();
;         return (OS_TASK_NOT_EXIST);
;     }
;     if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set       */
;         OS_EXIT_CRITICAL();
;         return (OS_TASK_OPT_ERR);
;     }
;     free = 0;
;     size = ptcb->OSTCBStkSize;
;     pchk = ptcb->OSTCBStkBottom;
;     OS_EXIT_CRITICAL();
; #if OS_STK_GROWTH == 1
;     while (*pchk++ == 0) {                            /* Compute the number of zero entries on the stk */
;         free++;
;     }
; #else
;     while (*pchk-- == 0) {
;         free++;
;     }
; #endif
;     ppdata->OSFree = free * sizeof(OS_STK);            /* Compute number of free bytes on the stack     */
;     ppdata->OSUsed = (size - free) * sizeof(OS_STK);   /* Compute number of bytes used on the stack     */
;     return (OS_NO_ERR);
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                            SUSPEND A TASK
; *
; * Description: This function is called to suspend a task.  The task can be the calling task if the
; *              priority passed to OSTaskSuspend() is the priority of the calling task or OS_PRIO_SELF.
; *
; * Arguments  : prio     is the priority of the task to suspend.  If you specify OS_PRIO_SELF, the
; *                       calling task will suspend itself and rescheduling will occur.
; *
; * Returns    : OS_NO_ERR                if the requested task is suspended
; *              OS_TASK_SUSPEND_IDLE     if you attempted to suspend the idle task which is not allowed.
; *              OS_PRIO_INVALID          if the priority you specify is higher that the maximum allowed 
; *                                       (i.e. >= OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
; *              OS_TASK_SUSPEND_PRIO     if the task to suspend does not exist
; *
; * Note       : You should use this function with great care.  If you suspend a task that is waiting for
; *              an event (i.e. a message, a semaphore, a queue ...) you will prevent this task from
; *              running when the event arrives.
; *********************************************************************************************************
; */
; 
; #if OS_TASK_SUSPEND_EN
; INT8U OSTaskSuspend (INT8U prio) reentrant
; {
;     BOOLEAN   self;
;     OS_TCB   *ptcb;
; 
; 
;     if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to suspend idle task    */
;         return (OS_TASK_SUSPEND_IDLE);
;     }
;     if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
;         return (OS_PRIO_INVALID);
;     }
;     OS_ENTER_CRITICAL();
;     if (prio == OS_PRIO_SELF) {                                 /* See if suspend SELF                 */
;         prio = OSTCBCur->OSTCBPrio;
;         self = TRUE;
;     } else if (prio == OSTCBCur->OSTCBPrio) {                   /* See if suspending self              */
;         self = TRUE;
;     } else {
;         self = FALSE;                                           /* No suspending another task          */
;     }
;     if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {                /* Task to suspend must exist     */
;         OS_EXIT_CRITICAL();
;         return (OS_TASK_SUSPEND_PRIO);
;     } else {
;         if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {     /* Make task not ready            */
;             OSRdyGrp &= ~ptcb->OSTCBBitY;
;         }
;         ptcb->OSTCBStat |= OS_STAT_SUSPEND;                          /* Status of task is 'SUSPENDED'  */
;         OS_EXIT_CRITICAL();
;         if (self == TRUE) {                                          /* Context switch only if SELF    */
;             OSSched();
;         }
;         return (OS_NO_ERR);
;     }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                            QUERY A TASK
; *
; * Description: This function is called to obtain a copy of the desired task's TCB.
; *
; * Arguments  : prio     is the priority of the task to obtain information from.  
; *
; * Returns    : OS_NO_ERR       if the requested task is suspended
; *              OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed 
; *                              (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
; *              OS_PRIO_ERR     if the desired task has not been created 
; *********************************************************************************************************
; */
; 
; INT8U OSTaskQuery (INT8U prio, OS_TCB *ppdata) reentrant

	RSEG  ?PR?_?OSTaskQuery?OS_TASK
_?OSTaskQuery:
	USING	0
			; SOURCE LINE # 700
	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  	DPTR,#0FFFFH
	LCALL	?C?ADDXBP
	MOV  	A,R7
	MOVX 	@DPTR,A
	MOV  	DPTR,#0FFFDH
	LCALL	?C?ADDXBP
; {
;     OS_TCB *ptcb;
; 
; 
;     if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {   /* Task priority valid ?                    */
			; SOURCE LINE # 705
	MOV  	DPTR,#03H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R7,A
	SETB 	C
	SUBB 	A,#01CH
	JC   	?C0009
	MOV  	A,R7
	CPL  	A
	JZ   	?C0009
;         return (OS_PRIO_INVALID);
			; SOURCE LINE # 706
	MOV  	R7,#02AH
	LJMP 	?C0010
;     }
			; SOURCE LINE # 707
?C0009:
;     OS_ENTER_CRITICAL();
			; SOURCE LINE # 708
	CLR  	EA
;     if (prio == OS_PRIO_SELF) {                            /* See if suspend SELF                      */
			; SOURCE LINE # 709
	MOV  	DPTR,#03H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	CJNE 	A,#0FFH,?C0011
;         prio = OSTCBCur->OSTCBPrio;
			; SOURCE LINE # 710
	MOV  	R0,#LOW (OSTCBCur)
	MOV  	AR3,@R0
	INC  	R0
	MOV  	A,@R0
	MOV  	R2,A
	INC  	R0
	MOV  	A,@R0
	MOV  	R1,A
	MOV  	DPTR,#0CH
	LCALL	?C?CLDOPTR
	MOV  	R7,A
	MOV  	DPTR,#03H
	LCALL	?C?XBPOFF
	MOV  	A,R7
	MOVX 	@DPTR,A
;     }
			; SOURCE LINE # 711
?C0011:
;     if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {      /* Task to query must exist                 */
			; SOURCE LINE # 712
	MOV  	DPTR,#03H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	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  	R1,A
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOV  	A,R3
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R2
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
	MOV  	A,R1
	ORL  	A,R2
	ORL  	A,R3
	JNZ  	?C0012
;         OS_EXIT_CRITICAL();
			; SOURCE LINE # 713
	SETB 	EA
;         return (OS_PRIO_ERR);
			; SOURCE LINE # 714
	MOV  	R7,#029H
	SJMP 	?C0010
;     }
			; SOURCE LINE # 715
?C0012:
;     *ppdata = *ptcb;                                        /* Copy TCB into user storage area          */
			; SOURCE LINE # 716
	MOV  	DPH,?C_XBP
	MOV  	DPL,?C_XBP+01H
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	PUSH 	AR3
	PUSH 	AR2
	PUSH 	AR1
	MOV  	DPTR,#04H
	LCALL	?C?XBPOFF
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R0,A
	MOV  	R4,AR2
	MOV  	R5,AR3
	POP  	AR1
	POP  	AR2
	POP  	AR3
	MOV  	R6,#00H
	MOV  	R7,#011H
	LCALL	?C?COPY
;     OS_EXIT_CRITICAL();
			; SOURCE LINE # 717
	SETB 	EA
;     return (OS_NO_ERR);
			; SOURCE LINE # 718
	MOV  	R7,#00H
; }
			; SOURCE LINE # 719
?C0010:
	MOV  	DPTR,#07H
	LJMP 	?C?ADDXBP
; END OF _?OSTaskQuery

	END

⌨️ 快捷键说明

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