orangepizero2(全志H616)
系列文章目录
一、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;
}