Articles of 定时器

Linux是否为应用程序提供单调递增的时钟?

Linux / Unix / Posix是否为用户空间应用程序提供了一个API来访问一个单调递增的时钟,精度达到了厘秒到毫秒? 在Linux上,/ proc / uptime提供了一个基于string的表示forms,表示系统启动秒数的浮点数。 gettimeofday(2)不提供单调递增的时钟。 我可以在ITIMER_REAL时域中使用getitimer(2),设置定时器从(平台相关)最大值开始并忽略生成的信号,但根据手册页最长的定时器可以运行大约100天,比我预期的运行时间短。

等待所有线程定时器callback完成的安全方法

在一次性定时器的情况下,我可以使用信号量等待定时器callback完成。 但是,如果定时器被多次发射,这并没有帮助。 考虑下面的代码: #include <stdlib.h> #include <stdint.h> #include <stdio.h> #include <signal.h> #include <time.h> #include <unistd.h> #include <pthread.h> #define N 10 void timer_threaded_function(sigval_t si) { uint8_t *shared_resource = si.sival_ptr; sleep(rand() % 7); /* … manipulate with shared_resource */ return; } int main() { struct sigevent sig_ev = {0}; uint8_t *shared_resource = malloc(123); timer_t timer_id; int i; […]

如何让我的系统支持纳秒精度

当我从这个页面运行代码high_precision_timer时 ,我知道我的系统只支持微秒精度。 根据该文件, cout << chrono :: high_resolution_clock :: period :: den << endl; 请注意,并不能保证每秒有多less滴答,只有最高可用。 因此,我们要做的第一件事是通过打印一秒钟多less次来获得精度。 我的系统每秒提供1000000个滴答,这是一个微妙的精度。 我也得到完全相同的价值每秒1000000蜱。 这意味着我的系统也支持微秒精度。 每次我运行任何程序,我总是得到价值xyz微秒和xyz000 nanosec。 我认为上述不支持我的系统nanosec可能是原因。 有没有办法让我的系统nanosec支持?

如何使C计时器在Linux中的特定系统时间到期

我正在尝试创build一个取决于系统时钟的定时器。 这意味着当系统时间改变时,它也会影响这个定时器的到期时间。 所以我想,创build一个基于CLOCK_REALTIME计时器应该做的伎俩。 但是,当这个定时器在60秒之后到期,并且当我使系统时钟提前32秒(使用date命令)时,定时器恰好在60秒之后过期。 它并没有在32秒前到期。 所以我计算了CLOCK_REALTIME和CLOCK_MONOTONIC时钟在2个定时器到期之间的时间。 它显示了CLOCK_REALTIME的92秒和CLOCK_MONOTONIC的60秒,这让我很惊讶,基于CLOCK_REALTIME的计时器没有查找系统时钟的变化。 任何人都可以解释这种行为? #include <stdio.h> #include <signal.h> #include <time.h> #include <string.h> #include <sys/time.h> timer_t timerID; struct timespec rt1, rt2, mt1, mt2; void TimerCalback() { clock_gettime(CLOCK_REALTIME, &rt1); clock_gettime(CLOCK_MONOTONIC, &mt1); printf("%lu sec elapsed for CLOCK_REALTIME\n", rt1.tv_sec – rt2.tv_sec); printf("%lu sec elapsed for CLOCK_MONOTONIC\n", mt1.tv_sec – mt2.tv_sec); rt2 = rt1; mt2 = mt1; […]

每次都需要调用timer_delete来删除定时器吗?

我在下面的代码中使用了timer_create() 。 它会在10秒后触发处理程序一次。 struct itimerspec itimer = { { 0, 0 }, { 10, 0 } }; struct sigevent si; memset (&si, 0, sizeof (struct sigevent)); si.sigev_notify = SIGEV_THREAD; si.sigev_notify_attributes = NULL; si.sigev_notify_function = t; if (timer_create (CLOCK_REALTIME, &si, &timer) < 0) { fprintf (stderr, "[%d]: %s\n", __LINE__, strerror (errno)); exit (errno); } if (timer_settime […]

在C中每x秒执行一次方法

有没有一个工作计时器的例子,每隔X秒钟使用C执行一些函数 我会很感激一个工作代码的例子。

HR定时器精确度研究案例

有了这个话题,我会更好地讨论人力资源计时器和真正的精确度问题。 我研究了大量关于它们的文档,我确信它们是在Linux内核模块中延迟执行问题的最好和最可靠的解决scheme,CPU成本较低,时序精度更高(例如一些时间关键驱动程序使用它们,就像这个https://dev.openwrt.org/browser/trunk/target/linux/generic/files/drivers/pwm/gpio-pwm.c?rev=35328 )。 你也适合吗? 这是我见过的最全面和最详细的文档之一: https : //www.landley.net/kdocs/ols/2006/ols2006v1-pages-333-346.pdf 。 人力资源计时器承诺在jiffies的决议下,但不幸的是,在我的系统,我没有得到低于6毫秒的延迟的预期结果(我会稍后显示更多的细节)。 我的环境是: Windows 10 PRO 64位/ 8Gb RAM / CPU Intel 4 Core VMWare播放器12 虚拟化操作系统Linux Mint 18.1 64位 内核configuration 版本:4.10.0-24 – 通用 CONFIG_HIGH_RES_TIMERS = Y CONFIG_POSIX_TIMERS = Y CONFIG_NO_HZ_COMMON = Y CONFIG_NO_HZ_IDLE = Y CONFIG_NO_HZ = Y CONFIG_HZ_250 = Y CONFIG_HZ = 250 / sys / […]

使用TSC作为时钟源是否提高定时器和调度粒度?

在支持时间戳计数器(TSC)的处理器中,Linux使用TSC提供高分辨率定时器选项。 从我所了解的TSC是一个寄存器,可以读取,但不提供选项来中断CPU在configuration的速度。 因此,对于Linux中的定时器中断生成,仍然需要依赖I / O APIC(在x86上),HZ值通常设置为1000或250。 尽pipeTSC以微秒粒度给出时间戳,但是取决于HZ值,定时器/调度粒度仍将在4ms或1ms。 这种理解是否正确? 或者有没有一种方法可以改善使用TSC的定时器粒度?

定时器类在Linux中

我需要一个计时器来执行分辨率相对较低的callback。 在Linux中实现这样的C ++定时器类的最好方法是什么? 有没有我可以使用的图书馆?

Linux,timerfd的准确性

我有一个系统需要至less10毫秒的定时器的准确性。 我去了timerfd,因为它非常适合我,但是发现即使在15毫秒的时间内也是不准确的,要么我不明白它是如何工作的。 我测量的时间在10毫秒计时器上高达21毫秒。 我已经做了一个快速testing,显示我的问题。 这里testing一下: #include <sys/timerfd.h> #include <time.h> #include <string.h> #include <stdint.h> int main(int argc, char *argv[]){ int timerfd = timerfd_create(CLOCK_MONOTONIC,0); int milliseconds = atoi(argv[1]); struct itimerspec timspec; bzero(&timspec, sizeof(timspec)); timspec.it_interval.tv_sec = 0; timspec.it_interval.tv_nsec = milliseconds * 1000000; timspec.it_value.tv_sec = 0; timspec.it_value.tv_nsec = 1; int res = timerfd_settime(timerfd, 0, &timspec, 0); if(res < 0){ […]