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;
}
}
#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;
}
}
相关文章推荐
- MTK平台源码学习笔记之-------宏定义的学习
- nginx 源码学习笔记(九)——基本容器——queue
- nginx 源码学习笔记(九)——基本容器——queue
- MTK源码学习笔记之-------taskInit学习
- nginx 源码学习笔记(九)——基本容器——queue
- 学习笔记之ConcurrentLinkedQueue源码分析整理
- 浅谈MTK平台下Android开发比较学习笔记
- Android程序开发学习笔记系列——基础篇(附源码)
- cocos2d-x学习笔记(18)--游戏打包(windows平台)
- CAFFE源码学习笔记之五-internal_thread
- 物联网学习笔记——构建RESTFul平台2
- nginx 源码学习笔记(二十)—— event 模块(一) ——初始化
- Python源码学习笔记(1 基本数据类型)
- STL学习笔记— —特殊容器queue
- Irrlicht 源码学习笔记 【position2d.h】 【vector2d.h】
- STL学习笔记— —特殊容器priority_queue
- spring源码学习笔记-初始化(四)-PostProcessor
- nginx 源码学习笔记(十四)—— 全局变量ngx_cycle
- jquery源码学习笔记一:总体结构
- 第67讲:Scala并发编程匿名Actor、消息传递、偏函数实战解析及其在Spark源码中的应用解析学习笔记