




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MTK优美代码赏析4:MTK_MMI协议栈分类:MTK学习资料2012-04-0811:1416人阅读评论(0)\o"收藏"收藏\o"举报"举报MTK优美代码赏析4:MTK_MMI协议栈
MTK软件行业有一个岗位,叫做MMI工程师,专门为mmi设置一个岗位就可知道MMI模块在mtk中的核心处理地位,当然他的地位也就决定了他的事务繁忙,mmi需要接收和处理所有其他task的消息,并在界面上进行相应的表现,这个数据量是相当大的。比如media层,L4层等。
mmitask对其他task之间的交互数据实在太多,任务繁重,如果让你设计你将如何设计此功能呢?我是想不出来的。不过我还是觉得应该所有的操作系统应该都会处理上述的需求,只不过对外表现的复杂度不同而已,我们不应该被物质外在的复杂而迷惑。
MTK_MMI协议栈的设计很好的处理了多TASK给MMI_task的消息调度,同时实现各task与mmi_task之间的功能抽象,也就是说其他task做了相应的处理就把处理的结果发送给mmi即可,大可不必去管mmi_task是怎么处理这些消息的。一般我们较多的处理的是L4层和mmi层之间传递的消息。
对于一个task来说,需要做的是:1.定义一个消息,2.发送消息,3.接收消息并处理消息所承载的动作。(这一部分可以参考我的博文《创建MTK_task的demo》/zhangsufeng/archive/2010/08/16/1801042.html)
mmi_task的协议栈处理的是第三条需求,其需要的处理接口(用例):1.设置消息所承载的动作2.执行消息所承载的动作3.取消消息所承载的动作4.清除所有消息所承载的动作。
这一部分MTK的设计可以见mmi_frm_events_gprot.h定义
2
extern
void
mmi_frm_execute_current_protocol_handler(U16
eventID,
void
*MsgStruct,
int
mod_src,
void
*Message);
/*
execute
current
protocol
func
handler
*/
3
extern
void
mmi_frm_set_protocol_event_handler(U16
eventID,
PsIntFuncPtr
funcPtr,
MMI_BOOL
isMultiHandler);
4
extern
void
mmi_frm_clear_protocol_event_handler(U16
eventID,
PsIntFuncPtr
funcPtr);
5
extern
void
mmi_frm_clear_all_protocol_event_handler(void);
6
#ifdef
__MMI_DUAL_SIM__
7
extern
void
mmi_frm_set_slave_protocol_event_handler(U16
eventID,
PsIntFuncPtr
funcPtr,
MMI_BOOL
isMultiHandler);
8
extern
void
mmi_frm_clear_slave_protocol_event_handler(U16
eventID,
PsIntFuncPtr
funcPtr);
9
extern
void
mmi_frm_clear_all_slave_protocol_event_handler(void);
10
#endif
/*
__MMI_DUAL_SIM__
*/
复制代码
针对协议栈的处理,MTK的优美代码是给出了一个清晰简洁的实现方式。其操作方式可能如下:1.其所有消息的ID定义在stack_msgs.h中的enmumsg_type中(另一个MMI_stack_msgs.h为cplus环境下的消息,Venus_Ui下可能会用到)2.MTK开辟了一个很大得数组来定义其核心的接口数据,实现高聚低耦
1
/*****************************************************************************
2
*
Global
Variable
3
*****************************************************************************/
4
PseventInfo
protocolEventHandler[MAX_PROTOCOL_EVENT];
5
#ifdef
__MMI_DUAL_SIM__
6
PseventInfo
SlaveProtocolEventHandler[MAX_SLAVE_PROTOCOL_EVENT];
7
#endif
/*
__MMI_DUAL_SIM__
*/
8
9
/*
static
event
table
info,
e.g.
table
pointer,
num.
of
table
items
*/
10
const
mmi_frm_event_static_info_struct
g_event_table_static_info[EVENT_TABLE_END]
=
{
11
{protocolEventHandler,
sizeof(protocolEventHandler)/sizeof(PseventInfo)},
12
#ifdef
__MMI_DUAL_SIM__
13
{SlaveProtocolEventHandler,
sizeof(SlaveProtocolEventHandler)/sizeof(PseventInfo)},
14
#endif
15
};
16
17
/*
runtime
event
table
info,
e.g.
used
and
max.
size
*/
18
mmi_frm_event_runtime_info_struct
g_event_table_runtime_info[EVENT_TABLE_END];复制代码
g_event_table_static_info来存储所有的消息,g_event_table_runtime_info来存储运行时承载动作的消息数目信息(主要用来减少匹配消息时的计算事件),两者相互配合来完成整个消息处理的需求(这个设计里MTK考虑到__MMI_DUAL_SIM__双卡模式下的处理)。有一点需要注意就是MAX_PROTOCOL_EVENT和MAX_SLAVE_PROTOCOL_EVENT是在程序里固定的数据,在自己创建消息时要小心这个数组越界。对应的结构体设计如下:/*****************************************************************************
*
Typedef
*****************************************************************************/
typedef
void
(*PsFuncPtr)
(void
*);
/*
Async
PRT
event
information
struct
*/
typedef
struct
_PseventInfo
{
PsFuncPtr
entryFuncPtr;
U16
eventID;
/*
for
timer
&
hardware
events
*/
U8
flagMulti;
/*
is
multi-handler
or
not
*/
}
PseventInfo;
typedef
struct
_PIntseventInfo
{
U16
eventID;
/*
for
timer
&
hardware
events
*/
PsIntFuncPtr
entryIntFuncPtr;
PsIntFuncPtr
postIntFuncPtr;
}
PsInteventInfo;
/*
enum
event
table
*/
typedef
enum
{
EVENT_TABLE_MASTER,
/*
main
table
*/
#ifdef
__MMI_DUAL_SIM__
EVENT_TABLE_SLAVE,
/*
table
for
dual
sim
*/
#endif
EVENT_TABLE_END
}
mmi_frm_event_table_enum;
/*
static
info
of
event
table
(may
declared
as
const)
*/
typedef
struct
{
PseventInfo
*table;
/*
pointer
to
event
table
*/
U16
num_of_events;
/*
number
of
events
(table
size)
*/
}
mmi_frm_event_static_info_struct;
/*
runtime
info
of
event
table
*/
typedef
struct
{
U16
max_events;
/*
max.
count
of
events
used*/
U16
used_events;
/*
count
of
currently
used
events
*/
}
mmi_frm_event_runtime_info_struct;复制代码
空间申请好了,下一步就是对这块空间的利用来实现相应的需求。3.抽象出来的共有接口:消息匹配函数原型:S16
mmi_frm_search_event(
mmi_frm_event_table_enum
tableType,
U16
eventID,
PsFuncPtr*
pFuncPtr,
S16
startIdx,
MMI_BOOL
doSwap,
S16
*pNextIdx,
S16
*pFirstEmptyIdx,
MMI_BOOL
*pIsMultiInTable);复制代码
给定消息去协议栈中进行匹配,事件pFuncPtr非空时也要匹配消息所载事件为pFuncPtr,返回消息所处的位置index4.设置消息所承载的动作其实现函数原型是:void
mmi_frm_set_protocol_event_handler_int(mmi_frm_event_table_enum
tableType,
U16
eventID,
PsFuncPtr
funcPtr,
MMI_BOOL
isMultiHandler);
isMultiHandler表示一个消息在主卡或副卡上承载多个处理动作,其他参数比较容易理解。5.执行消息所承载的动作
这一部分实现是在voidMMI_task(oslEntryType*entry_param)中
ProtocolEventHandler(
(U16)
Message.oslMsgId,
(void*)Message.oslDataPtr,
(int)Message.oslSrcId,
(void*)&Message);复制代码
其直接调用的也即是函数:void
mmi_frm_execute_current_protocol_handler(U16
eventID,
void
*MsgStruct,
int
mod_src,
void
*Message);
(如果你想得到mmi处理的对自己有用的消息,你可以在模拟器这个函数里面设置断点)6.取消消息所承载的动作
void
mmi_frm_clear_protocol_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件专业初级考试全面备考试题及答案
- 应对疫情的健康管理考试试题及答案
- 超星尔雅学习通《绿色康复(吉林大学)》2025章节测试附答案
- 2025年妇幼保健员健康服务质量试题及答案
- 纸质与数字媒体全媒体运营师试题及答案
- 儿童行为及心理发展知识试题及答案
- 2024年人力资源管理师挑战试题及答案
- 二零二五年度抵押车辆欠款催收与法律援助服务协议
- 二零二五年度外资企业员工租房补贴协议模板
- 二零二五年度物流线路承包与物流行业人才培养合同
- 2025年机电实务考试题型及答案
- CRH5动车组转向架
- 2025江苏宿迁宿豫区总工会公开招聘5人高频重点模拟试卷提升(共500题附带答案详解)
- 西北四省(陕西山西青海宁夏)2025届高三下学期第一次联考英语试卷含答案
- 医院门禁施工方案
- 2025年安徽商贸职业技术学院单招职业适应性测试题库a4版
- 2025年安庆医药高等专科学校单招职业适应性考试题库往年题考
- 《快乐读书吧:探索科学的奥秘》教学设计与指导课件(第一课时)
- 冷库员工安全培训课件
- 食材配送服务投标方案(技术方案)
- 一科一品一产科护理
评论
0/150
提交评论