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;
}
}