uC/OS-II源碼解析(os_q.c)

/*
** ver   : 2.52
** file  : os_q.c
** brief : 消息隊列相關操作 C 文件
*/


#ifndef  OS_MASTER_FILE
#include "includes.h"            /* 包含頭文件 */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
/*
**********************************************************************************************
*                                      無等待的請求消息隊列
*
* breif    : 該函數用於無等待的請求消息隊列中的消息.
*
* pevent   : 指向事件控制塊的指針
*
* Returns  : != (void *)0  隊列中有可用消息
*            == (void *)0  未獲得消息
**********************************************************************************************
*/

#if OS_Q_ACCEPT_EN > 0
void  *OSQAccept (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3                        
    OS_CPU_SR  cpu_sr;
#endif
    void      *msg;
    OS_Q      *pq;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {               /* 無效的事件控制塊指針 */
        return ((void *)0);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* 錯誤的事件類型       */
        return ((void *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    pq = (OS_Q *)pevent->OSEventPtr;             /* 獲得隊列控制塊       */
    if (pq->OSQEntries > 0) {                    /* 判斷隊列中是否有消息 */
        msg = *pq->OSQOut++;                     /* 將消息取出來返回     */
        pq->OSQEntries--;                        /* 消息數減1            */
        if (pq->OSQOut == pq->OSQEnd) {          /* 調整已實現循環隊列   */
            pq->OSQOut = pq->OSQStart;
        }
    } else {
        msg = (void *)0;                         /* 隊列爲空             */
    }
    OS_EXIT_CRITICAL();
    return (msg);                                    
}
#endif
/*$PAGE*/
/*
*****************************************************************************************
*                                        創建消息隊列
*
* brief   : 該函數用於創建消息隊列.
*
* start   : 消息隊列的基地址.該數組必須被聲明爲void類型
*
*             void *MessageStorage[size]
*
* size    : 消息數組的大小
*
* Returns : != (OS_EVENT *)0  消息隊列創建成功
*           == (OS_EVENT *)0  消息隊列創建失敗
*****************************************************************************************
*/

OS_EVENT  *OSQCreate (void **start, INT16U size)
{
#if OS_CRITICAL_METHOD == 3                     
    OS_CPU_SR  cpu_sr;
#endif
    OS_EVENT  *pevent;
    OS_Q      *pq;


    if (OSIntNesting > 0) {                      /* 不允許中斷內創建消息隊列 */
        return ((OS_EVENT *)0);                               
    }
    OS_ENTER_CRITICAL();
    pevent = OSEventFreeList;                    /* 獲取事件控制塊           */
    if (OSEventFreeList != (OS_EVENT *)0) {      /* 調整剩餘事件控制塊鏈表   */
        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
    }
    OS_EXIT_CRITICAL();
    if (pevent != (OS_EVENT *)0) {                   
        OS_ENTER_CRITICAL();
        pq = OSQFreeList;                        /* 獲取隊列控制塊      */
        if (pq != (OS_Q *)0) {                   /* 存在剩餘隊列控制塊  */
            OSQFreeList         = OSQFreeList->OSQPtr;/* 調整隊列控制塊鏈表 */
            OS_EXIT_CRITICAL();
            pq->OSQStart        = start;              /* 初始化隊列     */
            pq->OSQEnd          = &start[size];
            pq->OSQIn           = start;
            pq->OSQOut          = start;
            pq->OSQSize         = size;
            pq->OSQEntries      = 0;
            pevent->OSEventType = OS_EVENT_TYPE_Q;
            pevent->OSEventCnt  = 0;
            pevent->OSEventPtr  = pq;
            OS_EventWaitListInit(pevent);             /* 初始化等待任務表 */
        } else {                                      /* 無可用隊列控制塊 */
            pevent->OSEventPtr = (void *)OSEventFreeList; /* 返還事件控制塊  */
            OSEventFreeList    = pevent;
            OS_EXIT_CRITICAL();
            pevent = (OS_EVENT *)0;
        }
    }
    return (pevent);
}
/*$PAGE*/
/*
****************************************************************************************
*                                        刪除消息隊列
*
* brief    : 該函數用於刪除消息隊列.
*
* pevent   : 指向事件控制塊的指針
*
* opt      : 刪除選項
*              opt == OS_DEL_NO_PEND   無任務等待時刪除
*              opt == OS_DEL_ALWAYS    無條件刪除,就緒所有等待任務
*
* err      : 指向錯誤代碼的指針,可能取值:
*              OS_NO_ERR               成功
*              OS_ERR_DEL_ISR          不允許在中斷中刪除隊列
*              OS_ERR_INVALID_OPT      無效的刪除選項
*              OS_ERR_TASK_WAITING     有任務正在等待隊列中的消息
*              OS_ERR_EVENT_TYPE       錯誤的時間類型
*              OS_ERR_PEVENT_NULL      I無效的事件控制塊指針
*
* Returns    : pevent        刪除失敗
*              (OS_EVENT *)0 刪除成功
*
*****************************************************************************************
*/

#if OS_Q_DEL_EN > 0
OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                             
    OS_CPU_SR  cpu_sr;
#endif
    BOOLEAN    tasks_waiting;
    OS_Q      *pq;


    if (OSIntNesting > 0) {                        /* 不允許中斷內刪除      */
        *err = OS_ERR_DEL_ISR;                    
        return ((OS_EVENT *)0);
    }
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                 /* 無效的事件控制塊指針  */
        *err = OS_ERR_PEVENT_NULL;
        return (pevent);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {  /* 錯誤的事件類型        */
        *err = OS_ERR_EVENT_TYPE;
        return (pevent);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00) {                      /* 是否有任務等待消息 */
        tasks_waiting = TRUE;                              /* 有任務等待         */
    } else {
        tasks_waiting = FALSE;                             /* 無任務等待         */
    }
    switch (opt) {
        case OS_DEL_NO_PEND:                               /* 無任務等待刪除    */
             if (tasks_waiting == FALSE) {
                 pq                  = (OS_Q *)pevent->OSEventPtr;  /* 返還隊列控制塊 */
                 pq->OSQPtr          = OSQFreeList;
                 OSQFreeList         = pq;
                 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
                 pevent->OSEventPtr  = OSEventFreeList;    /* 返還事件控制塊  */
                 OSEventFreeList     = pevent;             
                 OS_EXIT_CRITICAL();
                 *err = OS_NO_ERR;
                 return ((OS_EVENT *)0);                       
             } else {
                 OS_EXIT_CRITICAL();
                 *err = OS_ERR_TASK_WAITING;
                 return (pevent);
             }

        case OS_DEL_ALWAYS:                                /* 無條件刪除       */
             while (pevent->OSEventGrp != 0x00) {          /* 就緒所有等待任務 */
                 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
             }
             pq                  = (OS_Q *)pevent->OSEventPtr;/* 返還隊列控制塊 */
             pq->OSQPtr          = OSQFreeList;
             OSQFreeList         = pq;
             pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
             pevent->OSEventPtr  = OSEventFreeList;        /* 返還事件控制塊 */
             OSEventFreeList     = pevent;                       
             OS_EXIT_CRITICAL();
             if (tasks_waiting == TRUE) {                 
                 OS_Sched();                               /* 任務調度 */
             }
             *err = OS_NO_ERR;
             return ((OS_EVENT *)0);                       

        default:
             OS_EXIT_CRITICAL();
             *err = OS_ERR_INVALID_OPT;
             return (pevent);
    }
}
#endif

/*$PAGE*/
/*
*******************************************************************************************
*                                           清空消息隊列
*
* brief       : 該函數用於清空隊列內的消息
*
* pevent      : 指向事件控制塊的指針
*
* Returns     : OS_NO_ERR           成功
*               OS_ERR_EVENT_TYPE   錯誤的事件類型
*               OS_ERR_PEVENT_NULL  無效的事件控制塊指針
********************************************************************************************
*/

#if OS_Q_FLUSH_EN > 0
INT8U  OSQFlush (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3                       
    OS_CPU_SR  cpu_sr;
#endif
    OS_Q      *pq;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                    /* 無效的事件控制塊指針          */
        return (OS_ERR_PEVENT_NULL);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* 錯誤的事件類型                */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    pq             = (OS_Q *)pevent->OSEventPtr;      /* 獲取隊列控制塊               */
    pq->OSQIn      = pq->OSQStart;                    /* 清空隊列                     */
    pq->OSQOut     = pq->OSQStart;
    pq->OSQEntries = 0;
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif

/*$PAGE*/
/*
**********************************************************************************************
*                                     請求消息
*
* brief     : 該函數用於從消息隊列中請求一則消息
*
* pevent    : 指向事件控制塊的指針
*
* timeout   : 超時時限
*
*  err      : 指向錯誤代碼的指針,可能取值:
*
*               OS_NO_ERR           成功
*               OS_TIMEOUT          超時
*               OS_ERR_EVENT_TYPE   錯誤的事件類型
*               OS_ERR_PEVENT_NULL  無效的事件控制塊指針
*               OS_ERR_PEND_ISR     不能再中斷中請求
*
* Returns    : != (void *)0  請求成功
*              == (void *)0  請求失敗
***********************************************************************************************
*/

void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                       
    OS_CPU_SR  cpu_sr;
#endif
    void      *msg;
    OS_Q      *pq;


    if (OSIntNesting > 0) {                      /* 不允許中斷中請求消息 */
        *err = OS_ERR_PEND_ISR;                               
        return ((void *)0);
    }
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {               /* 無效的事件控制塊     */
        *err = OS_ERR_PEVENT_NULL;
        return ((void *)0);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* 錯誤的事件類型       */
        *err = OS_ERR_EVENT_TYPE;
        return ((void *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    pq = (OS_Q *)pevent->OSEventPtr;             /* 獲取隊列控制塊       */
    if (pq->OSQEntries > 0) {                    /* 隊列中是否有消息     */
        msg = *pq->OSQOut++;                     /* 取出消息             */
        pq->OSQEntries--;                        /* 消息數減1            */
        if (pq->OSQOut == pq->OSQEnd) {          /* 調整指針實現循環隊列 */
            pq->OSQOut = pq->OSQStart;
        }
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
        return (msg);                                          
    }
    OSTCBCur->OSTCBStat |= OS_STAT_Q;            /* 等待消息狀態  */
    OSTCBCur->OSTCBDly   = timeout;              /* 記錄超時時限  */
    OS_EventTaskWait(pevent);                    /* 使任務進入等待狀態 */
    OS_EXIT_CRITICAL();
    OS_Sched();                                  /* 任務調度      */
    OS_ENTER_CRITICAL();
    msg = OSTCBCur->OSTCBMsg;
    if (msg != (void *)0) {                      /* 是否收到了消息 */
        OSTCBCur->OSTCBMsg      = (void *)0;     /* 請空消息       */
        OSTCBCur->OSTCBStat     = OS_STAT_RDY;   /* 就緒態         */
        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* 取消關聯       */
        OS_EXIT_CRITICAL();
        *err                    = OS_NO_ERR;
        return (msg);                                                 
    }
    OS_EventTO(pevent);                          /* 超時使任務就緒 */
    OS_EXIT_CRITICAL();
    *err = OS_TIMEOUT;                           /* Indicate a timeout       */
    return ((void *)0);                                                  
}
/*$PAGE*/
/*
**********************************************************************************************
*                                        向隊列發送一則消息
*
* breif    : 該函數用於向隊列發送一則消息,由.OSQIn插入,先進先出
*
* pevent   : 指向事件控制塊的指針
*
* msg      : 指向消息的指針
*
* Returns  : OS_NO_ERR             成功
*            OS_Q_FULL             隊列已滿
*            OS_ERR_EVENT_TYPE     錯誤的事件類型
*            OS_ERR_PEVENT_NULL    無效的事件控制塊指針
*            OS_ERR_POST_NULL_PTR  發送的消息不能爲空
***********************************************************************************************
*/

#if OS_Q_POST_EN > 0
INT8U  OSQPost (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3                    
    OS_CPU_SR  cpu_sr;
#endif
    OS_Q      *pq;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                    /* 無效的事件控制塊指針 */
        return (OS_ERR_PEVENT_NULL);
    }
    if (msg == (void *)0) {                           /* 發送的消息不能爲空   */
        return (OS_ERR_POST_NULL_PTR);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* 錯誤的事件類型       */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00) {                 /* 是否有任務等待       */
        OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* 就緒最高優先級任務   */
        OS_EXIT_CRITICAL();
        OS_Sched();                                   /* 任務調度             */
        return (OS_NO_ERR);
    }
    pq = (OS_Q *)pevent->OSEventPtr;                  /* 獲取隊列控制塊       */
    if (pq->OSQEntries >= pq->OSQSize) {              /* 隊列已滿             */
        OS_EXIT_CRITICAL();
        return (OS_Q_FULL);
    }
    *pq->OSQIn++ = msg;                               /* 插入消息             */
    pq->OSQEntries++;                                 /* 消息數加1            */
    if (pq->OSQIn == pq->OSQEnd) {                    /* 調整指針實現循環隊列 */
        pq->OSQIn = pq->OSQStart;
    }
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*******************************************************************************************
*                                   向隊列發送一則消息
*
* breif   : 該函數用於向隊列發送一則消息,由.OSQOut插入,先進後出
*
* pevent  : 指向事件控制塊的指針
*
* msg     : 指向消息的指針
*
* Returns : OS_NO_ERR             成功
*           OS_Q_FULL             隊列已滿
*           OS_ERR_EVENT_TYPE     錯誤的時間類型
*           OS_ERR_PEVENT_NULL    無效的事件控制塊指針
*           OS_ERR_POST_NULL_PTR  發送的消息不能爲空
*******************************************************************************************
*/

#if OS_Q_POST_FRONT_EN > 0
INT8U  OSQPostFront (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3                         
    OS_CPU_SR  cpu_sr;
#endif
    OS_Q      *pq;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                    /* 無效的事件控制塊指針 */
        return (OS_ERR_PEVENT_NULL);
    }
    if (msg == (void *)0) {                           /* 發送的消息不能爲空  */
        return (OS_ERR_POST_NULL_PTR);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* 錯誤的事件類型       */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00) {                 /* 是否有任務在等待消息 */
        OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* 就緒最高級等待任務   */
        OS_EXIT_CRITICAL();
        OS_Sched();                                   /* 任務調度             */
        return (OS_NO_ERR);
    }
    pq = (OS_Q *)pevent->OSEventPtr;                  /* 獲取隊列控制塊       */
    if (pq->OSQEntries >= pq->OSQSize) {              /* 隊列已滿             */
        OS_EXIT_CRITICAL();
        return (OS_Q_FULL);
    }
    if (pq->OSQOut == pq->OSQStart) {                 /* 調整指針    */
        pq->OSQOut = pq->OSQEnd;
    }
    pq->OSQOut--;
    *pq->OSQOut = msg;                                /* 插入消息    */
    pq->OSQEntries++;                                 /* 消息數加1   */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*******************************************************************************************
*                                        向隊列發送一則消息
*
* breif     : 該函數用於向隊列發送一則消息
*
* pevent    : 指向事件控制塊的指針
*
* msg       : 指向消息的指針
*
* opt       : 發送選項,可能取值:
*               OS_POST_OPT_NONE         先進先出
*               OS_POST_OPT_BROADCAST    廣播
*               OS_POST_OPT_FRONT        先進後出
*
* Returns   : OS_NO_ERR             成功
*             OS_Q_FULL             隊列已滿
*             OS_ERR_EVENT_TYPE     錯誤的事件類型
*             OS_ERR_PEVENT_NULL    無效的事件控制塊指針
*             OS_ERR_POST_NULL_PTR  發送的消息不能爲空
*******************************************************************************************
*/

#if OS_Q_POST_OPT_EN > 0
INT8U  OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
{
#if OS_CRITICAL_METHOD == 3                     
    OS_CPU_SR  cpu_sr;
#endif
    OS_Q      *pq;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                    /* 無效的事件控制塊指針 */
        return (OS_ERR_PEVENT_NULL);
    }
    if (msg == (void *)0) {                           /* 發送的消息不能爲空   */
        return (OS_ERR_POST_NULL_PTR);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* 錯誤的事件類型        */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00) {                 /* 是否有任務等待消息 */
        if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* 是否廣播消息       */
            while (pevent->OSEventGrp != 0x00) {      /* 就緒所有等待任務   */
                OS_EventTaskRdy(pevent, msg, OS_STAT_Q);
            }
        } else {
            OS_EventTaskRdy(pevent, msg, OS_STAT_Q);  /* 就緒最高優先級任務  */
        }
        OS_EXIT_CRITICAL();
        OS_Sched();                                   /* 任務調度     */
        return (OS_NO_ERR);
    }
    pq = (OS_Q *)pevent->OSEventPtr;                  /* 或許隊列控制塊       */
    if (pq->OSQEntries >= pq->OSQSize) {              /* 隊列已滿             */
        OS_EXIT_CRITICAL();
        return (OS_Q_FULL);
    }
    if ((opt & OS_POST_OPT_FRONT) != 0x00) {          /* 先進後出         */
        if (pq->OSQOut == pq->OSQStart) {            
            pq->OSQOut = pq->OSQEnd;                       
        }
        pq->OSQOut--;
        *pq->OSQOut = msg;                            /* 先進先出          */
    } else {                                                            
        *pq->OSQIn++ = msg;                           
        if (pq->OSQIn == pq->OSQEnd) {                
            pq->OSQIn = pq->OSQStart;
        }
    }
    pq->OSQEntries++;                                 /* 消息數加1         */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
***********************************************************************************************
*                                        查詢隊列
*
* brief     : 該函數用與查詢消息隊列信息.
*
* pevent    : 指向事件控制塊的指針
*
* pdata     : 指向消息隊列信息的數據結構指針
*
* Returns   : OS_NO_ERR           成功
*             OS_ERR_EVENT_TYPE   錯誤的事件類型
*             OS_ERR_PEVENT_NULL  無效的事件控制塊指針
************************************************************************************************
*/

#if OS_Q_QUERY_EN > 0
INT8U  OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
{
#if OS_CRITICAL_METHOD == 3                               
    OS_CPU_SR  cpu_sr;
#endif
    OS_Q      *pq;
    INT8U     *psrc;
    INT8U     *pdest;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {                         /* 無效的事件控制塊指針 */
        return (OS_ERR_PEVENT_NULL);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* 錯誤的時間類型        */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    pdata->OSEventGrp = pevent->OSEventGrp;                /* 複製等待任務鏈表       */
    psrc              = &pevent->OSEventTbl[0];
    pdest             = &pdata->OSEventTbl[0];
#if OS_EVENT_TBL_SIZE > 0
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 1
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 2
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 3
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 4
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 5
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 6
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 7
    *pdest            = *psrc;
#endif
    pq = (OS_Q *)pevent->OSEventPtr;                       /* 獲取隊列控制塊 */
    if (pq->OSQEntries > 0) {
        pdata->OSMsg = *pq->OSQOut;                        /* 取出消息       */
    } else {
        pdata->OSMsg = (void *)0;
    }
    pdata->OSNMsgs = pq->OSQEntries;                       /* 消息數   */
    pdata->OSQSize = pq->OSQSize;                          /* 隊列大小 */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif                                                                    

/*$PAGE*/
/*
***************************************************************************************
*                                      初始化消息隊列
*
* brief : 被函數 OSInit() 調用去初始化消息隊列,你的應用中不應該調用該函數. 
*
****************************************************************************************
*/

void  OS_QInit (void)
{
#if OS_MAX_QS == 1
    OSQFreeList         = &OSQTbl[0];            /* 只有一個 */
    OSQFreeList->OSQPtr = (OS_Q *)0;
#endif

#if OS_MAX_QS >= 2                               /* 超過一個 */
    INT16U  i;
    OS_Q   *pq1;
    OS_Q   *pq2;


    pq1 = &OSQTbl[0];
    pq2 = &OSQTbl[1];
    for (i = 0; i < (OS_MAX_QS - 1); i++) {    /* 初始化隊列控制塊爲單向量表 */
        pq1->OSQPtr = pq2;
        pq1++;
        pq2++;
    }
    pq1->OSQPtr = (OS_Q *)0;                    /* 對後一個隊列控制塊    */
    OSQFreeList = &OSQTbl[0];                   /* 空隊列控制塊鏈表表頭  */
#endif
}
#endif                                                                         
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章