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

📄 os_mutex.lst

📁 UCOSII2.85针对8051单片机的移植版本
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.50   OS_MUTEX                                                              12/14/2007 08:25:51 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE OS_MUTEX
OBJECT MODULE PLACED IN os_mutex.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE os_mutex.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          *********************************************************************************************************
   3          *                                                uC/OS-II
   4          *                                          The Real-Time Kernel
   5          *                                  MUTUAL EXCLUSION SEMAPHORE MANAGEMENT
   6          *
   7          *                          (c) Copyright 1992-2007, Jean J. Labrosse, Weston, FL
   8          *                                           All Rights Reserved
   9          *
  10          * File    : OS_MUTEX.C
  11          * By      : Jean J. Labrosse
  12          * Version : V2.85
  13          *
  14          * LICENSING TERMS:
  15          * ---------------
  16          *   uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research.
             -  
  17          * If you plan on using  uC/OS-II  in a commercial product you need to contact Micri祄 to properly license 
  18          * its use in your product. We provide ALL the source code for your convenience and to help you experience 
  19          * uC/OS-II.   The fact that the  source is provided does  NOT  mean that you can use it without  paying a 
  20          * licensing fee.
  21          *********************************************************************************************************
  22          */
  23          
  24          #ifndef  OS_MASTER_FILE
  25          #include <ucos_ii.h>
  26          #endif
  27          
  28          
  29          #if OS_MUTEX_EN > 0
              /*
              *********************************************************************************************************
              *                                            LOCAL CONSTANTS
              *********************************************************************************************************
              */
              
              #define  OS_MUTEX_KEEP_LOWER_8   (INT16U)0x00FFu
              #define  OS_MUTEX_KEEP_UPPER_8   (INT16U)0xFF00u
              
              #define  OS_MUTEX_AVAILABLE      (INT16U)0x00FFu
              
              /*
              *********************************************************************************************************
              *                                            LOCAL CONSTANTS
              *********************************************************************************************************
              */
              
              static  void  OSMutex_RdyAtPrio(OS_TCB *ptcb, INT8U prio) reentrant;
              
              /*$PAGE*/
              /*
              *********************************************************************************************************
              *                                   ACCEPT MUTUAL EXCLUSION SEMAPHORE
              *
              * Description: This  function checks the mutual exclusion semaphore to see if a resource is available.
C51 COMPILER V7.50   OS_MUTEX                                                              12/14/2007 08:25:51 PAGE 2   

              *              Unlike OSMutexPend(), OSMutexAccept() does not suspend the calling task if the resource is
              *              not available or the event did not occur.
              *
              * Arguments  : pevent     is a pointer to the event control block
              *
              *              perr       is a pointer to an error code which will be returned to your application:
              *                            OS_ERR_NONE         if the call was successful.
              *                            OS_ERR_EVENT_TYPE   if 'pevent' is not a pointer to a mutex
              *                            OS_ERR_PEVENT_NULL  'pevent' is a NULL pointer
              *                            OS_ERR_PEND_ISR     if you called this function from an ISR
              *                            OS_ERR_PIP_LOWER    If the priority of the task that owns the Mutex is
              *                                                HIGHER (i.e. a lower number) than the PIP.  This error
              *                                                indicates that you did not set the PIP higher (lower
              *                                                number) than ALL the tasks that compete for the Mutex.
              *                                                Unfortunately, this is something that could not be
              *                                                detected when the Mutex is created because we don't know
              *                                                what tasks will be using the Mutex.
              *
              * Returns    : == OS_TRUE    if the resource is available, the mutual exclusion semaphore is acquired
              *              == OS_FALSE   a) if the resource is not available
              *                            b) you didn't pass a pointer to a mutual exclusion semaphore
              *                            c) you called this function from an ISR
              *
              * Warning(s) : This function CANNOT be called from an ISR because mutual exclusion semaphores are
              *              intended to be used by tasks only.
              *********************************************************************************************************
              */
              
              #if OS_MUTEX_ACCEPT_EN > 0
              BOOLEAN  OSMutexAccept (OS_EVENT *pevent, INT8U *perr) reentrant
              {
                  INT8U      pip;                                    /* Priority Inheritance Priority (PIP)          */
              #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
                  OS_CPU_SR  cpu_sr = 0;
              #endif
              
              
              
              #if OS_ARG_CHK_EN > 0
                  if (perr == (INT8U *)0) {                          /* Validate 'perr'                              */
                      return (OS_FALSE);
                  }
                  if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
                      *perr = OS_ERR_PEVENT_NULL;
                      return (OS_FALSE);
                  }
              #endif
                  if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {  /* Validate event block type                    */
                      *perr = OS_ERR_EVENT_TYPE;
                      return (OS_FALSE);
                  }
                  if (OSIntNesting > 0) {                            /* Make sure it's not called from an ISR        */
                      *perr = OS_ERR_PEND_ISR;
                      return (OS_FALSE);
                  }
                  OS_ENTER_CRITICAL();                               /* Get value (0 or 1) of Mutex                  */
                  pip = (INT8U)(pevent->OSEventCnt >> 8);            /* Get PIP from mutex                           */
                  if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
                      pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;   /*      Mask off LSByte (Acquire Mutex)         */
                      pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;     /*      Save current task priority in LSByte    */
                      pevent->OSEventPtr  = (void *)OSTCBCur;        /*      Link TCB of task owning Mutex           */
                      if (OSTCBCur->OSTCBPrio <= pip) {              /*      PIP 'must' have a SMALLER prio ...      */
C51 COMPILER V7.50   OS_MUTEX                                                              12/14/2007 08:25:51 PAGE 3   

                          OS_EXIT_CRITICAL();                        /*      ... than current task!                  */
                          *perr = OS_ERR_PIP_LOWER;
                      } else {
                          OS_EXIT_CRITICAL();
                          *perr = OS_ERR_NONE;
                      }
                      return (OS_TRUE);
                  }
                  OS_EXIT_CRITICAL();
                  *perr = OS_ERR_NONE;
                  return (OS_FALSE);
              }
              #endif
              
              /*$PAGE*/
              /*
              *********************************************************************************************************
              *                                  CREATE A MUTUAL EXCLUSION SEMAPHORE
              *
              * Description: This function creates a mutual exclusion semaphore.
              *
              * Arguments  : prio          is the priority to use when accessing the mutual exclusion semaphore.  In
              *                            other words, when the semaphore is acquired and a higher priority task
              *                            attempts to obtain the semaphore then the priority of the task owning the
              *                            semaphore is raised to this priority.  It is assumed that you will specify
              *                            a priority that is LOWER in value than ANY of the tasks competing for the
              *                            mutex.
              *
              *              perr          is a pointer to an error code which will be returned to your application:
              *                               OS_ERR_NONE         if the call was successful.
              *                               OS_ERR_CREATE_ISR   if you attempted to create a MUTEX from an ISR
              *                               OS_ERR_PRIO_EXIST   if a task at the priority inheritance priority
              *                                                   already exist.
              *                               OS_ERR_PEVENT_NULL  No more event control blocks available.
              *                               OS_ERR_PRIO_INVALID if the priority you specify is higher that the
              *                                                   maximum allowed (i.e. > OS_LOWEST_PRIO)
              *
              * Returns    : != (void *)0  is a pointer to the event control clock (OS_EVENT) associated with the
              *                            created mutex.
              *              == (void *)0  if an error is detected.
              *
              * Note(s)    : 1) The LEAST significant 8 bits of '.OSEventCnt' are used to hold the priority number
              *                 of the task owning the mutex or 0xFF if no task owns the mutex.
              *
              *              2) The MOST  significant 8 bits of '.OSEventCnt' are used to hold the priority number
              *                 to use to reduce priority inversion.
              *********************************************************************************************************
              */
              
              OS_EVENT  *OSMutexCreate (INT8U prio, INT8U *perr) reentrant
              {
                  OS_EVENT  *pevent;
              #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
                  OS_CPU_SR  cpu_sr = 0;
              #endif
              
              
              
              #if OS_ARG_CHK_EN > 0
                  if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
                      return ((OS_EVENT *)0);

⌨️ 快捷键说明

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