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

📄 os_flag.lst

📁 一个关于UCOS的KEIL工程
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V6.23a  OS_FLAG                                                               12/09/2004 16:50:25 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE OS_FLAG
OBJECT MODULE PLACED IN OS_FLAG.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE OS_FLAG.C LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*
   2          *********************************************************************************************************
   3          *                                                uC/OS-II
   4          *                                          The Real-Time Kernel
   5          *                                         EVENT FLAG  MANAGEMENT
   6          *
   7          *                          (c) Copyright 2001-2002, Jean J. Labrosse, Weston, FL
   8          *                                           All Rights Reserved
   9          *
  10          * File : OS_FLAG.C
  11          * By   : Jean J. Labrosse
  12          *********************************************************************************************************
  13          */
  14          
  15          #ifndef  OS_MASTER_FILE
  16          #include "INCLUDES.H"
  17          #endif
  18          
  19          #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
  20          /*
  21          *********************************************************************************************************
  22          *                                            LOCAL PROTOTYPES
  23          *********************************************************************************************************
  24          */
  25          
  26          static  void     OS_FlagBlock(OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT
             -16U timeout) KCREENTRANT;
  27          static  BOOLEAN  OS_FlagTaskRdy(OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy) KCREENTRANT;
  28          
  29          /*$PAGE*/
  30          /*
  31          *********************************************************************************************************
  32          *                              CHECK THE STATUS OF FLAGS IN AN EVENT FLAG GROUP
  33          *
  34          * Description: This function is called to check the status of a combination of bits to be set or cleared
  35          *              in an event flag group.  Your application can check for ANY bit to be set/cleared or ALL
  36          *              bits to be set/cleared.
  37          *
  38          *              This call does not block if the desired flags are not present.
  39          *
  40          * Arguments  : pgrp          is a pointer to the desired event flag group.
  41          *
  42          *              flags         Is a bit pattern indicating which bit(s) (i.e. flags) you wish to check.
  43          *                            The bits you want are specified by setting the corresponding bits in
  44          *                            'flags'.  e.g. if your application wants to wait for bits 0 and 1 then
  45          *                            'flags' would contain 0x03.
  46          *
  47          *              wait_type     specifies whether you want ALL bits to be set/cleared or ANY of the bits
  48          *                            to be set/cleared.
  49          *                            You can specify the following argument:
  50          *
  51          *                            OS_FLAG_WAIT_CLR_ALL   You will check ALL bits in 'flags' to be clear (0)
  52          *                            OS_FLAG_WAIT_CLR_ANY   You will check ANY bit  in 'flags' to be clear (0)
  53          *                            OS_FLAG_WAIT_SET_ALL   You will check ALL bits in 'flags' to be set   (1)
  54          *                            OS_FLAG_WAIT_SET_ANY   You will check ANY bit  in 'flags' to be set   (1)
C51 COMPILER V6.23a  OS_FLAG                                                               12/09/2004 16:50:25 PAGE 2   

  55          *
  56          *                            NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
  57          *                                  the call.  Example, to wait for any flag in a group AND then clear
  58          *                                  the flags that are present, set 'wait_type' to:
  59          *
  60          *                                  OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
  61          *
  62          *              err           is a pointer to an error code and can be:
  63          *                            OS_NO_ERR              No error
  64          *                            OS_ERR_EVENT_TYPE      You are not pointing to an event flag group
  65          *                            OS_FLAG_ERR_WAIT_TYPE  You didn't specify a proper 'wait_type' argument.
  66          *                            OS_FLAG_INVALID_PGRP   You passed a NULL pointer instead of the event flag
  67          *                                                   group handle.
  68          *                            OS_FLAG_ERR_NOT_RDY    The desired flags you are waiting for are not
  69          *                                                   available.
  70          *
  71          * Returns    : The state of the flags in the event flag group.
  72          *
  73          * Called from: Task or ISR
  74          *********************************************************************************************************
  75          */
  76          
  77          #if OS_FLAG_ACCEPT_EN > 0
  78          OS_FLAGS  OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err) KCREENTRANT
  79          {
  80   1      #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
                  OS_CPU_SR     cpu_sr;
              #endif
  83   1          OS_FLAGS      flags_cur;
  84   1          OS_FLAGS      flags_rdy;
  85   1          BOOLEAN       consume;
  86   1      
  87   1      
  88   1      #if OS_ARG_CHK_EN > 0
  89   1          if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
  90   2              *err = OS_FLAG_INVALID_PGRP;
  91   2              return ((OS_FLAGS)0);
  92   2          }
  93   1          if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
  94   2              *err = OS_ERR_EVENT_TYPE;
  95   2              return ((OS_FLAGS)0);
  96   2          }
  97   1      #endif
  98   1          if (wait_type & OS_FLAG_CONSUME) {                     /* See if we need to consume the flags      */
  99   2              wait_type &= ~OS_FLAG_CONSUME;
 100   2              consume    = TRUE;
 101   2          } else {
 102   2              consume    = FALSE;
 103   2          }
 104   1      /*$PAGE*/
 105   1          *err = OS_NO_ERR;                                      /* Assume NO error until proven otherwise.  */
 106   1          OS_ENTER_CRITICAL();
 107   1          switch (wait_type) {
 108   2              case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
 109   2                   flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
 110   2                   if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
 111   3                       if (consume == TRUE) {                    /* See if we need to consume the flags      */
 112   4                           pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
 113   4                       }
 114   3                   } else {
 115   3                       *err  = OS_FLAG_ERR_NOT_RDY;
 116   3                   }
