📄 ucos_ii.lis
字号:
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 + -