MTK tiemr有很多种,从最底层的KAL到MMI,都有timer的身影。
KAL 的 timer
KAL timer是非常底层的timer,它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是HISR,
从而这种timer具有很高的优先级,也就是说当这个timer超时时,就会触发一个HISR(高级中断),这个中断
会回调注册函数。所以这种timer使用时,要比较小心,它的优先级很高,在回调函数运行时,其他事件是
得不到处理的。相关API 函数如下:
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是kal_create_timer函数的返回值,handler_func_ptr是回调函数,handler_param_ptr
是回调函数返回的参数,delay是超时时间,注意这个参数的单位是ticks不是ms。reschedule_time表示是否循环使用timer,0
表示timer超时一次就停止,1表示自动循环启动timer。
STACK TIMER
这种timer与KAL timer最大的区别是:stack timer超时后,发送一个超时消息到相应的task的消息队列,由task的消息队列来处
理这个消息,而不像KAL timer,直接在中断状态回调注册函数。从时间的精确性来说,stack timer可能没有KAL timer精确(发送消息,
task切换等都要花费时间),但是stack更加的安全(在task里处理这个消息),提高并发性(stack timer到期后只是发送了一个消息,具体并
不处理)。相关API函数:
void stack_init_timer(stack_timer_struct *stack_timer, kal_char *timer_name,module_type
module_id);
//函数功能:stack timer初始化
参数解析:stack_timer --- 指向stack_timer_struct类型的指针,装填timer相关的信息
timer_name --- kal_timer的名字
module_type --- 当kal_timer超时后,接收消息的MOD_ID
kal_bool stack_is_time_out_valid(stack_timer_struct *stack_timer);
//函数功能:判断这个消息是否继续有效,也就是是否需要处理(当stack timer超时后,向
消息队列发送了消息,但是这个消息还没来的及处理,这个时候取消了这个timer
,需要特别处理,虽然这种情况发生的概率很小)。
void stack_process_time_out(stack_timer_struct *stack_timer);//这个函数与上面的函数成对使用
void stack_start_timer(stack_timer_struct *stack_timer,kal_uint16 timer_index,kal_uint32 init_time);
函数功能:启动定时器
参数解析:stack_timer ---- 指向装在定时器相关信息的结构体变量
timer_index ----- timer的索引
init_time ----- time的超时时间
以上提到了两种timer, KAL timer 和 stack timer,这两种timer在平时用的比较少,在
驱动开发,或者时间要求特别精确的情况下,使用KAL timer,一般在task要管理一组timer,用
stack timer加上event scheduler。
在MMI开发中,经常使用到的timer是stack timer + event scheduler构成的。其函数
接口为starttimer和stoptimer。下面介绍如何使用。
第一步:首先在TimerEvents.h的MMI_TIMER_IDS中添加一个timer id号,如TEST_ID,
添加了这个ID号之后,我们就能使用定时器函数做一些定时的事件了。
第二步:创建定时器,void StartTimer(U16 timerid, U32 delay, FuncPtr funcPtr)
timerid ---- 就是之前在表中定义的ID号,TEST_ID,
delay ---- 延时的时间,以ms为单位
FuncPtr ---- 超时时间发生时的回调函数
StartTimer(TEST_ID,10*1000,TestTimeout);这样当定时时间到时,就会回调
这个函数。
第三步:如果不想让超时时间发生,那么可以使用StopTimer(U16 timerid)。