天天看點

MTK平台源碼學習筆記之-------(queue.c)的學習

1、MTK環形消息隊列的大小的定義:

#if defined(__MMI_DUAL_SIM_MASTER__)

#define CIRCQ_NO_OF_NODES 130

#else

#define CIRCQ_NO_OF_NODES 65 

#endif

可見,MTK平台在

單卡時,環形消息隊列的大小為65,

雙卡時,環形消息隊列的大小為130。

2、消息的隊列的結構的定義:

typedef struct ilm_struct {

   module_type       src_mod_id;

   module_type       dest_mod_id;

   sap_type          sap_id;

   msg_type          msg_id;

   local_para_struct *local_para_ptr;

   peer_buff_struct  *peer_buff_ptr;

} ilm_struct;

#define MYQUEUE         ilm_struct

MYQUEUE circq_array[CIRCQ_NO_OF_NODES];

circq_array極為消息隊列的數組。

3、環形消息隊列的幾個标志位:

U8 circq_read = 0, circq_write = 0, circq_messages = 0, max_circq_messages = 0;

circq_read 隊列的讀标志位

circq_write隊列的寫标志位

circq_messages   隊列中的元素個數

max_circq_messages  隊列中的元素個數的最大值

4、 讀和寫消息隊列

U8 OslReadCircularQ(void *msgPtr)

{

    MMI_TRACE(MMI_FW_TRC_G6_FRM_DETAIL, TRC_MMI_FRM_QUEUE_READ_CQ, circq_messages);

    if (circq_messages == 0)

    {

        return 0;

    }

    memcpy(msgPtr, circq_array + circq_read, sizeof(MYQUEUE));

    if (++circq_read == CIRCQ_NO_OF_NODES)

    {

        circq_read = 0;

    }

    --circq_messages;

    return 1;

}

U8 OslWriteCircularQ(void *msgPtr)

{

    MMI_TRACE(MMI_FW_TRC_G6_FRM_DETAIL, TRC_MMI_FRM_QUEUE_WRITE_CQ, circq_messages, ((MYQUEUE *)msgPtr)->msg_id);

    if (circq_messages == CIRCQ_NO_OF_NODES)

    {

        MMI_ASSERT(0);

        return 0;

    }

    memcpy(circq_array + circq_write, msgPtr, sizeof(MYQUEUE));

    if (++circq_write == CIRCQ_NO_OF_NODES)

    {

        circq_write = 0;

    }

    ++circq_messages;

    if (max_circq_messages < circq_messages)

    {

        max_circq_messages = circq_messages;

    }

    return 1;

}

不錯的環形隊列的讀和寫的算法的實作,該好好看看。

5、尋找隊列中上一個  剛寫入的消息元素

U8 OslLookUpLastCircularQMsg(void *msgPtr)

{

    if (circq_messages > 0)

    {

        if (circq_write == 0)

        {

            last_read_index = CIRCQ_NO_OF_NODES;  // 如果要寫的标志位為0,那麼是數組最後一個;

        }

        else

        {

            last_read_index = circq_write - 1;

        }

        memcpy(msgPtr, circq_array + last_read_index, sizeof(MYQUEUE));

        return 1;

    }

    else

    {

        memset(msgPtr, 0, sizeof(MYQUEUE));

        return 0;

    }

}

繼續閱讀