Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103083
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-22 10:44
文章分类

全部博文(23)

文章存档

2018年(3)

2017年(1)

2015年(1)

2014年(18)

我的朋友

分类: 嵌入式

2014-09-18 14:57:37

定时器+信号的方式
timer_create + sigaction 

信号的安装和定时器创建:

信号的注册和配置

  1. typedef void (*timer_func)(int)
  2. int g_timer_id ;//时间的一个参数ID,可用于识别触发的具体ID
  3. void *timer_function(int)//回调函数
  4. {
  5. //定时处理的函数
  6. }
  7. void init_sigaction(timer_func timer_function)//参数是回调函数的指针
  8. {
  9.     struct sigevent evp;
  10.     struct sigaction act;

  11.     memset(&act, 0, sizeof(act));
  12.     act.sa_handler = timer_function;//回调函数
  13.     act.sa_flags = 0;
  14.     sigemptyset(&act.sa_mask);
  15.     if (sigaction(SIGUSR1, &act, NULL) == -1)//将回调函数注册到用户自定义1的信号中
  16.     {
  17.         perror("fail to sigaction");
  18.         exit(-1);
  19.     }
  20.     
  21.     memset(&evp, 0, sizeof(struct sigevent));
  22.     evp.sigev_signo = SIGUSR1;
  23.     evp.sigev_notify = SIGEV_SIGNAL;
  24.     
  25.     evp.sigev_value.sival_ptr = &g_timerid;


  26.     if (timer_create(CLOCK_REALTIME, &evp, &g_timer_id) == -1)//创建一个系统实时时钟的定时器
  27.     {
  28.         perror("fail to timer_create");
  29.         exit(-1);
  30.     }

  31. }
配置定时器的触发时间:


定时器的时间配置,并启动

  1. void init_basetime(int usec_time)//参数是微秒数
  2. {
  3.     struct itimerspec it;
  4.     UINT32 sec;
  5.     UINT32 usec;

  6.     sec = usec_time/1000000;//秒
  7.     usec = (usec_time%1000);//微秒
  8.     
  9.     
  10.     it.it_interval.tv_sec = sec;
  11.     it.it_interval.tv_nsec = usec;
  12.     it.it_value.tv_sec = sec;
  13.     it.it_value.tv_nsec = usec;
  14.     timer_settime(g_timerid, 0, &it, 0);//设定定时器,并启动
  15. }

使用:
这两个函数在主函数中调用就可以,只要main函数不退出,系统都会定时的去触发回调函数去执行内容。




阅读(1607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~