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

📄 os_task.lst

📁 基于51单片机来实现UCOS用一个串口来看到实现阶段
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE OS_TASK
OBJECT MODULE PLACED IN OS_TASK.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE OS_TASK.C LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*
   2          *********************************************************************************************************
   3          *                                                uC/OS-II
   4          *                                          The Real-Time Kernel
   5          *                                            TASK MANAGEMENT
   6          *
   7          *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
   8          *                                           All Rights Reserved
   9          *
  10          *                                                  V2.00
  11          *
  12          * File : OS_TASK.C
  13          * By   : Jean J. Labrosse
  14          *********************************************************************************************************
  15          */
  16          /**************************************local************************************************************/
  17          #include "includes.h"
  18          
  19          #if OS_TASK_DEL_EN
  20          static void  OSDummy (void)reentrant
  21          {
  22   1      }
  23          #endif
  24          //建立系统空闲任务
  25          INT8U   OSTaskIdleCreate(){
  26   1      
  27   1                  INT8U   err;
  28   1                      OS_STKCB *stkcb;
  29   1              
  30   1                      OS_ENTER_CRITICAL();
  31   1                  OSTCBPrioTbl[OS_LOWEST_PRIO] = (OS_TCB *)1;    
*** WARNING C196 IN LINE 31 OF OS_TASK.C: mspace probably invalid
  32   1                      stkcb=OStkAsk();           
  33   1                      OS_EXIT_CRITICAL();     
  34   1                                       
  35   1                      OSTaskStkInit(OSTaskIdle, stkcb, 0); 
  36   1                      err = OSTCBInit(OS_LOWEST_PRIO, stkcb, 0, (void *)0, 0);  
  37   1                                                               
  38   1              if (err == OS_NO_ERR) {
  39   2                  OS_ENTER_CRITICAL();
  40   2                  OSTaskCtr++;                                  
  41   2                  OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO]);            
  42   2                  OS_EXIT_CRITICAL();
  43   2                  if (OSRunning) {                
  44   3                      OSSched();
  45   3                  }
  46   2              } else {
  47   2                  OS_ENTER_CRITICAL();
  48   2                  OSTCBPrioTbl[OS_LOWEST_PRIO] = (OS_TCB *)0;            
  49   2                  OS_EXIT_CRITICAL();
  50   2              }
  51   1              return (err);
  52   1      }
  53          //建立系统统计任务
  54          #if             OS_TASK_STAT_EN
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 2   

  55          INT8U   OSTaskStatCreate(){
  56   1      
  57   1                  INT8U   err;
  58   1                  OS_STKCB *stkcb;
  59   1              
  60   1                  OS_ENTER_CRITICAL();
  61   1                  OSTCBPrioTbl[OS_LOWEST_PRIO-1 ] = (OS_TCB *)1;    
*** WARNING C196 IN LINE 61 OF OS_TASK.C: mspace probably invalid
  62   1                      stkcb=OStkAsk();          
  63   1                      OS_EXIT_CRITICAL();     
  64   1                                       
  65   1                      OSTaskStkInit(OSTaskStat, stkcb, 0); 
  66   1                      err = OSTCBInit(OS_LOWEST_PRIO-1, stkcb, 0, (void *)0, 0);  
  67   1                                                                     
  68   1              if (err == OS_NO_ERR){
  69   2                  OS_ENTER_CRITICAL();
  70   2                  OSTaskCtr++;                                   
  71   2                  OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO-1]);    
  72   2                  OS_EXIT_CRITICAL();
  73   2                  if (OSRunning) {               
  74   3                      OSSched();
  75   3                  }
  76   2              } else {
  77   2                  OS_ENTER_CRITICAL();
  78   2                  OSTCBPrioTbl[OS_LOWEST_PRIO-1] = (OS_TCB *)0;
  79   2                  OS_EXIT_CRITICAL();
  80   2              }
  81   1              return (err);
  82   1      }
  83          #endif
  84          
  85          //改变任务优先级
  86          #if OS_TASK_CHANGE_PRIO_EN
              INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)reentrant
              {
                  OS_TCB   *ptcb;
                  OS_EVENT *pevent;
                  INT8U     x;
                  INT8U     y;
                  INT8U     bitx;
                  INT8U     bity;
              
              
                  if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF)  || 
                       newprio >= OS_LOWEST_PRIO) {
                      return (OS_PRIO_INVALID);
                  }
                  OS_ENTER_CRITICAL();
                  if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                
                      OS_EXIT_CRITICAL();
                      return (OS_PRIO_EXIST);
                  } else {
                      OSTCBPrioTbl[newprio] = (OS_TCB *)1;                   
                      OS_EXIT_CRITICAL();
                      y    = newprio >> 3;                                    
                      bity = OSMapTbl[y];
                      x    = newprio & 0x07;
                      bitx = OSMapTbl[x];
                      OS_ENTER_CRITICAL();
                      if (oldprio == OS_PRIO_SELF) {                          
                          oldprio = OSTCBCur->OSTCBPrio;                      
                      }
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 3   

                      if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) {    
                          OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                
                          if (OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) {     
                              if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
                                  OSRdyGrp &= ~ptcb->OSTCBBitY;
                              }
                              OSRdyGrp    |= bity;                            
                              OSRdyTbl[y] |= bitx;
                          } else {
                              if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { 
                                  if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
                                      pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
                                  }
                                  pevent->OSEventGrp    |= bity;             
                                  pevent->OSEventTbl[y] |= bitx;
                              }
                          }
                          OSTCBPrioTbl[newprio] = ptcb;                      
                          ptcb->OSTCBPrio       = newprio;                   
                          ptcb->OSTCBY          = y;
                          ptcb->OSTCBX          = x;
                          ptcb->OSTCBBitY       = bity;
                          ptcb->OSTCBBitX       = bitx;
                          OS_EXIT_CRITICAL();
                          OSSched();                                          
                          return (OS_NO_ERR);
                      } else {
                          OSTCBPrioTbl[newprio] = (OS_TCB *)0;                
                          OS_EXIT_CRITICAL();
                          return (OS_PRIO_ERR);                               
                      }
                  }
              }
              #endif
 150          
 151          //建立任务(简单式)
 152          #if OS_TASK_CREATE_EN
              INT8U OSTaskCreate (void (*task)(void *pd)reentrant, 
                                          INT8U prio) reentrant
              {   
                                      INT8U   err;
                                      OS_STKCB *stkcb;
                                      
                                      if (prio > OS_LOWEST_PRIO) {                  
                                          return (OS_PRIO_INVALID);
                                      }
                                      
                                      OS_ENTER_CRITICAL();
                                      if (OSTCBPrioTbl[prio] == (OS_TCB *)0){ 
                                          OSTCBPrioTbl[prio] = (OS_TCB *)1;   
                                                                                          
                                          stkcb=(OS_STK *)OStkAsk();     //申请OS_STKCB
                                          OS_EXIT_CRITICAL(); 
                                               
                                          OSTaskStkInit(task, stkcb, 0); 
                                          err = OSTCBInit(prio, stkcb, 0, (void *)0, 0);   
                                                    
                                      if (err == OS_NO_ERR) {
                                          OS_ENTER_CRITICAL();
                                          OSTaskCtr++;                                   
                                          OSTaskCreateHook(OSTCBPrioTbl[prio]);       
                                          OS_EXIT_CRITICAL();
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 4   

                                              if (OSRunning) {                
                                                  OSSched();
                                              }
                                       }else {
                                          OS_ENTER_CRITICAL();
                                          OSTCBPrioTbl[prio] = (OS_TCB *)0;      
                                          OS_EXIT_CRITICAL();
                                      }
                                          return (err);
                                      }else {
                                          OS_EXIT_CRITICAL();
                                          return (OS_PRIO_EXIST);
                                      }
              }
              #endif
 193          
 194          //建立任务(复杂式)
 195          #if   OS_TASK_CREATE_EXT_EN    
 196          INT8U OSTaskCreateExt (void   (*task)(void *pd)reentrant,               //任务
 197                                 INT8U    prio,                                                   //优先级
 198                                 INT16U   id,                                                             //任务ID
 199                                 void    *pext,                                                   //任务附加数据域指针
 200                                 INT16U   opt)reentrant                                   //堆栈操作选项
 201          {
 202   1          INT8U    err;
 203   1          INT16U   i;
 204   1          OS_STK  *pfill; 
 205   1          OS_STKCB *stkcb;
 206   1      
 207   1          if (prio > OS_LOWEST_PRIO) {          
 208   2              return (OS_PRIO_INVALID);
 209   2          }
 210   1          OS_ENTER_CRITICAL();
 211   1          if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
 212   2              OSTCBPrioTbl[prio] = (OS_TCB *)1;    
*** WARNING C196 IN LINE 212 OF OS_TASK.C: mspace probably invalid
 213   2                                                   
 214   2                      stkcb=(OS_STKCB *)OStkAsk();
 215   2              OS_EXIT_CRITICAL();
 216   2      
 217   2              if (opt & OS_TASK_OPT_STK_CHK) {     
 218   3                  if (opt & OS_TASK_OPT_STK_CLR) { 
 219   4                      pfill = stkcb->OSTKBtomPtr ;             
 220   4                      for (i = 0; i < OS_STK_SIZE ; i++) {
 221   5                          #if OS_STK_GROWTH == 1
 222   5                          *pfill++ = (OS_STK)0;
 223   5                          #else
                                  *pfill-- = (OS_STK)0;
                                  #endif
 226   5                      }
 227   4                  }
 228   3              }
 229   2      
 230   2              OSTaskStkInit(task, stkcb, opt); 
 231   2              err = OSTCBInit(prio, stkcb, id, pext, opt);         
 232   2              if (err == OS_NO_ERR){
 233   3                  OS_ENTER_CRITICAL();
 234   3                  OSTaskCtr++;                                     
 235   3                  OSTaskCreateHook(OSTCBPrioTbl[prio]);         
 236   3                  OS_EXIT_CRITICAL();
 237   3                  if (OSRunning) {                
 238   4                      OSSched();
C51 COMPILER V7.02b   OS_TASK                                                              07/08/2007 20:25:04 PAGE 5   

 239   4                  }
 240   3              } else {
 241   3                  OS_ENTER_CRITICAL();
 242   3                  OSTCBPrioTbl[prio] = (OS_TCB *)0;
 243   3                  OS_EXIT_CRITICAL();
 244   3              }
 245   2              return (err);
 246   2          } else {
 247   2              OS_EXIT_CRITICAL();
 248   2              return (OS_PRIO_EXIST);
 249   2          }
 250   1      }

⌨️ 快捷键说明

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