diff --git a/programing-manual/timer/figures/timer.png b/programing-manual/timer/figures/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..42c718ee0947b886239cdb5a828a56d9451b5660 Binary files /dev/null and b/programing-manual/timer/figures/timer.png differ diff --git a/programing-manual/timer/timer.md b/programing-manual/timer/timer.md new file mode 100644 index 0000000000000000000000000000000000000000..32d220f2ffd338cbba52481cc6ee15503f3425c9 --- /dev/null +++ b/programing-manual/timer/timer.md @@ -0,0 +1,60 @@ +# 定时器 + +## 一、描述 + +定时器是基于系统时钟实现的,精度比较低(1ms~10ms),可以用于线程的休眠,以及对于休眠精度不高的场景。 + +## 二、原理 + +当时钟中断产生的时候,会改变ticks的值,与此同时也会去检测是否有定时器超时,如果有定时器超时,则会去处理定时器超时函数。 + +有一个定时器链表来记录所有等待超时的定时器,值得注意的是,它们是通过线性的方式插入到链表中的。 +最先超时的定时器会插入到链表头,超时时间比较久的定时器会被加入到链表的末尾。 + +除此之外,还有一个最近超时的时间变量,来记录下一个即将超时的定时器,可以用它来检测是否需要去检测定时器链表。 + +当有一个定时器的ticks到达了最近超时定时器的ticks值的时候,就去检测定时器链表,如果有多个同样超时的定时器, +就会将他们全部处理,调用定时器超时处理函数,然后更新最近超时定时器的ticks。 + +## 三、框架图 + +![框架图](figures/timer.png) + +## 四、接口 + +创建定时器需要指定需要超时的时间 `milliseconds` ,超时后调用的处理函数 `handler` ,处理函数参数 `arg`, +以及定时器的标志 `flags`。 +标志有多重,表明不同类型的定时器。 `ONESHOT` 表示只超时一次, `PERIOD` 表示周期性地按照 `milliseconds` 来进行超时。 + +```c +#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` 并传入定时器的地址即可。 + +```c +NX_Error NX_TimerInit(NX_Timer *timer, NX_UArch milliseconds, + NX_Bool (*handler)(struct NX_Timer *, void *arg), void *arg, + int flags); +``` + +在定时器还没开始运行的时候,可以销毁一个定时器,调用 `NX_TimerDestroy`, 只需要传入定时器对象地址即可。 + +```c +NX_Error NX_TimerDestroy(NX_Timer *timer); +``` + +创建定时器后需要调用 `NX_TimerStart` 启动它,才可以在超时后调用回调函数。 +```c +NX_Error NX_TimerStart(NX_Timer *timer); +``` + +当需要停止定时器的时候,调用 `NX_TimerStop` 即可。 +```c +NX_Error NX_TimerStop(NX_Timer *timer); +```