系列文章目录

一、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;
}

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