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

📄 os_task.lst

📁 在C8051F120内移植uCOS-II
💻 LST
📖 第 1 页 / 共 4 页
字号:
                          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 + -