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掉,不會再進行處理。

發佈了55 篇原創文章 · 獲贊 4 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章