您的位置:首页 > 产品设计 > UI/UE

MTK平台源码学习笔记之-------(queue.c)的学习

2012-01-12 16:23 489 查看
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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: