📄 os_task.lst
字号:
return (OS_TASK_NOT_SUSPENDED);
}
}
}
#endif
571 /*$PAGE*/
572 /*
573 *********************************************************************************************************
574 * STACK CHECKING
575 *
576 * Description: This function is called to check the amount of free memory left on the specified task's
577 * stack.
578 *
579 * Arguments : prio is the task priority
580 *
581 * dataptr is a pointer to a data structure of type OS_STK_DATA.
582 *
583 * Returns : OS_NO_ERR upon success
584 * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
585 * (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
586 * OS_TASK_NOT_EXIST if the desired task has not been created
587 * OS_TASK_OPT_ERR if you did NOT specified OS_TASK_OPT_STK_CHK when the task was created
588 *********************************************************************************************************
589 */
590 #if OS_TASK_CREATE_EXT_EN
591 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *dataptr)reentrant
592 {
593 1 #if OS_CRITICAL_METHOD == 2
594 1 unsigned DTYPE int_ss;
595 1 #endif
596 1
597 1 OS_TCB *ptcb;
598 1 OS_STK *pchk;
599 1 INT32U free;
600 1 INT32U size;
601 1
602 1
603 1 dataptr->OSFree = 0; /* Assume failure, set to 0 size *
-/
604 1 dataptr->OSUsed = 0;
605 1 if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Make sure task priority is valid */
606 2 return (OS_PRIO_INVALID);
607 2 }
608 1 OS_ENTER_CRITICAL();
609 1 if (prio == OS_PRIO_SELF) { /* See if check for SELF */
610 2 prio = OSTCBCur->OSTCBPrio;
C51 COMPILER V8.08 OS_TASK 04/13/2009 13:31:22 PAGE 11
611 2 }
612 1 ptcb = OSTCBPrioTbl[prio];
613 1 if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
614 2 OS_EXIT_CRITICAL();
615 2 return (OS_TASK_NOT_EXIST);
616 2 }
617 1 if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */
618 2 OS_EXIT_CRITICAL();
619 2 return (OS_TASK_OPT_ERR);
620 2 }
621 1 free = 0;
622 1 size = ptcb->OSTCBStkSize;
623 1 pchk = ptcb->OSTCBStkTop;
624 1 OS_EXIT_CRITICAL();
625 1 #if OS_STK_GROWTH == 1
626 1 while (*pchk++ == 0) { /* Compute the number of zero entries on the stk */
627 2 free++;
628 2 }
629 1 #else
while (*pchk-- == 0) {
free++;
}
#endif
634 1 dataptr->OSFree = free * sizeof(OS_STK); /* Compute number of free bytes on the stack *
-/
635 1 dataptr->OSUsed = (size - free) * sizeof(OS_STK); /* Compute number of bytes used on the stack *
-/
636 1 return (OS_NO_ERR);
637 1 }
638 #endif
639 /*$PAGE*/
640 /*
641 *********************************************************************************************************
642 * SUSPEND A TASK
643 *
644 * Description: This function is called to suspend a task. The task can be the calling task if the
645 * priority passed to OSTaskSuspend() is the priority of the calling task or OS_PRIO_SELF.
646 *
647 * Arguments : prio is the priority of the task to suspend. If you specify OS_PRIO_SELF, the
648 * calling task will suspend itself and rescheduling will occur.
649 *
650 * Returns : OS_NO_ERR if the requested task is suspended
651 * OS_TASK_SUSPEND_IDLE if you attempted to suspend the idle task which is not allowed.
652 * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
653 * (i.e. >= OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
654 * OS_TASK_SUSPEND_PRIO if the task to suspend does not exist
655 *
656 * Note : You should use this function with great care. If you suspend a task that is waiting for
657 * an event (i.e. a message, a semaphore, a queue ...) you will prevent this task from
658 * running when the event arrives.
659 *********************************************************************************************************
660 */
661
662 #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);
C51 COMPILER V8.08 OS_TASK 04/13/2009 13:31:22 PAGE 12
}
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
700 /*$PAGE*/
701 /*
702 *********************************************************************************************************
703 * QUERY A TASK
704 *
705 * Description: This function is called to obtain a copy of the desired task's TCB.
706 *
707 * Arguments : prio is the priority of the task to obtain information from.
708 *
709 * Returns : OS_NO_ERR if the requested task is suspended
710 * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
711 * (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
712 * OS_PRIO_ERR if the desired task has not been created
713 *********************************************************************************************************
714 */
715 #if OS_Task_Query_EN
INT8U OSTaskQuery (INT8U prio, OS_TCB *dataptr)reentrant
{
OS_TCB *ptcb;
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;
}
if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { /* Task to query must exist */
OS_EXIT_CRITICAL();
return (OS_PRIO_ERR);
}
*dataptr = *ptcb; /* Copy TCB into user storage area *
C51 COMPILER V8.08 OS_TASK 04/13/2009 13:31:22 PAGE 13
-/
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 966 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -