📄 os_task.src
字号:
; 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 + -