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

📄 os_mutex.lst

📁 uCOS 嵌入式操作系统的改进版,增加了网络通讯.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 385   4                  }
 386   3              }
 387   2              OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
 388   2          }
 389   1          OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
 390   1          OSTCBCur->OSTCBDly   = timeout;                   /* Store timeout in current task's TCB           */
 391   1          OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
 392   1          OS_EXIT_CRITICAL();
 393   1          OS_Sched();                                        /* Find next highest priority task ready         */
 394   1          OS_ENTER_CRITICAL();
 395   1          if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
 396   2              OS_EventTO(pevent);
 397   2              OS_EXIT_CRITICAL();
 398   2              *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
 399   2              return;
 400   2          }
 401   1          OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
 402   1          OS_EXIT_CRITICAL();
 403   1          *err = OS_NO_ERR;
 404   1      }
 405          /*$PAGE*/
 406          /*
 407          *********************************************************************************************************
 408          *                                  POST TO A MUTUAL EXCLUSION SEMAPHORE
 409          *
 410          * Description: This function signals a mutual exclusion semaphore
 411          *
 412          * Arguments  : pevent              is a pointer to the event control block associated with the desired
 413          *                                  mutex.
 414          *
 415          * Returns    : OS_NO_ERR               The call was successful and the mutex was signaled.
 416          *              OS_ERR_EVENT_TYPE       If you didn't pass a pointer to a mutex
 417          *              OS_ERR_PEVENT_NULL      'pevent' is a NULL pointer
 418          *              OS_ERR_POST_ISR         Attempted to post from an ISR (not valid for MUTEXes)
 419          *              OS_ERR_NOT_MUTEX_OWNER  The task that did the post is NOT the owner of the MUTEX.
 420          *********************************************************************************************************
 421          */
 422          
 423          INT8U  OSMutexPost (OS_EVENT *pevent) reentrant //using 0
 424          {
 425   1      #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
 426   1          OS_CPU_SR  cpu_sr;
C51 COMPILER V7.06   OS_MUTEX                                                              07/18/2003 11:06:01 PAGE 8   

 427   1      #endif    
 428   1          INT8U      pip;                                   /* Priority inheritance priority                 */
 429   1          INT8U      prio;
 430   1      
 431   1      
 432   1          if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
 433   2              return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
 434   2          }
 435   1      #if OS_ARG_CHK_EN > 0
 436   1          if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
 437   2              return (OS_ERR_PEVENT_NULL);
 438   2          }
 439   1      #endif
 440   1          if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
 441   2              return (OS_ERR_EVENT_TYPE);
 442   2          }                                                 
 443   1          OS_ENTER_CRITICAL();
 444   1          pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
 445   1          prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
 446   1          if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) {   /* See if posting task owns the MUTEX            */
 447   2              OS_EXIT_CRITICAL();
 448   2              return (OS_ERR_NOT_MUTEX_OWNER);
 449   2          }
 450   1          if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
 451   2                                                            /* Yes, Return to original priority              */
 452   2                                                            /*      Remove owner from ready list at 'pip'    */
 453   2              if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
 454   3                  OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
 455   3              }
 456   2              OSTCBCur->OSTCBPrio         = prio;
 457   2              OSTCBCur->OSTCBY            = prio >> 3;
 458   2              OSTCBCur->OSTCBBitY         = OSMapTbl[OSTCBCur->OSTCBY];
 459   2              OSTCBCur->OSTCBX            = prio & 0x07;
 460   2              OSTCBCur->OSTCBBitX         = OSMapTbl[OSTCBCur->OSTCBX];
 461   2              OSRdyGrp                   |= OSTCBCur->OSTCBBitY;
 462   2              OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
 463   2              OSTCBPrioTbl[prio]          = (OS_TCB *)OSTCBCur;
 464   2          }
 465   1          OSTCBPrioTbl[pip] = (OS_TCB *)1;                  /* Reserve table entry                           */
 466   1          if (pevent->OSEventGrp != 0x00) {                 /* Any task waiting for the mutex?               */
 467   2                                                            /* Yes, Make HPT waiting for mutex ready         */
 468   2              prio                = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
 469   2              pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;  /*      Save priority of mutex's new owner       */
 470   2              pevent->OSEventCnt |= prio;
 471   2              pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*      Link to mutex owner's OS_TCB             */
 472   2              OS_EXIT_CRITICAL();
 473   2              OS_Sched();                                   /*      Find highest priority task ready to run  */
 474   2              return (OS_NO_ERR);
 475   2          }
 476   1          pevent->OSEventCnt |= OS_MUTEX_AVAILABLE;         /* No,  Mutex is now available                   */
 477   1          pevent->OSEventPtr  = (void *)0;
 478   1          OS_EXIT_CRITICAL();
 479   1          return (OS_NO_ERR);
 480   1      }
 481          /*$PAGE*/
 482          /*
 483          *********************************************************************************************************
 484          *                                     QUERY A MUTUAL EXCLUSION SEMAPHORE
 485          *
 486          * Description: This function obtains information about a mutex
 487          *
 488          * Arguments  : pevent        is a pointer to the event control block associated with the desired mutex
C51 COMPILER V7.06   OS_MUTEX                                                              07/18/2003 11:06:01 PAGE 9   

 489          *
 490          *              pdata         is a pointer to a structure that will contain information about the mutex
 491          *
 492          * Returns    : OS_NO_ERR            The call was successful and the message was sent
 493          *              OS_ERR_QUERY_ISR     If you called this function from an ISR
 494          *              OS_ERR_PEVENT_NULL   'pevent' is a NULL pointer
 495          *              OS_ERR_EVENT_TYPE    If you are attempting to obtain data from a non mutex.
 496          *********************************************************************************************************
 497          */
 498          
 499          #if OS_MUTEX_QUERY_EN > 0
 500          INT8U  OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pndata) reentrant //using 0
 501          {
 502   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
 503   1          OS_CPU_SR  cpu_sr;
 504   1      #endif    
 505   1          INT8U     *psrc;
 506   1          INT8U     *pdest;
 507   1      
 508   1      
 509   1          if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
 510   2              return (OS_ERR_QUERY_ISR);                         /* ... can't QUERY mutex from an ISR        */
 511   2          }
 512   1      #if OS_ARG_CHK_EN > 0
 513   1          if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
 514   2              return (OS_ERR_PEVENT_NULL);
 515   2          }
 516   1      #endif
 517   1          if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
 518   2              return (OS_ERR_EVENT_TYPE);
 519   2          }
 520   1          OS_ENTER_CRITICAL();
 521   1          pndata->OSMutexPIP  = (INT8U)(pevent->OSEventCnt >> 8);
 522   1          pndata->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
 523   1          if (pndata->OSOwnerPrio == 0xFF) {
 524   2              pndata->OSValue = 1;
 525   2          } else {
 526   2              pndata->OSValue = 0;
 527   2          }
 528   1          pndata->OSEventGrp  = pevent->OSEventGrp;               /* Copy wait list                           */
 529   1          psrc               = &pevent->OSEventTbl[0];
 530   1          pdest              = &pndata->OSEventTbl[0];
 531   1      #if OS_EVENT_TBL_SIZE > 0
 532   1          *pdest++           = *psrc++;
 533   1      #endif
 534   1      
 535   1      #if OS_EVENT_TBL_SIZE > 1
 536   1          *pdest++           = *psrc++;
 537   1      #endif
 538   1      
 539   1      #if OS_EVENT_TBL_SIZE > 2
 540   1          *pdest++           = *psrc++;
 541   1      #endif
 542   1      
 543   1      #if OS_EVENT_TBL_SIZE > 3
 544   1          *pdest++           = *psrc++;
 545   1      #endif
 546   1      
 547   1      #if OS_EVENT_TBL_SIZE > 4
 548   1          *pdest++           = *psrc++;
 549   1      #endif
 550   1      
C51 COMPILER V7.06   OS_MUTEX                                                              07/18/2003 11:06:01 PAGE 10  

 551   1      #if OS_EVENT_TBL_SIZE > 5
 552   1          *pdest++           = *psrc++;
 553   1      #endif
 554   1      
 555   1      #if OS_EVENT_TBL_SIZE > 6
 556   1          *pdest++           = *psrc++;
 557   1      #endif
 558   1      
 559   1      #if OS_EVENT_TBL_SIZE > 7
 560   1          *pdest             = *psrc;
 561   1      #endif
 562   1          OS_EXIT_CRITICAL();
 563   1          return (OS_NO_ERR);
 564   1      }
 565          #endif                                                     /* OS_MUTEX_QUERY_EN                        */
 566          #endif                                                     /* OS_MUTEX_EN                              */


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