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

📄 os_sem.lst

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


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

stmt level    source

   1          /*
   2          *********************************************************************************************************
   3          *                                                uC/OS-II
   4          *                                          The Real-Time Kernel
   5          *                                          SEMAPHORE MANAGEMENT
   6          *
   7          *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
   8          *                                           All Rights Reserved
   9          *
  10          *                                                  V2.00
  11          *
  12          * File : OS_SEM.C
  13          * By   : Jean J. Labrosse
  14          *********************************************************************************************************
  15          */
  16          
  17          #ifndef  OS_MASTER_FILE
  18          #include "includes.h"
  19          #endif
  20          
  21          #if OS_Sem_EN
  22          
  23          //无等待地请求一个信号量
  24          #if OS_Sem_Accept_EN
              INT16U OSSemAccept (OS_EVENT *pevent)reentrant
              {
                  INT16U cnt;
              
              
                  OS_ENTER_CRITICAL();
                  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
                      OS_EXIT_CRITICAL();
                      return (0);
                  }
                  cnt = pevent->OSEventCnt;
                  if (cnt > 0) {                                    /* See if resource is available                  */
                      pevent->OSEventCnt--;                         /* Yes, decrement semaphore and notify caller    */
                  }
                  OS_EXIT_CRITICAL();
                  return (cnt);                                     /* Return semaphore count                        */
              }
              #endif
  43          
  44          //建立一个信号量
  45          #if OS_Sem_Create_EN
  46          OS_EVENT *OSSemCreate (INT16U cnt)reentrant
  47          {
  48   1          OS_EVENT *pevent;
  49   1      
  50   1      
  51   1          OS_ENTER_CRITICAL();
  52   1          pevent = OSEventFreeList;                              /* Get next free event control block        */
  53   1          if (OSEventFreeList != (OS_EVENT *)0) 
  54   1          {              
  55   2              OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
C51 COMPILER V7.02b   OS_SEM                                                               07/08/2007 20:25:04 PAGE 2   

  56   2          }
  57   1          OS_EXIT_CRITICAL();
  58   1          if (pevent != (OS_EVENT *)0) 
  59   1          {                         
  60   2              pevent->OSEventType = OS_EVENT_TYPE_SEM;
  61   2              pevent->OSEventCnt  = cnt;                         /* Set semaphore value                      */
  62   2              OSEventWaitListInit(pevent);
  63   2          }
  64   1          return (pevent);
  65   1      }
  66          #endif
  67          
  68          //等待一个信号量
  69          #if OS_Sem_Pend_EN
  70          void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)reentrant
  71          {
  72   1          OS_ENTER_CRITICAL();
  73   1          if (pevent->OSEventType != OS_EVENT_TYPE_SEM)  /* Validate event block type                     */
  74   1          {  
  75   2              OS_EXIT_CRITICAL();
  76   2              *err = OS_ERR_EVENT_TYPE;
  77   2          }
  78   1          if (pevent->OSEventCnt > 0)  /* If sem. is positive, resource available ...   */
  79   1          {                    
  80   2              pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
  81   2              OS_EXIT_CRITICAL();
  82   2              *err = OS_NO_ERR;
  83   2          } 
  84   1          else if (OSIntNesting > 0)  /* See if called from ISR ...                    */
  85   1          {                   
  86   2              OS_EXIT_CRITICAL();                           /* ... can't PEND from an ISR                    */
  87   2              *err = OS_ERR_PEND_ISR;
  88   2          } 
  89   1          else 
  90   1          {                                          /* Otherwise, must wait until event occurs       */
  91   2              OSTCBCur->OSTCBStat    |= OS_STAT_SEM;        /* Resource not available, pend on semaphore     */
  92   2              OSTCBCur->OSTCBDly      = timeout;            /* Store pend timeout in TCB                     */
  93   2              OSEventTaskWait(pevent);                      /* Suspend task until event or timeout occurs    */
  94   2              OS_EXIT_CRITICAL();
  95   2              OSSched();                                    /* Find next highest priority task ready         */
  96   2              OS_ENTER_CRITICAL();
  97   2              if (OSTCBCur->OSTCBStat & OS_STAT_SEM) 
  98   2              {      
  99   3                  OSEventTO(pevent);
 100   3                  OS_EXIT_CRITICAL();
 101   3                  *err = OS_TIMEOUT;                        /* Indicate that didn't get event within TO      */
 102   3              } 
 103   2              else 
 104   2              {
 105   3                  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
 106   3                  OS_EXIT_CRITICAL();
 107   3                  *err = OS_NO_ERR;
 108   3              }
 109   2          }
 110   1      }
 111          #endif
 112          
 113          //发送一个信号量
 114          #if OS_Sem_Post_EN
 115          INT8U OSSemPost (OS_EVENT *pevent)reentrant
 116          {
 117   1          OS_ENTER_CRITICAL();
C51 COMPILER V7.02b   OS_SEM                                                               07/08/2007 20:25:04 PAGE 3   

 118   1          if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 119   2              OS_EXIT_CRITICAL();
 120   2              return (OS_ERR_EVENT_TYPE);
 121   2          }
 122   1          if (pevent->OSEventGrp) {                              /* See if any task waiting for semaphore    */
 123   2              OSEventTaskRdy(pevent, (void *)0, OS_STAT_SEM);    /* Ready highest prio task waiting on event */
 124   2              OS_EXIT_CRITICAL();
 125   2              OSSched();                                    /* Find highest priority task ready to run       */
 126   2              return (OS_NO_ERR);
 127   2          } else {
 128   2              if (pevent->OSEventCnt < 65535) {             /* Make sure semaphore will not overflow         */
 129   3                  pevent->OSEventCnt++;                     /* Increment semaphore count to register event   */
 130   3                  OS_EXIT_CRITICAL();
 131   3                  return (OS_NO_ERR);
 132   3              } else {                                      /* Semaphore value has reached its maximum       */
 133   3                  OS_EXIT_CRITICAL();
 134   3                  return (OS_SEM_OVF);
 135   3              }
 136   2          }
 137   1      }
 138          #endif
 139          
 140          //查询一个信号量的状态
 141          #if   OS_Sem_Query_EN
              INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *dataptr)reentrant
              {
                  INT8U  i;
                  INT8U *psrc;
                  INT8U *pdest;
                  
                  
                  OS_ENTER_CRITICAL();
                  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
                      OS_EXIT_CRITICAL();
                      return (OS_ERR_EVENT_TYPE);
                  }
                  dataptr->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait list           *
             -/
                  psrc              = &pevent->OSEventTbl[0];
                  pdest             = &dataptr->OSEventTbl[0];
                  for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
                      *pdest++ = *psrc++;   
                  }
                  dataptr->OSCnt      = pevent->OSEventCnt;                /* Get semaphore count                      *
             -/
                  OS_EXIT_CRITICAL();
                  return (OS_NO_ERR);
              }
              #endif
 165          #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    678    ----
   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 + -