MTK-MMI协议栈参考资料_第1页
MTK-MMI协议栈参考资料_第2页
MTK-MMI协议栈参考资料_第3页
MTK-MMI协议栈参考资料_第4页
MTK-MMI协议栈参考资料_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论