MTK timer 小结

 MTK   timer  小结

          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)。
         

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值