昨天说到回调函数 L4CallBackTimer。
static void L4CallBackTimer(void *p) { // 在evshed_set_event 第三个参数中传得 timer noder // 这里转换这个指针 mmi_frm_timer_type *pTimer = (mmi_frm_timer_type *)p; // 得到timer id U32 nTimerId = pTimer->timer_info & (~NO_ALIGNMENT_TIMER_MASK); // 得到回调函数 oslTimerFuncPtr pTimerExpiry = pTimer->callback_func; // 得到 回调 函数参数 void * arg = pTimer->arg; // timer 个数减少 g_timer_table_used--; // 清空这个 timer node memset( pTimer, 0, sizeof(mmi_frm_timer_type)); // 回调 timer 的回调函数 // 注意:现在这个回调函数是在 MMI task 环境下执行的 if (pTimerExpiry) { pTimerExpiry((void *)arg); } // 这个的作用是 把 mmi task 外部循环队列的消息 放入到内部消息循环 // 具体在下次 分析 MMI task 时解释 // 这里真么做主要是 让消息及时得到处理 mmi_frm_fetch_msg_from_extQ_to_circularQ(); }
这样 整个 MMI timer 梳理通了,从初始化(MTK timer 小结 2),到 set timer(MTK timer 小结 3) 到最后的触发timer。
还有几个需要注意的地方,在 MTK timer 小结 2 说到, MMI timer 有两种,其中alignment timer 在手机 休眠时 会被挂起。
具体函数如下:
void mmi_frm_suspend_timers(U32 type) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ event_scheduler *ev = NULL; // 判断是哪一种 timer,实际中,只使用 alignment switch(type) { case TIMER_IS_NO_ALIGNMENT: ev = event_scheduler1_ptr; break; case TIMER_IS_ALIGNMENT: ev = event_scheduler2_ptr; break; default: /* undefined type */ MMI_ASSERT(0); break; } // 挂起所有 alignment timer evshed_suspend_all_events(ev); }
具体调用改函数的地方在 BacklightTimerHdlr 里面,这个函数具体实现以后分析
主要作用就是控制屏不背光灯,当屏幕背光灯关闭时,关闭 alignment timer.
有挂起,就由恢复,函数 mmi_frm_resume_timers 调用地方在 TurnOnBacklight 等几个函数里,具体就不在分析。