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

📄 os_task.lst

📁 基于51单片机来实现UCOS用一个串口来看到实现阶段
💻 LST
📖 第 1 页 / 共 2 页
字号:
 251          #endif
 252          
 253          //删除任务
 254          #if OS_TASK_DEL_EN
 255          INT8U OSTaskDel (INT8U prio)reentrant
 256          {
 257   1          OS_TCB   *ptcb;
 258   1          OS_EVENT *pevent;
 259   1      
 260   1      
 261   1          if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
 262   2              return (OS_TASK_DEL_IDLE);
 263   2          }
 264   1          if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
 265   2              return (OS_PRIO_INVALID);
 266   2          }
 267   1          OS_ENTER_CRITICAL();
 268   1          if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
 269   2              OS_EXIT_CRITICAL();
 270   2              return (OS_TASK_DEL_ISR);
 271   2          }
 272   1          if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
 273   2              prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
 274   2          }
 275   1          if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {           /* Task to delete must exist           */
 276   2              if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {/* Make task not ready                 */
 277   3                  OSRdyGrp &= ~ptcb->OSTCBBitY;
 278   3              }
 279   2              if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) {  /* If task is waiting on event         */
 280   3                  if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
 281   4                      pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... event ctrl block */
 282   4                  }
 283   3              }
 284   2              ptcb->OSTCBDly  = 0;                                    /* Prevent OSTimeTick() from updating  */
 285   2              ptcb->OSTCBStat = OS_STAT_RDY;                          /* Prevent task from being resumed     */
 286   2              OSLockNesting++;
 287   2              OS_EXIT_CRITICAL();                                     /* Enabling INT. ignores next instruc. */
 288   2              OSDummy();                                              /* ... Dummy ensures that INTs will be */
 289   2              OS_ENTER_CRITICAL();                                    /* ... disabled HERE!                  */
 290   2              OSLockNesting--;
 291   2              OSTaskDelHook(ptcb);                                    /* Call user defined hook              */
 292   2              OSTaskCtr--;                                            /* One less task being managed         */
 293   2              OSTCBPrioTbl[prio] = (OS_TCB *)0;                       /* Clear old priority entry            */
 294   2      
 295   2                      ptcb->OSTCBStkCb->OSTKCBNext=OSTKCBFreeList;
 296   2              OSTKCBFreeList = ptcb->OSTCBStkCb;
 297   2                      ptcb->OSTCBStkCb=(void*)0;
 298   2      
 299   2              if (ptcb->OSTCBPrev == (OS_TCB *)0) {                   /* Remove from TCB chain               */
 300   3                  ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 6   

 301   3                  OSTCBList                  = ptcb->OSTCBNext;
 302   3              } else {
 303   3                  ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
 304   3                  ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
 305   3              }
 306   2              ptcb->OSTCBNext = OSTCBFreeList;                        /* Return TCB to free TCB list         */
 307   2              OSTCBFreeList   = ptcb;
 308   2      
 309   2              OS_EXIT_CRITICAL();
 310   2              OSSched();                                              /* Find new highest priority task      */
 311   2              return (OS_NO_ERR);
 312   2          } else {
 313   2              OS_EXIT_CRITICAL();
 314   2              return (OS_TASK_DEL_ERR);
 315   2          }
 316   1      }
 317          #endif
 318          
 319          //请求删除任务
 320          #if OS_TASK_DELR_EN
              INT8U OSTaskDelReq (INT8U prio)reentrant
              {
                  BOOLEAN  stat;
                  INT8U    err;
                  OS_TCB  *ptcb;
              
              
                  if (prio == OS_IDLE_PRIO) {                                
                      return (OS_TASK_DEL_IDLE);
                  }
                  if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       
                      return (OS_PRIO_INVALID);
                  }
                  if (prio == OS_PRIO_SELF) {                                
                      OS_ENTER_CRITICAL();                                   
                      stat = OSTCBCur->OSTCBDelReq;                           
                      OS_EXIT_CRITICAL();
                      return (stat);
                  } else {
                      OS_ENTER_CRITICAL();
                      if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {     
                          ptcb->OSTCBDelReq = OS_TASK_DEL_REQ;               
                          err               = OS_NO_ERR;
                      } else {
                          err               = OS_TASK_NOT_EXIST;             
                      }
                      OS_EXIT_CRITICAL();
                      return (err);
                  }
              }
              #endif
 352          
 353          //恢复任务
 354          #if OS_TASK_SUSPEND_EN
 355          INT8U OSTaskResume (INT8U prio)reentrant
 356          {
 357   1          OS_TCB   *ptcb;
 358   1      
 359   1      
 360   1          if (prio >= OS_LOWEST_PRIO) {                               /* Make sure task priority is valid    */
 361   2              return (OS_PRIO_INVALID);
 362   2          }
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 7   

 363   1          OS_ENTER_CRITICAL();
 364   1          if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {           /* Task to suspend must exist          */
 365   2              OS_EXIT_CRITICAL();
 366   2              return (OS_TASK_RESUME_PRIO);
 367   2          } else {
 368   2              if (ptcb->OSTCBStat & OS_STAT_SUSPEND) {                           /* Task must be suspended   */
 369   3                  if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&  /* Remove suspension        */
 370   3                       (ptcb->OSTCBDly  == 0)) {                                 /* Must not be delayed      */
 371   4                      OSRdyGrp               |= ptcb->OSTCBBitY;                 /* Make task ready to run   */
 372   4                      OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
 373   4                      OS_EXIT_CRITICAL();
 374   4                      OSSched();
 375   4                  } else {
 376   4                      OS_EXIT_CRITICAL();
 377   4                  }
 378   3                  return (OS_NO_ERR);
 379   3              } else {
 380   3                  OS_EXIT_CRITICAL();
 381   3                  return (OS_TASK_NOT_SUSPENDED);
 382   3              }
 383   2          }
 384   1      }
 385          #endif
 386          
 387          //任务堆栈检查
 388           /*
 389          #if   OS_TASK_CREATE_EXT_EN
 390          INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *dataptr)reentrant
 391          {
 392              OS_TCB  *ptcb;
 393              OS_STK  *pchk;
 394              INT32U   free;
 395              INT32U   size;
 396          
 397          
 398              dataptr->OSFree = 0;                                         
 399              dataptr->OSUsed = 0;
 400              if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {      
 401                  return (OS_PRIO_INVALID);
 402              }
 403              OS_ENTER_CRITICAL();
 404              if (prio == OS_PRIO_SELF) {                      
 405                  prio = OSTCBCur->OSTCBPrio;
 406              }
 407              ptcb = OSTCBPrioTbl[prio];
 408              if (ptcb == (OS_TCB *)0) {                      
 409                  OS_EXIT_CRITICAL();
 410                  return (OS_TASK_NOT_EXIST);
 411              }
 412              if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { 
 413                  OS_EXIT_CRITICAL();
 414                  return (OS_TASK_OPT_ERR);
 415              }
 416              free = 0;
 417              size = ptcb->OSTCBStkSize;
 418              pchk = ptcb->OSTCBStkBottom;
 419              OS_EXIT_CRITICAL();
 420          #if OS_STK_GROWTH == 1
 421              while (*pchk++ == 0) {                            
 422                  free++;
 423              }
 424          #else
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 8   

 425              while (*pchk-- == 0) {
 426                  free++;
 427              }
 428          #endif
 429              dataptr->OSFree = free * sizeof(OS_STK);            
 430              dataptr->OSUsed = (size - free) * sizeof(OS_STK);   
 431              return (OS_NO_ERR);
 432          }
 433          #endif  */   
 434          
 435          //挂起任务
 436          #if OS_TASK_SUSPEND_EN
 437          INT8U OSTaskSuspend (INT8U prio)reentrant
 438          {
 439   1          BOOLEAN   self;
 440   1          OS_TCB   *ptcb;
 441   1      
 442   1      
 443   1          if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to suspend idle task    */
 444   2              return (OS_TASK_SUSPEND_IDLE);
 445   2          }
 446   1          if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
 447   2              return (OS_PRIO_INVALID);
 448   2          }
 449   1          OS_ENTER_CRITICAL();
 450   1          if (prio == OS_PRIO_SELF) {                                 /* See if suspend SELF                 */
 451   2              prio = OSTCBCur->OSTCBPrio;
 452   2              self = TRUE;
 453   2          } else if (prio == OSTCBCur->OSTCBPrio) {                   /* See if suspending self              */
 454   2              self = TRUE;
 455   2          } else {
 456   2              self = FALSE;                                           /* No suspending another task          */
 457   2          }
 458   1          if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {                /* Task to suspend must exist     */
 459   2              OS_EXIT_CRITICAL();
 460   2              return (OS_TASK_SUSPEND_PRIO);
 461   2          } else {
 462   2              if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {     /* Make task not ready            */
 463   3                  OSRdyGrp &= ~ptcb->OSTCBBitY;
 464   3              }
 465   2              ptcb->OSTCBStat |= OS_STAT_SUSPEND;                          /* Status of task is 'SUSPENDED'  */
 466   2              OS_EXIT_CRITICAL();
 467   2              if (self == TRUE) {                                          /* Context switch only if SELF    */
 468   3                  OSSched();
 469   3              }
 470   2              return (OS_NO_ERR);
 471   2          }
 472   1      }
 473          #endif
 474          
 475          //获取任务信息
 476          #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;
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 9   

                  }
                  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          *
             -/
                  OS_EXIT_CRITICAL();
                  return (OS_NO_ERR);
              }
              #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2350    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----       8
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  3 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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