Timer Linux定时器间隔

Timer Linux定时器间隔,timer,arduino,intel-edison,Timer,Arduino,Intel Edison,我想运行一个间隔为5毫秒的计时器。我创建了一个Linux计时器,当调用sigalrm_处理程序时,我正在检查前一次调用的运行时间。我得到的时间是:4163442242664443447045034288微秒,我希望间隔是5000微秒,误差最小。我不知道为什么这个间隔不是恒定的,但它是变化的,并且比它应该的要低得多 这是我的密码: 静态整数时间计数; 静态整数计数器; 结构itimerval计时器={0}; 无效符号 { 已收到Serial.printSIGALRM,时间:; Serial.p

我想运行一个间隔为5毫秒的计时器。我创建了一个Linux计时器,当调用sigalrm_处理程序时,我正在检查前一次调用的运行时间。我得到的时间是:4163442242664443447045034288微秒,我希望间隔是5000微秒,误差最小。我不知道为什么这个间隔不是恒定的,但它是变化的,并且比它应该的要低得多

这是我的密码:

静态整数时间计数; 静态整数计数器; 结构itimerval计时器={0}; 无效符号 { 已收到Serial.printSIGALRM,时间:; Serial.printlnmicros-time\u计数; 时间计数=微秒; } 无效设置{ Serial.begin9600; timer.it_value.tv_sec=1; timer.it\u interval.tv\u usec=5000; 信号信号处理器和信号处理器; SETITIMERITIMERTIMER_REAL,&timer,NULL; 时间计数=微秒; } 我想运行一个间隔为5毫秒的计时器

您可能无法可靠地获得该周期,因为它小于合理的PC硬件所能处理的时间

根据经验,50赫兹或100赫兹可能是你能得到的最高可靠频率。这不是软件的问题,而是硬件的问题

想象一下典型的处理器缓存数兆字节。您可能需要几毫秒来填充它。或者考虑处理页面错误的时间;这可能需要超过一毫秒的时间

而英特尔爱迪生并不是一个速度最快的处理器。如果将一个数字转换成一个字符串并在屏幕上显示该字符串可能需要大约一毫秒的时间,我不会感到惊讶,但我让您检查一下。这可以解释你的数字

关于软件,请参阅或考虑内核中的一些方法;我不建议这样做

还要多次查看/proc/interrupts,在shell中运行几次cat/proc/interrupts命令。您可能会看到内核中断的频率低于每一毫秒或几毫秒一次

顺便说一句,您的信号处理程序调用非异步信号安全函数。读&

看来你的整个方法都错了


也许你需要一些,至少如果你需要一些硬的,然后,你可能会考虑升级你的硬件到更快和更昂贵的东西。< / P>我不明白这个问题,如果你已经让你的计时器工作有什么问题?顺便说一句,你能提供一个最小的工作大块的代码吗?间隔不是恒定的。它变化很大,远低于5000微秒。请编辑您的问题,解释为什么5毫秒周期对您如此重要。