亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? os_core.c

?? 在IAR EWARM開發(fā)環(huán)境下的ucos_2操作系統(tǒng)在LPC2200上的應(yīng)用
?? C
?? 第 1 頁 / 共 5 頁
字號:
*                 case of any error(s).
*********************************************************************************************************
*/
/*$PAGE*/
#if ((OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0))
INT16U  OSEventPendMulti (OS_EVENT **pevents_pend, OS_EVENT **pevents_rdy, void **pmsgs_rdy, INT16U timeout, INT8U *perr)
{
    OS_EVENT  **pevents;
    OS_EVENT   *pevent;
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
    OS_Q       *pq;
#endif
    BOOLEAN     events_rdy;
    INT16U      events_rdy_nbr;
    INT8U       events_stat;
#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 (0);
    }
    if (pevents_pend == (OS_EVENT **)0) {               /* Validate 'pevents_pend'                     */
       *perr =  OS_ERR_PEVENT_NULL;
        return (0);
    }
    if (pevents_rdy  == (OS_EVENT **)0) {               /* Validate 'pevents_rdy'                      */
       *perr =  OS_ERR_PEVENT_NULL;
        return (0);
    }
    if (pmsgs_rdy == (void **)0) {                      /* Validate 'pmsgs_rdy'                        */
       *perr =  OS_ERR_PEVENT_NULL;
        return (0);
    }
#endif

   *pevents_rdy = (OS_EVENT *)0;                        /* Init array to NULL in case of errors        */

    pevents     =  pevents_pend;
    pevent      = *pevents;
    while  (pevent != (OS_EVENT *)0) {
        switch (pevent->OSEventType) {                  /* Validate event block types                  */
#if (OS_SEM_EN  > 0)
            case OS_EVENT_TYPE_SEM:
                 break;
#endif
#if (OS_MBOX_EN > 0)
            case OS_EVENT_TYPE_MBOX:
                 break;
#endif
#if ((OS_Q_EN   > 0) && (OS_MAX_QS > 0))
            case OS_EVENT_TYPE_Q:
                 break;
#endif

            case OS_EVENT_TYPE_MUTEX:                                            
            case OS_EVENT_TYPE_FLAG:
            default:           
                *perr = OS_ERR_EVENT_TYPE;
                 return (0);
        }
        pevents++;
        pevent = *pevents;
    }

    if (OSIntNesting  > 0) {                            /* See if called from ISR ...                  */
       *perr =  OS_ERR_PEND_ISR;                        /* ... can't PEND from an ISR                  */
        return (0);
    }
    if (OSLockNesting > 0) {                            /* See if called with scheduler locked ...     */
       *perr =  OS_ERR_PEND_LOCKED;                     /* ... can't PEND when locked                  */
        return (0);
    }

/*$PAGE*/
    OS_ENTER_CRITICAL();
    events_rdy     =  OS_FALSE;
    events_rdy_nbr =  0;
    events_stat    =  OS_STAT_RDY;
    pevents        =  pevents_pend;
    pevent         = *pevents;
    while (pevent != (OS_EVENT *)0) {                   /* See if any events already available         */
        switch (pevent->OSEventType) {
#if (OS_SEM_EN > 0)
            case OS_EVENT_TYPE_SEM:
                 if (pevent->OSEventCnt > 0) {          /* If semaphore count > 0, resource available; */
                     pevent->OSEventCnt--;              /* ... decrement semaphore,                ... */
                    *pevents_rdy++ =  pevent;           /* ... and return available semaphore event    */
                      events_rdy   =  OS_TRUE;
                    *pmsgs_rdy++   = (void *)0;         /* NO message returned  for semaphores         */
                      events_rdy_nbr++;

                 } else {
                      events_stat |=  OS_STAT_SEM;      /* Configure multi-pend for semaphore events   */
                 }
                 break;
#endif

#if (OS_MBOX_EN > 0)
            case OS_EVENT_TYPE_MBOX:
                 if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty;                   ... */
                                                        /* ... return available message,           ... */
                    *pmsgs_rdy++         = (void *)pevent->OSEventPtr;
                     pevent->OSEventPtr  = (void *)0;
                    *pevents_rdy++       =  pevent;     /* ... and return available mailbox event      */
                      events_rdy         =  OS_TRUE;
                      events_rdy_nbr++;

                 } else {
                      events_stat |= OS_STAT_MBOX;      /* Configure multi-pend for mailbox events     */
                 }
                 break;
#endif

#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
            case OS_EVENT_TYPE_Q:
                 pq = (OS_Q *)pevent->OSEventPtr;
                 if (pq->OSQEntries > 0) {              /* If queue NOT empty;                     ... */
                                                        /* ... return available message,           ... */
                    *pmsgs_rdy++ = (void *)*pq->OSQOut++;
                     if (pq->OSQOut == pq->OSQEnd) {    /* If OUT ptr at queue end, ...                */
                         pq->OSQOut  = pq->OSQStart;    /* ... wrap   to queue start                   */
                     }
                     pq->OSQEntries--;                  /* Update number of queue entries              */
                    *pevents_rdy++ = pevent;            /* ... and return available queue event        */
                      events_rdy   = OS_TRUE;
                      events_rdy_nbr++;

                 } else {
                      events_stat |= OS_STAT_Q;         /* Configure multi-pend for queue events       */
                 }
                 break;
#endif

            case OS_EVENT_TYPE_MUTEX:                                            
            case OS_EVENT_TYPE_FLAG:
            default:           
                 OS_EXIT_CRITICAL();
                *pevents_rdy = (OS_EVENT *)0;           /* NULL terminate return event array           */
                *perr        =  OS_ERR_EVENT_TYPE;
                 return (events_rdy_nbr);
        }
        pevents++;
        pevent = *pevents;
    }

    if ( events_rdy == OS_TRUE) {                       /* Return any events already available         */
       *pevents_rdy = (OS_EVENT *)0;                    /* NULL terminate return event array           */
        OS_EXIT_CRITICAL();
       *perr        =  OS_ERR_NONE;
        return (events_rdy_nbr);
    }
