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

📄 os_sem.lst

📁 ucos移植学习
💻 LST
📖 第 1 页 / 共 2 页
字号:
 121          *********************************************************************************************************
 122          */
 123          
 124          void OSSemPend (OS_EVENT DT_XDATA *pevent, INT16U timeout, INT8U DT_XDATA *err) REENTRANT
 125          {
 126   1          OS_ENTER_CRITICAL();
 127   1          if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
 128   2              OS_EXIT_CRITICAL();
 129   2              *err = OS_ERR_EVENT_TYPE;
 130   2          }
 131   1          if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
 132   2              pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
 133   2              OS_EXIT_CRITICAL();
 134   2              *err = OS_NO_ERR;
 135   2          } else if (OSIntNesting > 0) {                    /* See if called from ISR ...                    */
 136   2              OS_EXIT_CRITICAL();                           /* ... can't PEND from an ISR                    */
 137   2              *err = OS_ERR_PEND_ISR;
 138   2          } else {                                          /* Otherwise, must wait until event occurs       */
 139   2              OSTCBCur->OSTCBStat    |= OS_STAT_SEM;        /* Resource not available, pend on semaphore     */
 140   2              OSTCBCur->OSTCBDly      = timeout;            /* Store pend timeout in TCB                     */
 141   2              OSEventTaskWait(pevent);                      /* Suspend task until event or timeout occurs    */
 142   2              OS_EXIT_CRITICAL();
 143   2              OSSched();                                    /* Find next highest priority task ready         */
 144   2              OS_ENTER_CRITICAL();
 145   2              if (OSTCBCur->OSTCBStat & OS_STAT_SEM) {      /* Must have timed out if still waiting for event*/
 146   3                  OSEventTO(pevent);
 147   3                  OS_EXIT_CRITICAL();
 148   3                  *err = OS_TIMEOUT;                        /* Indicate that didn't get event within TO      */
 149   3              } else {
 150   3                  OSTCBCur->OSTCBEventPtr = (OS_EVENT DT_XDATA *)0;
 151   3                  OS_EXIT_CRITICAL();
 152   3                  *err = OS_NO_ERR;
 153   3              }
 154   2          }
 155   1      }
 156          /*$PAGE*/
 157          /*
 158          *********************************************************************************************************
 159          *                                         POST TO A SEMAPHORE
 160          *
 161          * Description: This function signals a semaphore
 162          *
 163          * Arguments  : pevent        is a pointer to the event control block associated with the desired 
 164          *                            semaphore.
 165          *
 166          * Returns    : OS_NO_ERR          The call was successful and the semaphore was signaled.
 167          *              OS_SEM_OVF         If the semaphore count exceeded its limit.  In other words, you have 
 168          *                                 signalled the semaphore more often than you waited on it with either
 169          *                                 OSSemAccept() or OSSemPend().
 170          *              OS_ERR_EVENT_TYPE  If you didn't pass a pointer to a semaphore
 171          *********************************************************************************************************
 172          */
 173          
 174          INT8U OSSemPost (OS_EVENT DT_XDATA *pevent) REENTRANT
 175          {
 176   1          OS_ENTER_CRITICAL();
C51 COMPILER V7.02a   OS_SEM                                                               10/16/2006 15:27:51 PAGE 4   

 177   1          if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 178   2              OS_EXIT_CRITICAL();
 179   2              return (OS_ERR_EVENT_TYPE);
 180   2          }
 181   1          if (pevent->OSEventGrp) {                              /* See if any task waiting for semaphore    */
 182   2              OSEventTaskRdy(pevent, (void DT_XDATA *)0, OS_STAT_SEM);    /* Ready highest prio task waiting on 
             -event */
 183   2              OS_EXIT_CRITICAL();
 184   2              OSSched();                                    /* Find highest priority task ready to run       */
 185   2              return (OS_NO_ERR);
 186   2          } else {
 187   2              if (pevent->OSEventCnt < 65535) {             /* Make sure semaphore will not overflow         */
 188   3                  pevent->OSEventCnt++;                     /* Increment semaphore count to register event   */
 189   3                  OS_EXIT_CRITICAL();
 190   3                  return (OS_NO_ERR);
 191   3              } else {                                      /* Semaphore value has reached its maximum       */
 192   3                  OS_EXIT_CRITICAL();
 193   3                  return (OS_SEM_OVF);
 194   3              }
 195   2          }
 196   1      }
 197          /*
 198          *********************************************************************************************************
 199          *                                          QUERY A SEMAPHORE
 200          *
 201          * Description: This function obtains information about a semaphore
 202          *
 203          * Arguments  : pevent        is a pointer to the event control block associated with the desired 
 204          *                            semaphore
 205          *
 206          *              ppdata         is a pointer to a structure that will contain information about the 
 207          *                            semaphore.
 208          *
 209          * Returns    : OS_NO_ERR          The call was successful and the message was sent
 210          *              OS_ERR_EVENT_TYPE  If you are attempting to obtain data from a non semaphore.
 211          *********************************************************************************************************
 212          */
 213          
 214          INT8U OSSemQuery (OS_EVENT DT_XDATA *pevent, OS_SEM_DATA DT_XDATA *ppdata) REENTRANT
 215          {
 216   1          INT8U  i;
 217   1          INT8U DT_XDATA *psrc;
 218   1          INT8U DT_XDATA *pdest;
 219   1          
 220   1          
 221   1          OS_ENTER_CRITICAL();
 222   1          if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 223   2              OS_EXIT_CRITICAL();
 224   2              return (OS_ERR_EVENT_TYPE);
 225   2          }
 226   1          ppdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait list           */
 227   1          psrc              = &pevent->OSEventTbl[0];
 228   1          pdest             = &ppdata->OSEventTbl[0];
 229   1          for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
 230   2              *pdest++ = *psrc++;   
 231   2          }
 232   1          ppdata->OSCnt      = pevent->OSEventCnt;                /* Get semaphore count                      */
 233   1          OS_EXIT_CRITICAL();
 234   1          return (OS_NO_ERR);
 235   1      }
 236          #endif

C51 COMPILER V7.02a   OS_SEM                                                               10/16/2006 15:27:51 PAGE 5   


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