MTK timer 有很多种,从最低层的KAL(kernel adpat layer)到MMI,都有timer的身影。
先来看一下KAL的timer
KAL timer 是非常底层的timer, 它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级,
也就是说,当这个timer 超时时,就会触发一个HISR(高级中断 High Level ISR (Interrupt Service Routine)),这个中断会回调注册的回调函数。
所以这种timer 使用时,要比较小心,它的优先级很高,在回调函数运行时,其他事件是得不到处理的。
kal_timerid kal_create_timer(kal_char* timer_name_ptr); //创建一个timer, 参数是timer的名字
void kal_set_timer(kal_timerid timer_id, kal_timer_func_ptr handler_func_ptr, void* handler_param_ptr, /
kal_uint32 delay, kal_uint32 reschedule_time); //设置timer 超时时间, timer_id 是 create 返回值,handler_func_ptr是回调函数,handler_param_ptr 是回调函数返回的参数(一般回调函数都是这么设置,这样很灵活),delay,是超时时间,注意这个参数的单位是ticks
不是ms。reschedule_time 表示是否循环使用timer,0 表示 timer 超时一次就停止,1 表示自动循环启动timer。
第二种timer 是 stack timer,这种timer 与 KAL timer 最大的区别是:stack timer 超时后,发送一个超时消息到 相应task的消息队列,
由task的消息队列来处理这个消息,而不像KAL timer,直接在中断状态回调注册函数。从时间的精确性来说,stack timer 可能没有
KAL timer 精确(发送消息,task 切换等都要花费时间),但是 stack 更加的安全(在 task 里处理这个消息),提高并发性(stack timer 到期后
只是发送了一个消息,具体并不处理)。当然 stack timer 底层具体实现还是依靠KAL timer。有一点需要注意的是,当stack timer 超时后,
向消息队列发送了消息,但是这个消息还没有来的处理,这个时候取消了这个timer,需要特别处理,虽然这种情况发生的概率很小。
void stack_init_timer(stack_timer_struct *stack_timer, kal_char *timer_name, module_type module_id);// stack timer 初始化 module_id 是要接受消息的 mdoule,也就是当stack timer 超时,会像改model 发送消息。
kal_bool stack_is_time_out_valid(stack_timer_struct *stack_timer); //判断这个消息是否继续有效,也就是是否需要处理,这个函数就是用于方式上面提到那种情况的发生。
void stack_process_time_out(stack_timer_struct *stack_timer); //这个函数与上面的函数成对使用,具体看例子。
void stack_start_timer(stack_timer_struct *stack_timer, kal_uint16 timer_indx, kal_uint32 init_time); //启动定时期,timer_index timer 索引, 超时时间。
原文转载自:http://blog.csdn.net/yanwuxufeng/article/details/5745187