当前位置:   article > 正文

Linux定时器

Linux定时器

目录

一、分析

二、setitimer()函数的参数

1.函数原型

2.函数参数 

三、示例

1.该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello word。

2.定时器控制sg90舵机


目录

一、分析

二、setitimer()函数的参数

1.函数原型

2.函数参数 

三、示例

1.该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello word。

2.定时器控制sg90舵机


目录

一、分析

二、setitimer()函数的参数

1.函数原型

2.函数参数 

三、示例

1.该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello word。

2.定时器控制sg90舵机


一、分析

实现定时器,通过itimerval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号,从而实现定时器。

  1. struct itimerval
  2. {
  3. /* Value to put into `it_value' when the timer expires. */
  4. struct timeval it_interval;
  5. /* Time to the next timer expiration. */
  6. struct timeval it_value;
  7. };
  8. it_interval:计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
  9. it_value:程序跑到这之后,多久启动定时器
  10. struct timeval
  11. {
  12. __time_t tv_sec; /* Seconds. */
  13. __suseconds_t tv_usec; /* Microseconds. */
  14. };
  15. int setitimer (__itimer_which_t __which,
  16. const struct itimerval *__restrict __new,
  17. struct itimerval *__restrict __old)

二、setitimer()函数的参数

1.函数原型

int setitimer (__itimer_which_t __which, const struct itimerval *__restrict __new, struct itimerval *__restrict __old);

2.函数参数 

which: 三种类型
ITIMER_REAL // 数值为 0 ,计时器的值实时递减,发送的信号是 SIGALRM
ITIMER_VIRTUAL // 数值为 1 ,进程执行时递减计时器的值,发送的信号是 SIGVTALRM
ITIMER_PROF // 数值为 2 ,进程和系统执行时都递减计时器的值,发送的信号是 SIGPROF
很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);
返回说明:

成功执行时,返回0。失败返回-1

三、示例

1.该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello word

  1. #include<stdio.h>
  2. #include<sys/time.h>
  3. #include<stdlib.h>
  4. #include<signal.h>
  5. static int i;
  6. void signal_handler(int signum)
  7. {
  8. i++;
  9. if(i == 2000){
  10. printf("hello word\n");
  11. i = 0;
  12. }
  13. }
  14. int main()
  15. {
  16. struct itimerval itv;
  17. //设定定时时间
  18. itv.it_interval.tv_sec = 0;
  19. itv.it_interval.tv_usec = 500;
  20. //设定开始生效,启动定时器的时间
  21. itv.it_value.tv_sec = 1;
  22. itv.it_value.tv_usec = 0;
  23. //设定定时方式
  24. if( -1 == setitimer(ITIMER_REAL, &itv, NULL)){
  25. perror("error");
  26. exit(-1);
  27. }
  28. //信号处理
  29. signal(SIGALRM,signal_handler);
  30. while(1);
  31. return 0;
  32. 35 }

2.定时器控制sg90舵机

  1. #include <stdio.h>
  2. #include <sys/time.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include <wiringPi.h>
  6. #define SG90Pin 5
  7. int jd;
  8. static int i = 0;
  9. void signal_handler(int signum)
  10. {
  11. if(i <= jd){
  12. digitalWrite(SG90Pin, HIGH);
  13. }else{
  14. digitalWrite(SG90Pin, LOW);
  15. }
  16. if(i == 40){
  17. i = 0;
  18. }
  19. i++;
  20. }
  21. int main()
  22. {
  23. struct itimerval itv;
  24. jd = 0;
  25. wiringPiSetup();
  26. pinMode(SG90Pin, OUTPUT);
  27. //设定定时时间
  28. itv.it_interval.tv_sec = 0;
  29. itv.it_interval.tv_usec = 500;
  30. //设定开始生效,启动定时器的时间
  31. itv.it_value.tv_sec = 1;
  32. itv.it_value.tv_usec = 0;
  33. //设定定时方式
  34. if( -1 == setitimer(ITIMER_REAL, &itv, NULL)){
  35. perror("error");
  36. exit(-1);
  37. }
  38. //信号处理
  39. signal(SIGALRM,signal_handler);
  40. while(1){
  41. printf("input jd: \n");
  42. scanf("%d",&jd);
  43. }
  44. return 0;
  45. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/70010
推荐阅读
相关标签
  

闽ICP备14008679号