Linux使用一个定时器实现设置任意数量定时器功能使用一个定时器实现设置任意数量定时器功能
本例子是为了实现使用Linux下的一个定时器,实现任一数量的定时器功能。对linux使用一个定时器设置任意数
量定时器的实现代码感兴趣的朋友一起学习吧
为什么需要这个功能,因为大多数计算机软件时钟系统通常只能有一个时钟触发一次中断。当运行多个任务时,我们会想要多
个定时器 的时钟跟踪并发这样可以生成正确的时间重叠,操作系统这样做。
本例子是为了实现使用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告诉机器每次从寄存器取值,防止数据被系统优化。
volatile TIME time_now
接下来定义一系列数据来记录 timer_next 指接下来要我们想要计时的定时器。time_timer_set保存最后一次获取的系统时间。
struct timer *timer_next = NULL;/* timer we expect to run down next */
TIME time_timer_set; /* time when physical timer was set */
//取消一个定时器
void timer_undeclare(struct timer *t)
{
disable_interrupts();
if(!t->inuse)
{
enable_interrupts();
return ;
}
t->inuse=0;
if(t==timer_next)
{
if(time(&time_now)<0)
perror("time error");
timers_update(time_now-time_timer_set);
if(timer_next)
{
start_physical_timer(&timer_next->time);
time_timer_set=time_now;
}
}
enable_interrupts();