/*$PAGE*/
                                                        /* Otherwise, must wait until any event occurs */
    OSTCBCur->OSTCBStat     |= events_stat  |           /* Resource not available, ...                 */
                               OS_STAT_MULTI;           /* ... pend on multiple events                 */
    OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
    OSTCBCur->OSTCBDly       = timeout;                 /* Store pend timeout in TCB                   */
    OS_EventTaskWaitMulti(pevents_pend);                /* Suspend task until events or timeout occurs */

    OS_EXIT_CRITICAL();
    OS_Sched();                                         /* Find next highest priority task ready       */
    OS_ENTER_CRITICAL();

    switch (OSTCBCur->OSTCBStatPend) {                  /* Handle event posted, aborted, or timed-out  */
        case OS_STAT_PEND_OK:
        case OS_STAT_PEND_ABORT:
             pevent = OSTCBCur->OSTCBEventPtr;
             if (pevent != (OS_EVENT *)0) {             /* If task event ptr != NULL, ...              */
                *pevents_rdy++ =  pevent;               /* ... return available event ...              */
                *pevents_rdy   = (OS_EVENT *)0;         /* ... & NULL terminate return event array     */
                  events_rdy_nbr++;

             } else {                                   /* Else NO event available, handle as timeout  */
                 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_TO;
                 OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
             }
			 break;

        case OS_STAT_PEND_TO:                           /* If events timed out, ...                    */
        default:                                        /* ... remove task from events' wait lists     */
             OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
             break;
    }

    switch (OSTCBCur->OSTCBStatPend) {
        case OS_STAT_PEND_OK:
             switch (pevent->OSEventType) {             /* Return event's message                      */
#if (OS_SEM_EN > 0)
                 case OS_EVENT_TYPE_SEM:
                     *pmsgs_rdy++ = (void *)0;          /* NO message returned for semaphores          */
                      break;
#endif

#if ((OS_MBOX_EN > 0) ||                 \
    ((OS_Q_EN    > 0) && (OS_MAX_QS > 0)))
                 case OS_EVENT_TYPE_MBOX:
                 case OS_EVENT_TYPE_Q:
                     *pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg;     /* Return received message         */
                      break;
#endif

                 case OS_EVENT_TYPE_MUTEX:                                       
                 case OS_EVENT_TYPE_FLAG:
                 default:           
                      OS_EXIT_CRITICAL();
                     *pevents_rdy = (OS_EVENT *)0;      /* NULL terminate return event array           */
                     *perr        =  OS_ERR_EVENT_TYPE;
                      return (events_rdy_nbr);
             }
            *perr = OS_ERR_NONE;
             break;

        case OS_STAT_PEND_ABORT:
            *pmsgs_rdy++ = (void *)0;                   /* NO message returned for abort               */
            *perr        =  OS_ERR_PEND_ABORT;          /* Indicate that event  aborted                */
             break;
                                                        
        case OS_STAT_PEND_TO:                                                
        default:        
            *pmsgs_rdy++ = (void *)0;                   /* NO message returned for timeout             */
            *perr        =  OS_ERR_TIMEOUT;             /* Indicate that events timed out              */
             break;
    }

    OSTCBCur->OSTCBStat          =  OS_STAT_RDY;        /* Set   task  status to ready                 */
    OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;    /* Clear pend  status                          */
    OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;      /* Clear event pointers                        */
    OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
    OSTCBCur->OSTCBMsg           = (void      *)0;      /* Clear task  message                         */
    OS_EXIT_CRITICAL();

    return (events_rdy_nbr);
}
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                             INITIALIZATION
*
* Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
*              creating any uC/OS-II object and, prior to calling OSStart().
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/

