LINUX使用一个定时器实现设置任意数量定时器

本例子参考 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告诉机器每次从寄存器取值,防止数据被系统优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值