本例子参考 Don Libes的Title: Implementing Software Timers例子改写
为什么需要这个功能,因为大多数计算机软件时钟系统通常只能有一个时钟触发一次中断。当运行多个任务时,我们会想要多个定时器 的时钟跟踪并发这样可以生成正确的时间重叠,操作系统这样做。
本例子是为了实现使用Linux下的一个定时器,实现任一数量的定时器功能。
首先我们需要一些数据类型用来描述时钟数据结构
#include <stdio.h> #include<time.h> #define TRUE 1 #define FALSE 0 #define MAX_TIMERS ... 最大时钟数量 typedef timerval TIME; 定义时间类型 #define VERY_LONG_TIME ... 最大时间长度 struct timer { int inuse; 时钟是否可用 TIME time; 定时时间长度 char *event; 是否超时 } timers[MAX_TIMERS]; /* set of timers */
每个定时器都以这个数据结构来描述,第一个成员用来描述时钟是否正在使用,第二个成员是这个定时器的定时时间,第三个成员是是一个指针,*event初始化应该为0,当他被置为1,我们知道这个定时器已经超时了,和他相关的任务可以执行。
接下来是定时器数组的初始化,这里将每个时钟inuse成员设置为FALSE,表示时钟不可用。
void timers_init() { struct timer *t; for (t=timers;t<&timers[MAX_TIMERS];t++) t->inuse = FALSE; }
现在开始是结构实现部分
首先写到的timer_undeclare这个函数,这个函数与后面的timer_declare相对立。主要作用是清除一个定时器。
有很多方法可以用来保存定时器的定时记录。没有复杂时钟硬件的机器通常在每一个时钟周期处理一个中断处理程序。然后软件就在处理程序中获取系统时间,然后判断是否设置的定时器超时。
很多比较聪明的机器可以在硬件中设置定时时间,一旦时间超时,就触发一个硬件中断。这同样适用与软件中断。
他们通过一个 定义一个time_now来记录当前的系统时间,volatile告诉机器每次从寄存器取值,防止数据被系统优化。