|
MTK 定时器的使用
在使用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
???? (2). 作用
????????? 初始化定时器队列并设置基本定时器1,2
3.?? 发送定时器消息
???? (1). 步骤
????????? StartTimer -> L4StartTimer
???? (2). 两种类型的定时器
????????? MTK中有两种类型的定时器
????????? a. NO_ALIGNMENT
????????????? 非队列式的,即要求立即执行的定时器,时间到了就自动被reset.
????????? b. ALIGNMENT
????????????? 队列式的, 即可以通过队列操作,有一定的延时容忍的定时器 .?????????????????????????????? ????
????????? 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( ) -> 处理具体的定时器事件
|
|