MTK Timer

1. GPTI_StartItem

要精准很多,但是只能提供总数不超过32个GPTI,所以使用时需要注意成对申请和释放GPTI,否则可能会出现ASSERT.GPTI用的是GPT timer。这个是用HISR的方式去响应.

    2. StartTime
      StartTime底层是TDMA timer,上层经过Nucleus和KAL封装了一下,最后是用响应消息的方式去响应.

      3. gui_start_timer / gui_cancle_timer
      它最终也是会调用StartTimer的。只不过它不用申请Timer ID,循环使用了固定的Timer ID。
    •  

    4. StartNonAlignTimer
      精确度会比StartTimer要好.UI_disable_alignment_timers()函数用来关闭align timer。关闭之后StartTime函数开出的
      timer都是NonAlign的timer。

    使用范例:
    ------------------------------------------------------------------------
        if (IsBacklightOn())
        {
            StartNonAlignTimer(timer_id + TIMER_ID_IIS_BEGIN, delay, funcPtr);
        }
        else
        {
            StartTimer(timer_id + TIMER_ID_IIS_BEGIN, delay, funcPtr);
        }
    ------------------------------------------------------------------------------------------------
    MTK平台学习--MTK定时器消息机制分析 
    ? MTK定时器消息机制分析 
    ? 1. 数据结构
    (1). stack_timer_struct 
    定时器类型的信息结构( 其主要作用似乎是用以装载待发送的定时器消息数据 )
    (2). TIMERTABLE
    定时器队列节点结构( 其由主要元素mmi_frm_timer_type结构及链表指针两个元 素组成 )
    (3). event_scheduler
    队列信息结构
    (4). mmi_frm_timer_type
    定时器信息结构 
    ? 2. L4定时器初始化
    (1). 步骤
    ...-> 创建MMI Task -> 设置MMI Task初始化函数 -> 在该函数中调用 L4InitTimer
    kal_bool mmi_create(comptask_handler_struct **handle)
    {
    static comptask_handler_struct mmi_handler_info =
    {
    MMI_task, /* task entry function */
    MMI_Init, /* task initialization function */
    NULL,
    NULL, /* task reset handler */
    NULL, /* task termination handler */
    };
    *handle = &mmi_handler_info;
    return KAL_TRUE;
    }

    (2). 作用
    初始化定时器队列并设置基本定时器1,2 
    ? 3. 发送定时器消息
    (1). 步骤
    StartTimer -> L4StartTimer
    (2). 两种类型的定时器
    MTK中有两种类型的定时器
    a. NO_ALIGNMENT 
    非队列式的,即要求立即执行的定时器,时间到了就自动被reset.
    b. ALIGNMENT
    队列式的, 即可以通过队列操作,有一定的延时容忍的定时器 . y
    其基本执行流程: 执行定时器 --> 超时? --> 保存timer id,event id -- timer stop || no event ?----> END ;

    c. 除了触摸屏和手写,其他情况下的定时器一般都是队列式的. 

    (3). L4StartTimer的作用
    判断将要发送的定时器ID,根据是否是队列类型传递给不同的队列结构(event_sheduler1/event_sheduler2) ;
    (4). TimerExpiry
    这是作为参数传递给L4StartTimer的回调函数,由于MTK做了一定的封装,因此其内部具体回调触发过程无法得知,但根据猜测,应该是在定时时间一到,以中断的方式发出消息(MSG_ID_TIMER_EXPIRY),并将其写到MMI的循环队列.该函数可能是在L4CallBackTimer中调用的,L4CallBackTimer的作用如下:
    a. 重置当前定时器信息结构(mmi_frm_timer_type) ;
    b. 执行定时器到点后的执行函数(TimerExpiry) ;
    c. 讲Timer消息写到MMI循环队列中 . 
    ? 4. 与StartTimer对应的StopTimer
    (1). 具体实现通过调用L4StopTimer操作.
    (2). 作用: 找出指定要停止的定时器ID在队列中的位置,然后使用evshed_cancel_event将指定定时器节点从队列中删除.

    5. 定时器消息的处理
    (1). 步骤
    ...-> 创建MMI Task -> 设置MMI Task入口函数 -> 调用 EvshedMMITimerHandler
    (2). evshed_timer_handler( ) -> 处理具体的定时器事件

    StartNonAlignTimer()//启动非队列式timer
    ? StartTimer() //启动队列式timer
    ? -------------------
    ★★ GPTI TIMER
    ? GPTI_GetHandle:取得GPTI timer句柄
    ? GPTI_StartItem:启动gpti timer
    ? GPTI_StopItem: 停止该timer

转自:http://blog.163.com/ling_yf/blog/static/565195712011017333447/

你可能感兴趣的:(timer)