
舵机的控制信号为PWM信号(PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,周期为20ms)
实现定时器,通过itimerval结构体和setitimer函数产生信号,系统随之使用signal信号处理函数来处理产生的定时信号,从而实现定时器。
setitimer函数为设置定时器(闹钟),可以实现周期定时。(settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后把it_value从零重置为it_interval,继续对it_value倒计时,一直这样循环下去)
函数原型为 int setitimer(int which,const struct itimerval *new_value,struct itimerval *old_value);
参数
which 指定定时方式:
ITIMER_REAL //以系统真实的时间来计算,发送的信号是SIGALRM。
ITIMER_VIRTUAL //以该进程在用户态下花费的时间来计算,它发送出SIGVTALRM信号
ITIMER_PROF /以该进程在用户态下和内核态下所费的时间来计算,发送的信号是SIGPROFnew_value为传入参数:
表示定时的时长old_value为传出参数:
通常用不上,设置为NULL。。
struct itimerval
{
/* Value to put into `it_value' when the timer expires. */
struct timeval it_interval;
/* Time to the next timer expiration. */
struct timeval it_value;
};
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
it_interval:代表定时器重新启动后赋给it_value的值。
it_value:计时器安装后首先启动的初始值。PS:假如it_value为0是不会触发信号的,所以要能触发信号,it_value得大于0;如果it_interval为零,只会延时,不会定时(也就是说只会触发一次信号)。
//该函数实现,程序运行3秒后,每隔一秒打印一个hello
include<stdio.h>
#include
#include
#include
static int i;
void signalHandler(int signum)
{
i++;
if(i==2000){
printf("hello\n");
i=0;
}
}
int main()
{
i=0;
//setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
struct itimerval itv;
//首次把it_value的初值倒计时到零之后,
//之后每次都会把it_value重置为it_interval
itv.it_interval.tv_sec=0;
itv.it_interval.tv_usec=500;//设置为500us
//it_value初值的设置,提供程序第一次运行时的倒计时
itv.it_value.tv_sec=3;//一开始设置为3s
itv.it_value.tv_usec=0;
if(setitimer(ITIMER_REAL, &itv, NULL)==-1){
perror("error");
exit(-1);
}
signal(SIGALRM,signalHandler);
while(1);
return 0;
}