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

📄 ucos_ii.lis

📁 mega16 ucos操作系统
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0000           ; #endif
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; #if (OS_ARG_CHK_EN > 0)
 0000           ;     if (perr == (INT8U *)0) {                           /* Validate 'perr'                             */
 0000           ;         return (0);
 0000           ;     }
 0000           ;     if (pevents_pend == (OS_EVENT **)0) {               /* Validate 'pevents_pend'                     */
 0000           ;        *perr =  OS_ERR_PEVENT_NULL;
 0000           ;         return (0);
 0000           ;     }
 0000           ;     if (pevents_rdy  == (OS_EVENT **)0) {               /* Validate 'pevents_rdy'                      */
 0000           ;        *perr =  OS_ERR_PEVENT_NULL;
 0000           ;         return (0);
 0000           ;     }
 0000           ;     if (pmsgs_rdy == (void **)0) {                      /* Validate 'pmsgs_rdy'                        */
 0000           ;        *perr =  OS_ERR_PEVENT_NULL;
 0000           ;         return (0);
 0000           ;     }
 0000           ; #endif
 0000           ; 
 0000           ;    *pevents_rdy = (OS_EVENT *)0;                        /* Init array to NULL in case of errors        */
 0000           ; 
 0000           ;     pevents     =  pevents_pend;
 0000           ;     pevent      = *pevents;
 0000           ;     while  (pevent != (OS_EVENT *)0) {
 0000           ;         switch (pevent->OSEventType) {                  /* Validate event block types                  */
 0000           ; #if (OS_SEM_EN  > 0)
 0000           ;             case OS_EVENT_TYPE_SEM:
 0000           ;                  break;
 0000           ; #endif
 0000           ; #if (OS_MBOX_EN > 0)
 0000           ;             case OS_EVENT_TYPE_MBOX:
 0000           ;                  break;
 0000           ; #endif
 0000           ; #if ((OS_Q_EN   > 0) && (OS_MAX_QS > 0))
 0000           ;             case OS_EVENT_TYPE_Q:
 0000           ;                  break;
 0000           ; #endif
 0000           ; 
 0000           ;             case OS_EVENT_TYPE_MUTEX:
 0000           ;             case OS_EVENT_TYPE_FLAG:
 0000           ;             default:
 0000           ;                 *perr = OS_ERR_EVENT_TYPE;
 0000           ;                  return (0);
 0000           ;         }
 0000           ;         pevents++;
 0000           ;         pevent = *pevents;
 0000           ;     }
 0000           ; 
 0000           ;     if (OSIntNesting  > 0) {                            /* See if called from ISR ...                  */
 0000           ;        *perr =  OS_ERR_PEND_ISR;                        /* ... can't PEND from an ISR                  */
 0000           ;         return (0);
 0000           ;     }
 0000           ;     if (OSLockNesting > 0) {                            /* See if called with scheduler locked ...     */
 0000           ;        *perr =  OS_ERR_PEND_LOCKED;                     /* ... can't PEND when locked                  */
 0000           ;         return (0);
 0000           ;     }
 0000           ; 
 0000           ; 
 0000           ;     OS_ENTER_CRITICAL();
 0000           ;     events_rdy     =  OS_FALSE;
 0000           ;     events_rdy_nbr =  0;
 0000           ;     events_stat    =  OS_STAT_RDY;
 0000           ;     pevents        =  pevents_pend;
 0000           ;     pevent         = *pevents;
 0000           ;     while (pevent != (OS_EVENT *)0) {                   /* See if any events already available         */
 0000           ;         switch (pevent->OSEventType) {
 0000           ; #if (OS_SEM_EN > 0)
 0000           ;             case OS_EVENT_TYPE_SEM:
 0000           ;                  if (pevent->OSEventCnt > 0) {          /* If semaphore count > 0, resource available; */
 0000           ;                      pevent->OSEventCnt--;              /* ... decrement semaphore,                ... */
 0000           ;                     *pevents_rdy++ =  pevent;           /* ... and return available semaphore event    */
 0000           ;                       events_rdy   =  OS_TRUE;
 0000           ;                     *pmsgs_rdy++   = (void *)0;         /* NO message returned  for semaphores         */
 0000           ;                       events_rdy_nbr++;
 0000           ; 
 0000           ;                  } else {
 0000           ;                       events_stat |=  OS_STAT_SEM;      /* Configure multi-pend for semaphore events   */
 0000           ;                  }
 0000           ;                  break;
 0000           ; #endif
 0000           ; 
 0000           ; #if (OS_MBOX_EN > 0)
 0000           ;             case OS_EVENT_TYPE_MBOX:
 0000           ;                  if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty;                   ... */
 0000           ;                                                         /* ... return available message,           ... */
 0000           ;                     *pmsgs_rdy++         = (void *)pevent->OSEventPtr;
 0000           ;                      pevent->OSEventPtr  = (void *)0;
 0000           ;                     *pevents_rdy++       =  pevent;     /* ... and return available mailbox event      */
 0000           ;                       events_rdy         =  OS_TRUE;
 0000           ;                       events_rdy_nbr++;
 0000           ; 
 0000           ;                  } else {
 0000           ;                       events_stat |= OS_STAT_MBOX;      /* Configure multi-pend for mailbox events     */
 0000           ;                  }
 0000           ;                  break;
 0000           ; #endif
 0000           ; 
 0000           ; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
 0000           ;             case OS_EVENT_TYPE_Q:
 0000           ;                  pq = (OS_Q *)pevent->OSEventPtr;
 0000           ;                  if (pq->OSQEntries > 0) {              /* If queue NOT empty;                     ... */
 0000           ;                                                         /* ... return available message,           ... */
 0000           ;                     *pmsgs_rdy++ = (void *)*pq->OSQOut++;
 0000           ;                      if (pq->OSQOut == pq->OSQEnd) {    /* If OUT ptr at queue end, ...                */
 0000           ;                          pq->OSQOut  = pq->OSQStart;    /* ... wrap   to queue start                   */
 0000           ;                      }
 0000           ;                      pq->OSQEntries--;                  /* Update number of queue entries              */
 0000           ;                     *pevents_rdy++ = pevent;            /* ... and return available queue event        */
 0000           ;                       events_rdy   = OS_TRUE;
 0000           ;                       events_rdy_nbr++;
 0000           ; 
 0000           ;                  } else {
 0000           ;                       events_stat |= OS_STAT_Q;         /* Configure multi-pend for queue events       */
 0000           ;                  }
 0000           ;                  break;
 0000           ; #endif
 0000           ; 
 0000           ;             case OS_EVENT_TYPE_MUTEX:
 0000           ;             case OS_EVENT_TYPE_FLAG:
 0000           ;             default:
 0000           ;                  OS_EXIT_CRITICAL();
 0000           ;                 *pevents_rdy = (OS_EVENT *)0;           /* NULL terminate return event array           */
 0000           ;                 *perr        =  OS_ERR_EVENT_TYPE;
 0000           ;                  return (events_rdy_nbr);
 0000           ;         }
 0000           ;         pevents++;
 0000           ;         pevent = *pevents;
 0000           ;     }
 0000           ; 
 0000           ;     if ( events_rdy == OS_TRUE) {                       /* Return any events already available         */
 0000           ;        *pevents_rdy = (OS_EVENT *)0;                    /* NULL terminate return event array           */
 0000           ;         OS_EXIT_CRITICAL();
 0000           ;        *perr        =  OS_ERR_NONE;
 0000           ;         return (events_rdy_nbr);
 0000           ;     }
 0000           ; 
 0000           ;                                                         /* Otherwise, must wait until any event occurs */
 0000           ;     OSTCBCur->OSTCBStat     |= events_stat  |           /* Resource not available, ...                 */
 0000           ;                                OS_STAT_MULTI;           /* ... pend on multiple events                 */
 0000           ;     OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
 0000           ;     OSTCBCur->OSTCBDly       = timeout;                 /* Store pend timeout in TCB                   */
 0000           ;     OS_EventTaskWaitMulti(pevents_pend);                /* Suspend task until events or timeout occurs */
 0000           ; 
 0000           ;     OS_EXIT_CRITICAL();
 0000           ;     OS_Sched();                                         /* Find next highest priority task ready       */
 0000           ;     OS_ENTER_CRITICAL();
 0000           ; 
 0000           ;     switch (OSTCBCur->OSTCBStatPend) {                  /* Handle event posted, aborted, or timed-out  */
 0000           ;         case OS_STAT_PEND_OK:
 0000           ;         case OS_STAT_PEND_ABORT:
 0000           ;              pevent = OSTCBCur->OSTCBEventPtr;
 0000           ;              if (pevent != (OS_EVENT *)0) {             /* If task event ptr != NULL, ...              */
 0000           ;                 *pevents_rdy++ =  pevent;               /* ... return available event ...              */
 0000           ;                 *pevents_rdy   = (OS_EVENT *)0;         /* ... & NULL terminate return event array     */
 0000           ;                   events_rdy_nbr++;
 0000           ; 
 0000           ;              } else {                                   /* Else NO event available, handle as timeout  */
 0000           ;                  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_TO;
 0000           ;                  OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
 0000           ;              }
 0000           ;                        break;
 0000           ; 
 0000           ;         case OS_STAT_PEND_TO:                           /* If events timed out, ...                    */
 0000           ;         default:                                        /* ... remove task from events' wait lists     */
 0000           ;              OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
 0000           ;              break;
 0000           ;     }
 0000           ; 
 0000           ;     switch (OSTCBCur->OSTCBStatPend) {
 0000           ;         case OS_STAT_PEND_OK:
 0000           ;              switch (pevent->OSEventType) {             /* Return event's message                      */
 0000           ; #if (OS_SEM_EN > 0)
 0000           ;                  case OS_EVENT_TYPE_SEM:
 0000           ;                      *pmsgs_rdy++ = (void *)0;          /* NO message returned for semaphores          */
 0000           ;                       break;
 0000           ; #endif
 0000           ; 
 0000           ; #if ((OS_MBOX_EN > 0) ||                 \
 0000           ;     ((OS_Q_EN    > 0) && (OS_MAX_QS > 0)))
 0000           ;                  case OS_EVENT_TYPE_MBOX:
 0000           ;                  case OS_EVENT_TYPE_Q:
 0000           ;                      *pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg;     /* Return received message         */
 0000           ;                       break;
 0000           ; #endif
 0000           ; 
 0000           ;                  case OS_EVENT_TYPE_MUTEX:
 0000           ;                  case OS_EVENT_TYPE_FLAG:
 0000           ;                  default:
 0000           ;                       OS_EXIT_CRITICAL();
 0000           ;                      *pevents_rdy = (OS_EVENT *)0;      /* NULL terminate return event array           */
 0000           ;                      *perr        =  OS_ERR_EVENT_TYPE;
 0000           ;                       return (events_rdy_nbr);
 0000           ;              }
 0000           ;             *perr = OS_ERR_NONE;
 0000           ;              break;
 0000           ; 
 0000           ;         case OS_STAT_PEND_ABORT:
 0000           ;             *pmsgs_rdy++ = (void *)0;                   /* NO message returned for abort               */
 0000           ;             *perr        =  OS_ERR_PEND_ABORT;          /* Indicate that event  aborted                */
 0000           ;              break;
 0000           ; 
 0000           ;         case OS_STAT_PEND_TO:
 0000           ;         default:
 0000           ;             *pmsgs_rdy++ = (void *)0;                   /* NO message returned for timeout             */
 0000           ;             *perr        =  OS_ERR_TIMEOUT;             /* Indicate that events timed out              */
 0000           ;              break;
 0000           ;     }
 0000           ; 
 0000           ;     OSTCBCur->OSTCBStat          =  OS_STAT_RDY;        /* Set   task  status to ready                 */
 0000           ;     OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;    /* Clear pend  status                          */
 0000           ;     OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;      /* Clear event pointers                        */
 0000           ;     OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
 0000           ; //    OSTCBCur->OSTCBMsg           = (void      *)0;      /* Clear task  message                         */
 0000           ;     OS_EXIT_CRITICAL();
 0000           ; 
 0000           ;     return (events_rdy_nbr);
 0000           ; }
 0000           ; #endif
 0000           ; 
 0000           ; /*
 0000           ; *********************************************************************************************************
 0000           ; *                                             INITIALIZATION
 0000           ; *
 0000           ; * Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
 0000           ; *              creating any uC/OS-II object and, prior to calling OSStart().
 0000           ; *
 0000           ; * Arguments  : none
 0000           ; *
 0000           ; * Returns    : none
 0000           ; *********************************************************************************************************
 0000           ; */
 0000           ; 
 0000           ; void  OSInit (void)
 0000           ; {
 0000                   .dbline 556
 0000           ;    
 0000           ;       OSInitHookBegin();                                           /* Call port specific initialization code   */
 0000 0E940000          xcall _OSInitHook

⌨️ 快捷键说明

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