系列文章目录
一、orangepi实现定时器 二、orangepi控制舵机
前言
通过实现定时器itimerval结构体以及setitimer产生信号,通过signal函数处理信号
1.引入头文件
#include <sys/time.h> #include <signal.h>
2.函数和结构介绍
代码如下(示例):
struct itimerval {
struct timeval it_interval; //设定时间 struct timeval it_value;//设定程序运行到这个地方需要多长时间 }; struct timeval {
long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue); setitimer()将value假设计时器的当前值为指向结构体ovalue不是NULL,返回计时器的原始值。ovalue一般设置为NULL which:间歇计时器有三种选择 ITIMER_REAL //值为0,计时器值实时递减,发送的信号为SIGALRM。这个值用此值 ITIMER_VIRTUAL //值为1,计时器的值在过程中递减,发送的信号为SIGVTALRM。 ITIMER_PROF //值为2,计时器值在过程和系统运行过程中递减。发送的信号是SIGPROF。 返回说明: 成功运行时,返回0。失败返回-1。errno以下值设置 EFAULT:value或ovalue是无效指针 EINVAL:其值不是ITIMER_REAL。ITIMER_VIRTUAL 或 ITIMER_PROF之中的一个
signal(SIGALRM,signal_handler);//SIGALRM信号,signal_hander信号处理函数
3.整体代码
实现定时,每1秒打印一次hello
#include <stdio.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h> static int i; void signal_handler(int signum) {
i++;
if(i==2000){
printf("hello\n");
i=0;
}
}
int main()
{
struct itimerval itv;
itv.it_value.tv_sec=0; //设置启动定时器时间
itv.it_value.tv_usec=500;
itv.it_interval.tv_sec=0;//设置定时时间
itv.it_interval.tv_usec=500;
if(setitimer(ITIMER_REAL,&itv,NULL)==-1){
//设置定时方式
perror("error");
exit(-1);
}
signal(SIGALRM,signal_handler);//信号处理
while(1);
return 0;
}