linux学习笔记——linux系统的定时器

在使用单片机时经常会用到定时中断。

但在linux环境下,无法直接访问定时器,但依然可以使用其它命令来完成定时操作。

比较常用的方法是使用signal(),ualarm()或者setTimer()函数。

要了解这三个函数的工作模式,必须了解linux系统中“信号”的概念。

linux中存在几十种信号,它们分别代表了不同的状态,有的代表终结程序,有的代表程序错误警告,程序员可以通过捕获这些信号,来获取系统状态。

其中,用于定时功能的信号叫做:SIGALRM

定时器可以每隔一段时间就触发依次SIGALRM信号,然后使用signal()函数跳转到中断执行程序中。

从使用方法的角度上来看,SIGALRM和中断信号INT没有区别,但原理上稍有不同。

具体区别是:SIGALRM是通过获取系统时间来计算的,而INT是通过硬件定时器完成的,显然INT的精度更高,更准确,更直接。

signal()函数有两个参数,第一个参数为触发信号,如果是定时功能,那就是SIGALRM;第二个参数为中断执行程序的函数名,例如:

signal(SIGALRM, sig_hander);

值得注意的是,如果没有中断执行程序,那么signal()默认在触发信号后终止整个程序。使用该函数需要包含signal.h。

那么如何触发SIGALRM呢,可以使用ualarm()或者setTimer()函数。

ualarm()函数可以按照设定的时间循环触发SIGALRM,它有两个参数,第一个参数是首次触发的时间,第二个参数是循环触发的时间,单位都是微妙。

例如:

ualarm(500000,100000);

函数就会在0.5秒后首次触发SIGALRM,并在之后以0.1秒的间隔不断触发SIGALRM。

注意:ualarm函数的定时时间不能超过一秒钟,如果需要更长定时,可以使用alarm函数,但该函数是单次定时。

使用ualarm()需要包含unistd.h。

而setTimer是ualarm的升级版,它具备更多功能,使用它需要包含sys/time.h

首先,它支持三种计时方法,可在第一个参数中选择,分别是:

1.系统时间计算,触发信号SIGALRM,参数名为ITIMER_REAL;

2.程序在用户态下花费的时间计算,触发信号SIGVTALRM,参数名为ITIMER_VIRTUAL;

3.程序在用户态和内核态下花费的时间计算,触发信号SIGPROF,参数名为ITIMER_PROF;

第二个参数指定间隔时间,第三个参数用来返回上一次定时器的间隔时间,如果不关心该值可设为NULL。

比较复杂的是,这个函数使用了嵌套结构体来传递参数,函数具体结构如下:

 1 int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
 2 
 3   struct itimerval {
 4   struct timeval it_interval;
 5   struct timeval it_value;
 6   };
 7   struct timeval {
 8   long tv_sec;
 9   long tv_usec;
10   };

简单分析一下,外层结构体为itimerval,它的成员分别为it_interval和it_value的结构体。

而it_interval和it_value各自包含两个long型的成员,分别是tv_sec和tv_usec。

其中tv_sec的单位是秒,tv_usec的单位是微妙,二者相加就是定时的时间。

而it_interval是循环定时的时间,it_value是首次定时的时间。

示例:

struct itimerval timer;

//首次定时时长为1.5秒
timer.it_value.tv_sec = 1;
timer.it_value.tv_usec = 5000;

//以0.5秒为间隔循环定时
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 5000;

以上就是linux系统中定时器的使用方法。

但是,linux下每个进程只有一个定时器资源,如果有多个需要定时执行的任务怎么办?

按我的理解,就只能使用多进程编程了,可以使用fork()函数创建新的进程。

不过多线程之间通讯又是一个问题,linux作为非实时操作系统在这方面确实有所欠缺。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值