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

📄 os_flag.src

📁 本文面向首次接触uC/OS-II的程序员
💻 SRC
📖 第 1 页 / 共 4 页
字号:
;         *err = OS_FLAG_INVALID_PGRP;
;         return ((OS_FLAGS)0);
;     }
;     if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
;         *err = OS_ERR_EVENT_TYPE;
;         return ((OS_FLAGS)0);
;     }
; #endif
;     if (wait_type & OS_FLAG_CONSUME) {                     /* See if we need to consume the flags      */
;         wait_type &= ~OS_FLAG_CONSUME;
;         consume    = TRUE;
;     } else {
;         consume    = FALSE;
;     }
; /*$PAGE*/
;     OS_ENTER_CRITICAL();
;     switch (wait_type) {
;         case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
;              flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
;              if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
;                      pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
;                  }
;                  flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;                  OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;                  *err      = OS_NO_ERR;
;                  return (flags_cur);
;              } else {                                      /* Block task until events occur or timeout */
;                  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;                  OS_EXIT_CRITICAL();
;              }
;              break;
; 
;         case OS_FLAG_WAIT_SET_ANY:
;              flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
;              if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
;                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
;                      pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
;                  }
;                  flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;                  OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;                  *err      = OS_NO_ERR;
;                  return (flags_cur);
;              } else {                                      /* Block task until events occur or timeout */
;                  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;                  OS_EXIT_CRITICAL();
;              }
;              break;
; 
; #if OS_FLAG_WAIT_CLR_EN > 0
;         case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
;              flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
;              if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
;                      pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
;                  }
;                  flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;                  OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;                  *err      = OS_NO_ERR;
;                  return (flags_cur);
;              } else {                                      /* Block task until events occur or timeout */
;                  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;                  OS_EXIT_CRITICAL();
;              }
;              break;
; 
;         case OS_FLAG_WAIT_CLR_ANY:
;              flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
;              if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
;                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
;                      pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
;                  }
;                  flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;                  OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;                  *err      = OS_NO_ERR;
;                  return (flags_cur);
;              } else {                                      /* Block task until events occur or timeout */
;                  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;                  OS_EXIT_CRITICAL();
;              }
;              break;
; #endif
; 
;         default:
;              OS_EXIT_CRITICAL();
;              flags_cur = (OS_FLAGS)0;
;              *err      = OS_FLAG_ERR_WAIT_TYPE;
;              return (flags_cur);
;     }
;     OS_Sched();                                            /* Find next HPT ready to run               */
;     OS_ENTER_CRITICAL();
;     if (OSTCBCur->OSTCBStat & OS_STAT_FLAG) {              /* Have we timed-out?                       */
;         OS_FlagUnlink(&node);
;         OSTCBCur->OSTCBStat = OS_STAT_RDY;                 /* Yes, make task ready-to-run              */
;         OS_EXIT_CRITICAL();
;         flags_cur           = (OS_FLAGS)0;
;         *err                = OS_TIMEOUT;                  /* Indicate that we timed-out waiting       */
;     } else {
;         if (consume == TRUE) {                             /* See if we need to consume the flags      */
;             switch (wait_type) {
;                 case OS_FLAG_WAIT_SET_ALL:
;                 case OS_FLAG_WAIT_SET_ANY:                 /* Clear ONLY the flags we got              */
;                      pgrp->OSFlagFlags &= ~OSTCBCur->OSTCBFlagsRdy;
;                      break;
; 
; #if OS_FLAG_WAIT_CLR_EN > 0
;                 case OS_FLAG_WAIT_CLR_ALL:
;                 case OS_FLAG_WAIT_CLR_ANY:                 /* Set   ONLY the flags we got              */
;                      pgrp->OSFlagFlags |= OSTCBCur->OSTCBFlagsRdy;
;                      break;
; #endif
;             }
;         }
;         flags_cur = pgrp->OSFlagFlags;
;         OS_EXIT_CRITICAL();
;         *err      = OS_NO_ERR;                             /* Event(s) must have occurred              */
;     }
;     return (flags_cur);
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                         POST EVENT FLAG BIT(S)
; *
; * Description: This function is called to set or clear some bits in an event flag group.  The bits to
; *              set or clear are specified by a 'bit mask'.
; *
; * Arguments  : pgrp          is a pointer to the desired event flag group.
; *
; *              flags         If 'opt' (see below) is OS_FLAG_SET, each bit that is set in 'flags' will
; *                            set the corresponding bit in the event flag group.  e.g. to set bits 0, 4
; *                            and 5 you would set 'flags' to:
; *
; *                                0x31     (note, bit 0 is least significant bit)
; *
; *                            If 'opt' (see below) is OS_FLAG_CLR, each bit that is set in 'flags' will
; *                            CLEAR the corresponding bit in the event flag group.  e.g. to clear bits 0,
; *                            4 and 5 you would specify 'flags' as:
; *
; *                                0x31     (note, bit 0 is least significant bit)
; *
; *              opt           indicates whether the flags will be:
; *                                set     (OS_FLAG_SET) or
; *                                cleared (OS_FLAG_CLR)
; *
; *              err           is a pointer to an error code and can be:
; *                            OS_NO_ERR              The call was successfull
; *                            OS_FLAG_INVALID_PGRP   You passed a NULL pointer
; *                            OS_ERR_EVENT_TYPE      You are not pointing to an event flag group
; *                            OS_FLAG_INVALID_OPT    You specified an invalid option
; *
; * Returns    : the new value of the event flags bits that are still set.
; *
; * Called From: Task or ISR
; *
; * WARNING(s) : 1) The execution time of this function depends on the number of tasks waiting on the event
; *                 flag group.
; *              2) The amount of time interrupts are DISABLED depends on the number of tasks waiting on
; *                 the event flag group.
; *********************************************************************************************************
; */
; OS_FLAGS  OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3                          /* Allocate storage for CPU status register       */
;     OS_CPU_SR     cpu_sr;
; #endif
;     OS_FLAG_NODE *pnode;
;     BOOLEAN       sched;
;     OS_FLAGS      flags_cur;
;     OS_FLAGS      flags_rdy;
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (pgrp == (OS_FLAG_GRP *)0) {                  /* Validate 'pgrp'                                */
;         *err = OS_FLAG_INVALID_PGRP;
;         return ((OS_FLAGS)0);
;     }
;     if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {    /* Make sure we are pointing to an event flag grp */
;         *err = OS_ERR_EVENT_TYPE;
;         return ((OS_FLAGS)0);
;     }
; #endif
; /*$PAGE*/
;     OS_ENTER_CRITICAL();
;     switch (opt) {
;         case OS_FLAG_CLR:
;              pgrp->OSFlagFlags &= ~flags;            /* Clear the flags specified in the group         */
;              break;
; 
;         case OS_FLAG_SET:
;              pgrp->OSFlagFlags |=  flags;            /* Set   the flags specified in the group         */
;              break;
; 
;         default:
;              OS_EXIT_CRITICAL();                     /* INVALID option                                 */
;              *err = OS_FLAG_INVALID_OPT;
;              return ((OS_FLAGS)0);
;     }
;     sched = FALSE;                                   /* Indicate that we don't need rescheduling       */
;     pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;     while (pnode != (OS_FLAG_NODE *)0) {             /* Go through all tasks waiting on event flag(s)  */
;         switch (pnode->OSFlagNodeWaitType) {
;             case OS_FLAG_WAIT_SET_ALL:               /* See if all req. flags are set for current node */
;                  flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;                  if (flags_rdy == pnode->OSFlagNodeFlags) {
;                      if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;                          sched = TRUE;                               /* When done we will reschedule   */
;                      }
;                  }
;                  break;
; 
;             case OS_FLAG_WAIT_SET_ANY:               /* See if any flag set                            */
;                  flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;                  if (flags_rdy != (OS_FLAGS)0) {
;                      if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;                          sched = TRUE;                               /* When done we will reschedule   */
;                      }
;                  }
;                  break;
; 
; #if OS_FLAG_WAIT_CLR_EN > 0
;             case OS_FLAG_WAIT_CLR_ALL:               /* See if all req. flags are set for current node */
;                  flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;                  if (flags_rdy == pnode->OSFlagNodeFlags) {
;                      if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;                          sched = TRUE;                               /* When done we will reschedule   */
;                      }
;                  }
;                  break;
; 
;             case OS_FLAG_WAIT_CLR_ANY:               /* See if any flag set                            */
;                  flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;                  if (flags_rdy != (OS_FLAGS)0) {
;                      if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;                          sched = TRUE;                               /* When done we will reschedule   */
;                      }
;                  }
;                  break;
; #endif
;         }
;         pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
;     }
;     OS_EXIT_CRITICAL();
;     if (sched == TRUE) {
;         OS_Sched();
;     }
;     OS_ENTER_CRITICAL();
;     flags_cur = pgrp->OSFlagFlags;
;     OS_EXIT_CRITICAL();
;     *err      = OS_NO_ERR;
;     return (flags_cur);
; }
; /*$PAGE*/
; /*

⌨️ 快捷键说明

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