MTK中MMI_Task的消息机制

声明:本资料来自公司同事整理

在此先简单介绍一下,Task是一个具有一定封装性的软件模块,是操作系统层面的概念,可以把它理解为一个独立的进程。

       具体的调用流程:

       StartTimerèStartMyTimerèStartMyTimerInt(经过封装后)èL4StartTimerè最后还是回归到操作系统的内部时钟(需要进一步研究)。

 

A5上的Phonebook备份功能为例

 

入口函数mmi_entry_phb_backup();  ----------------------备份函数

 

在一系列的draw屏事件之后,我们发现了它的处理函数PBToFile()

 

PBToFile()

{

       /*

***

*/

 

       if (for_curr_backup_phone_total >= MAX_PB_PHONE_ENTRIES && for_curr_backup_phone_total < MAX_PB_PHONE_ENTRIES + g_phb_cntx.sim_used)

                {

                    phb_save_sim1_to_vcard_file_req();

                }

 

       /*

       ***

       */

}

 

phb_save_sim1_to_vcard_file_req();展开,它的功能是将SIM1phonebook记录写到Tcard上去。

 

void phb_save_sim1_to_vcard_file_req(void)

{

    MSG_PHB_SET_ENRTY_REQ_STRUCT *myMsgPtr = NULL;

    MYQUEUE Message;

 

    Message.oslSrcId = MOD_MMI;   //标识这条消息来源层

    Message.oslDestId = MOD_L4C;      //标识这条消息被发往的目标层

Message.oslMsgId = PRT_PHB_SET_ENTRY_REQ;     

//在消息机制中还需定义一个对应的消息ID

    Message.oslDataPtr = (oslParaType*) myMsgPtr;  //此消息所要传递数据信息

    Message.oslPeerBuffPtr = NULL;     //以及要返回的消息

 

    SetProtocolEventHandler(phb_save_sim1_to_vcard_file_rsp, PRT_PHB_SET_ENTRY_RSP);

    OslMsgSendExtQueue(&Message);

}

 

这样做处理的优点在于,不用因为大量的数据处理所带来的空间及时间上的消耗而使MMI层其他的处理事件受影响,而是将这项“工作”转交给L4C层,让它来进行处理,在这些消息的发送与接收过程消耗的时间基本上是毫秒级别的,所以不用担心有何滞后影响。

 

交给L4C层后,它在SetProtocolEventHandlerPsFuncPtr , U16 eventID)函数中会将对应的处理函数注册到L4C层的函数栈中,进而进行处理。

 

而且此功能也匹配了相应的错误处理机制,举例来讲,如果在备份过程中发生电话,短信等事件会如何呢?

 

来看这一段

 

mmi_entry_phb_backup()

{

       /*

       ***

       */

 

if (0 == backup_state)

    {

        SetLeftSoftkeyFunction(mmi_phb_backup, KEY_EVENT_UP);

        SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);

}

else if (1 == backup_state)

    {

        ClearKeyHandler(KEY_LSK, KEY_EVENT_UP);

        SetRightSoftkeyFunction(mmi_phb_backup_pause, KEY_EVENT_UP);

    }

else if (2 == backup_state)

    {

        SetLeftSoftkeyFunction(mmi_phb_backup, KEY_EVENT_UP);

        SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);

}

else if (3 == backup_state)

    {

        ClearKeyHandler(KEY_LSK, KEY_EVENT_UP);

        SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);

}

/*

       ***

       */

 

}

 

其中有一个flag标识变量backup_state,比如在backup_state = 2时,就是所谓的暂停过程,进行相应的处理。

 

还有在phb_save_sim1_to_vcard_file_rsp()的函数头也有进行相应的逻辑控制

phb_save_sim1_to_vcard_file_rsp()

{

if (2 == backup_state || 0 == backup_state)

        return;

/*

       ***

       */

 

}

 

如果在暂停等非正常状态下,函数会return掉,不会再进行处理。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值