定时器

一、描述

定时器是基于系统时钟实现的,精度比较低(1ms~10ms),可以用于线程的休眠,以及对于休眠精度不高的场景。

二、原理

当时钟中断产生的时候,会改变ticks的值,与此同时也会去检测是否有定时器超时,如果有定时器超时,则会去处理定时器超时函数。

有一个定时器链表来记录所有等待超时的定时器,值得注意的是,它们是通过线性的方式插入到链表中的。 最先超时的定时器会插入到链表头,超时时间比较久的定时器会被加入到链表的末尾。

除此之外,还有一个最近超时的时间变量,来记录下一个即将超时的定时器,可以用它来检测是否需要去检测定时器链表。

当有一个定时器的ticks到达了最近超时定时器的ticks值的时候,就去检测定时器链表,如果有多个同样超时的定时器, 就会将他们全部处理,调用定时器超时处理函数,然后更新最近超时定时器的ticks。

三、框架图

框架图

四、接口

创建定时器需要指定需要超时的时间 milliseconds ,超时后调用的处理函数 handler ,处理函数参数 arg, 以及定时器的标志 flags。 标志有多重,表明不同类型的定时器。 ONESHOT 表示只超时一次, PERIOD 表示周期性地按照 milliseconds 来进行超时。

#define NX_TIMER_ONESHOT   0x01    /* timer type is one shot */
#define NX_TIMER_PERIOD    0x02    /* timer type is period */

NX_Timer *NX_TimerCreate(NX_UArch milliseconds, 
                          NX_Bool (*handler)(struct NX_Timer *, void *arg), void *arg, 
                          int flags);

如果是对静态的定时器进行初始化,只需要调用 NX_TimerInit 并传入定时器的地址即可。

NX_Error NX_TimerInit(NX_Timer *timer, NX_UArch milliseconds, 
                          NX_Bool (*handler)(struct NX_Timer *, void *arg), void *arg, 
                          int flags);

在定时器还没开始运行的时候,可以销毁一个定时器,调用 NX_TimerDestroy, 只需要传入定时器对象地址即可。

NX_Error NX_TimerDestroy(NX_Timer *timer);

创建定时器后需要调用 NX_TimerStart 启动它,才可以在超时后调用回调函数。

NX_Error NX_TimerStart(NX_Timer *timer);

当需要停止定时器的时候,调用 NX_TimerStop 即可。

NX_Error NX_TimerStop(NX_Timer *timer);

results matching ""

    No results matching ""