void  OSInit (void)
{
    OSInitHookBegin();                                           /* Call port specific initialization code   */

    OS_InitMisc();                                               /* Initialize miscellaneous variables       */

    OS_InitRdyList();                                            /* Initialize the Ready List                */

    OS_InitTCBList();                                            /* Initialize the free list of OS_TCBs      */

    OS_InitEventList();                                          /* Initialize the free list of OS_EVENTs    */

#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FlagInit();                                               /* Initialize the event flag structures     */
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
    OS_MemInit();                                                /* Initialize the memory manager            */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
    OS_QInit();                                                  /* Initialize the message queue structures  */
#endif

    OS_InitTaskIdle();                                           /* Create the Idle Task                     */
#if OS_TASK_STAT_EN > 0
    OS_InitTaskStat();                                           /* Create the Statistic Task                */
#endif

#if OS_TMR_EN > 0
    OSTmr_Init();                                                /* Initialize the Timer Manager             */
#endif

    OSInitHookEnd();                                             /* Call port specific init. code            */

#if OS_DEBUG_EN > 0
    OSDebugInit();
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              ENTER ISR
*
* Description: This function is used to notify uC/OS-II that you are about to service an interrupt
*              service routine (ISR).  This allows uC/OS-II to keep track of interrupt nesting and thus
*              only perform rescheduling at the last nested ISR.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品视频在线观看视频| 欧美一区二区免费| 久久国产精品99久久久久久老狼| 中文字幕在线观看一区二区| 欧美不卡在线视频| 91精品在线观看入口| 欧美三级电影精品| 色欧美88888久久久久久影院| 波波电影院一区二区三区| 国产一区二区三区黄视频| 激情六月婷婷久久| 国产精品一二一区| 岛国av在线一区| av中文字幕在线不卡| a亚洲天堂av| 色综合久久久久久久久久久| 91国在线观看| 欧美精品久久一区二区三区| 在线不卡a资源高清| 精品欧美黑人一区二区三区| 精品噜噜噜噜久久久久久久久试看| 欧美大片日本大片免费观看| 日韩免费一区二区三区在线播放| 日韩精品在线一区| 久久夜色精品国产噜噜av| 久久精品亚洲乱码伦伦中文| 中文字幕在线观看不卡视频| 一区二区三区在线观看国产| 五月婷婷激情综合网| 美女看a上一区| 成人黄色av电影| 欧美亚一区二区| 久久久亚洲午夜电影| 中文字幕在线不卡| 亚洲成av人片| 国产麻豆精品95视频| 99久久精品免费看国产| 欧美日本韩国一区| 久久在线免费观看| 亚洲综合一二区| 国产制服丝袜一区| 一本久久a久久免费精品不卡| 欧美电影影音先锋| 欧美激情中文不卡| 午夜欧美在线一二页| 国产成人精品亚洲午夜麻豆| 日本精品视频一区二区| 2020国产精品| 亚洲一二三区视频在线观看| 国产精品一二一区| 日韩一级片网址| 亚洲欧美综合色| 韩国在线一区二区| 制服丝袜亚洲精品中文字幕| 国产精品视频第一区| 日本欧美大码aⅴ在线播放| 成人午夜电影网站| 精品少妇一区二区三区免费观看 | 91丨九色丨蝌蚪富婆spa| 欧美日韩另类一区| 国产精品二三区| 激情五月婷婷综合网| 欧美日韩国产bt| 一区二区三区在线视频免费 | 成人精品视频一区二区三区尤物| 欧美日韩在线直播| 亚洲天天做日日做天天谢日日欢| 美女一区二区视频| 欧美浪妇xxxx高跟鞋交| 亚洲视频综合在线| 成人爽a毛片一区二区免费| 精品久久国产老人久久综合| 亚洲一区成人在线| 一本色道a无线码一区v| 国产精品天天摸av网| 国产河南妇女毛片精品久久久| 欧美一区二视频| 午夜欧美2019年伦理| 欧美日韩国产片| 亚洲精品少妇30p| 一本色道久久综合亚洲精品按摩| 国产偷v国产偷v亚洲高清| 国产一级精品在线| 国产清纯白嫩初高生在线观看91| 国产在线精品一区二区三区不卡| 欧美一级日韩一级| 久久99在线观看| 日韩免费视频线观看| 国产一区二区三区香蕉 | 久久午夜老司机| 国模冰冰炮一区二区| 久久精子c满五个校花| 国产一本一道久久香蕉| 国产午夜久久久久| 国产.精品.日韩.另类.中文.在线.播放| 久久精品一区二区三区不卡| 国产91在线|亚洲| 一区在线播放视频| 欧美在线free| 久久精品国产一区二区三| 精品久久人人做人人爽| 国产黄色精品网站| 日韩理论在线观看| 欧美日韩高清在线播放| 激情亚洲综合在线| 国产精品国产三级国产aⅴ入口 | 丝袜美腿高跟呻吟高潮一区| 日韩一二三区视频| 成人激情av网| 亚洲高清免费在线| 久久久久久久性| 91亚洲国产成人精品一区二三| 午夜天堂影视香蕉久久| 精品粉嫩超白一线天av| 99久久免费视频.com| 日本视频一区二区三区| 国产精品无人区| 日韩一区二区三区在线观看| 国产高清在线观看免费不卡| 亚洲精品久久久久久国产精华液 | 久久激情五月激情| 中文字幕在线观看不卡视频| 日韩午夜小视频| 一本色道久久综合狠狠躁的推荐| 日韩av网站免费在线| 亚洲国产精品成人综合| 欧美日韩综合色| 久久99国产乱子伦精品免费| 国产精品久久久久久妇女6080| 欧美日韩精品一区二区三区蜜桃| 精品一二三四区| 亚洲欧美一区二区三区极速播放| 欧美精品久久天天躁| 久久精品国产精品亚洲精品| 一区二区三区蜜桃网| 欧美电影免费提供在线观看| av福利精品导航| 蜜臀99久久精品久久久久久软件| 精品视频一区三区九区| 91蜜桃免费观看视频| 日韩成人免费电影| 亚洲欧洲99久久| 精品国偷自产国产一区| 成人免费高清视频在线观看| 国内精品国产成人国产三级粉色| 亚洲激情六月丁香| 欧美精品一区二区蜜臀亚洲| 欧美在线观看一区| 日本韩国欧美在线| 国产精品亚洲午夜一区二区三区| 一区二区视频在线| 久久精品夜色噜噜亚洲aⅴ| 7777女厕盗摄久久久| 99久久99精品久久久久久 | 欧美日本在线播放| av电影在线观看完整版一区二区| 精品制服美女丁香| 亚洲精品中文在线观看| 亚洲三级电影网站| 亚洲国产精品成人综合| 精品国产乱码久久久久久久| 欧美日韩精品一区二区三区蜜桃| 在线观看视频一区二区欧美日韩| 成人激情小说网站| 久久国产精品72免费观看| 日韩专区一卡二卡| 国产精品传媒入口麻豆| 亚洲女爱视频在线| 日本一区二区不卡视频| 久久久一区二区| 久久久三级国产网站| 国产精品福利在线播放| 国产亚洲精品bt天堂精选| 日韩区在线观看| 日韩精品一区二区三区蜜臀 | 5月丁香婷婷综合| 欧美日韩国产首页| 在线不卡免费av| 欧美日韩一级大片网址| 日韩欧美国产小视频| 日韩午夜激情av| 日韩久久免费av| 久久精品一区二区三区不卡 | 久久久噜噜噜久噜久久综合| 日韩欧美一区在线观看| 精品国产一区二区三区不卡 | 一区二区三区久久久| 五月天婷婷综合| 美女视频黄免费的久久 | 色婷婷久久久综合中文字幕| 色婷婷综合中文久久一本| 一本色道久久综合亚洲91| 在线亚洲高清视频| 欧美日韩国产123区| 精品国精品国产| 日韩欧美视频在线| 国产欧美精品一区二区色综合朱莉| 日韩欧美国产不卡| 国产精品高潮久久久久无| 一区二区成人在线观看|