C51 COMPILER V6.23a  OS_FLAG                                                               12/09/2004 16:50:25 PAGE 3   

 117   2                   flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
 118   2                   OS_EXIT_CRITICAL();
 119   2                   break;
 120   2      
 121   2              case OS_FLAG_WAIT_SET_ANY:
 122   2                   flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
 123   2                   if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
 124   3                       if (consume == TRUE) {                    /* See if we need to consume the flags      */
 125   4                           pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
 126   4                       }
 127   3                   } else {
 128   3                       *err  = OS_FLAG_ERR_NOT_RDY;
 129   3                   }
 130   2                   flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
 131   2                   OS_EXIT_CRITICAL();
 132   2                   break;
 133   2      
 134   2      #if OS_FLAG_WAIT_CLR_EN > 0
 135   2              case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
 136   2                   flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
 137   2                   if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
 138   3                       if (consume == TRUE) {                    /* See if we need to consume the flags      */
 139   4                           pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
 140   4                       }
 141   3                   } else {
 142   3                       *err  = OS_FLAG_ERR_NOT_RDY;
 143   3                   }
 144   2                   flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
 145   2                   OS_EXIT_CRITICAL();
 146   2                   break;
 147   2      
 148   2              case OS_FLAG_WAIT_CLR_ANY:
 149   2                   flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
 150   2                   if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
 151   3                       if (consume == TRUE) {                    /* See if we need to consume the flags      */
 152   4                           pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
 153   4                       }
 154   3                   } else {
 155   3                       *err  = OS_FLAG_ERR_NOT_RDY;
 156   3                   }
 157   2                   flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
 158   2                   OS_EXIT_CRITICAL();
 159   2                   break;
 160   2      #endif
 161   2      
 162   2              default:
 163   2                   OS_EXIT_CRITICAL();
 164   2                   flags_cur = (OS_FLAGS)0;
 165   2                   *err      = OS_FLAG_ERR_WAIT_TYPE;
 166   2                   break;
 167   2          }
 168   1          return (flags_cur);
 169   1      }
 170          #endif
 171          
 172          /*$PAGE*/
 173          /*
 174          *********************************************************************************************************
 175          *                                           CREATE AN EVENT FLAG
 176          *
 177          * Description: This function is called to create an event flag group.
 178          *
C51 COMPILER V6.23a  OS_FLAG                                                               12/09/2004 16:50:25 PAGE 4   

 179          * Arguments  : flags         Contains the initial value to store in the event flag group.
 180          *
 181          *              err           is a pointer to an error code which will be returned to your application:
 182          *                               OS_NO_ERR                if the call was successful.
 183          *                               OS_ERR_CREATE_ISR        if you attempted to create an Event Flag from an
 184          *                                                        ISR.
 185          *                               OS_FLAG_GRP_DEPLETED     if there are no more event flag groups
 186          *
 187          * Returns    : A pointer to an event flag group or a NULL pointer if no more groups are available.
 188          *
 189          * Called from: Task ONLY
 190          *********************************************************************************************************
 191          */
 192          
 193          OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, INT8U *err) KCREENTRANT
 194          {
 195   1      #if OS_CRITICAL_METHOD == 3                         /* Allocate storage for CPU status register        */
                  OS_CPU_SR    cpu_sr;
              #endif
 198   1          OS_FLAG_GRP *pgrp;
 199   1      
 200   1      
 201   1          if (OSIntNesting > 0) {                         /* See if called from ISR ...                      */
 202   2              *err = OS_ERR_CREATE_ISR;                   /* ... can't CREATE from an ISR                    */
 203   2              return ((OS_FLAG_GRP *)0);
 204   2          }
 205   1          OS_ENTER_CRITICAL();
 206   1          pgrp = OSFlagFreeList;                          /* Get next free event flag                        */
 207   1          if (pgrp != (OS_FLAG_GRP *)0) {                 /* See if we have event flag groups available      */
 208   2                                                          /* Adjust free list                                */
 209   2              OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
 210   2              pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */
 211   2              pgrp->OSFlagFlags    = flags;               /* Set to desired initial value                    */
 212   2              pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on flags            */
 213   2              OS_EXIT_CRITICAL();
 214   2              *err                 = OS_NO_ERR;
 215   2          } else {
 216   2              OS_EXIT_CRITICAL();
 217   2              *err                 = OS_FLAG_GRP_DEPLETED;
 218   2          }
 219   1          return (pgrp);                                  /* Return pointer to event flag group              */
 220   1      }
 221          
 222          /*$PAGE*/

⌨️ 快捷键说明

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