首页 > 其他分享 >不受系统时钟影响的精确睡眠

不受系统时钟影响的精确睡眠

时间:2023-10-18 14:22:09浏览次数:31  
标签:睡眠 CLOCK clock system delay 精确 time select 时钟

需求

多线程编程需要控制某个线程的执行频率
采用系统内建的std::this_thread::sleep_for()函数会受到系统时钟跳变的影响
希望使用一个单调递增的时钟作为参考进行休眠。

实现

截取一段man clock_gettime的原文:

       CLOCK_REALTIME
              System-wide  clock  that  measures real (i.e., wall-clock) time.  Setting this clock requires appropriate privileges.  This clock
 is affected by discontinuous jumps in the system time (e.g., if the system administrator manually changes
              the clock), and by the incremental adjustments performed by adjtime(3) and NTP.

       CLOCK_REALTIME_COARSE (since Linux 2.6.32; Linux-specific)
              A faster but less precise version of CLOCK_REALTIME.  Use when you need very fast, but not fine-grained timestamps.  Requires per
-architecture support, and probably also architecture support for this flag in the vdso(7).

       CLOCK_MONOTONIC
              Clock that cannot be set and represents monotonic time since some unspecified starting point.  This clock is not affected by discontinuous jumps in the system time (e.g., if the system administrator manually changes the clock), but  is
              affected by the incremental adjustments performed by adjtime(3) and NTP.

再看看内核代码hrtimer.c指出select在内核中使用的CLOCK_MONOTONIC是单调递增的(见参考文献2),即它的休眠不受时间同步影响。

int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta,
				     const enum hrtimer_mode mode)
{
	return schedule_hrtimeout_range_clock(expires, delta, mode,
					      CLOCK_MONOTONIC);
}

根据以上结论,我们可以利用<sys/time.h>提供的select方法完成精确睡眠,实现参考GoogleGroups代码。

#include <sys/time.h>

void sleep(long int ms)
{
    struct timeval delay;
    delay.tv_sec = static_cast<long int>(ms / 1000);
    delay.tv_usec = static_cast<long int>((ms - delay.tv_sec * 1000) * 1000);
    (void) select(0, NULL, NULL, NULL, &delay);
}

参考

clock_gettime(3): clock/time functions - Linux man page
linux/kernel/time/hrtimer.c at master · torvalds/linux
using select as a sleep call

标签:睡眠,CLOCK,clock,system,delay,精确,time,select,时钟
From: https://www.cnblogs.com/azureology/p/17772246.html

相关文章

  • 睡眠问题
    关于早醒早醒后隔一两个小时才能重新睡着是一种常见的睡眠问题,称为“早醒症"。这可能是由于多种原因引起的,并且对于每个人来说可能有不同的解决方法。以下是一些建议,希望能帮助您改善睡眠质量:建立规律的睡眠时间:尽量保持规律的睡眠时间,每天大致相同的时间上床睡觉和醒来,以帮助调......
  • 10-多比特信号的跨时钟域处理
    1.两级触发器的问题2.多比特跨时钟域的处理方法FIFO是处理跨时钟问题的最常用问题3.格雷码编码处理跨时钟域4.异步FIFO5.多比特跨时钟域的握手处理......
  • 09-单比特信号的跨时钟域处理
    1.慢时钟域信号同步到快时钟域的处理方法快时钟信号采用慢时钟域信号--两级触发器同步器慢时钟域信号电平比较长,快时钟域的多个周期内都可以采样到慢时钟域信号--只对信号的上升沿/下降沿/双沿检测握手处理--Bus传输中使用,单bit信号使用较少2.信号上升沿检测--边......
  • 06-跨时钟域
    什么是跨时钟域的概念呢?在一个电路中launch的时钟和capture时钟,如果不是同一个时钟呢?就是跨时钟域的电路若两个时钟是同步时钟呢,那这个就叫同步时钟域若两个时钟是异步呢时钟呢,那就是异步时钟域,也就是异步跨时钟域电路。看这张图。这是clocka的domain,这是clockb的doamin。......
  • Win11系统如何设置电脑睡眠唤醒时需要输入密码?
       ......
  • 嵌入式专题研究2:系统时钟和定时器和看门狗
    时钟系统:构成:1.振荡器——脉搏RC振荡器晶体振荡器四种:HSE,HSI,LSE,LSI2.唤醒定时器3.PLL倍频器4.各种分频器 可以通过stm32cubemx进行时钟配置,但是在SystemClock_Config()函数前,在启动文件中有默认的时钟配置。while(1){HAL_GPIO_WritePin......
  • canvas实现睡眠波
    成果产品借鉴(抄袭)了华为运动健康App上对用户睡眠数据的展示,要我们也实现这种效果。App开发的同事虽然做出了一点样子,但是有点小丑,担子落到了web的头上(虽然笔者实现的效果也没有华为的好,但是还看的过去)分析与实现图形图形有点折线图和柱状图结合的意思,但是两者都不是,作为w......
  • 在 Windows 启动时自动同步计算机时钟的 6 种方法
    在PC的主板上有一个小电池,能让PC在​​关机​​时仍能维持时钟的运行。但电池是有寿命的,几年之后电量耗尽,你就会看到诸如“SystemCMOSchecksumbad–Defaultconfigurationused”这样的错误提示,此时日期和时间会被重置到BIOS的默认值(比如2010年),你可以通过按键盘(屏幕会有提示,......
  • 数字化校园建设,NTP数字电子时钟(网络时钟系统)方案
    数字化校园建设,NTP数字电子时钟(网络时钟系统)方案数字化校园建设,NTP数字电子时钟(网络时钟系统)方案京准电子科技官微——ahjzsz本系统提供一套支持最新的网络时间协议NTPv4的软件以及其配置方案,为网络中的设备提供NTP服务。系统由三部分组成,分别为嵌入式一级网络时间服务器,二级......
  • 51单片机-时钟
    #include"reg52.h"#include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;typedefunsignedcharu8;typedefunsignedintu16;typedefunsignedlongu32;//sbitled=P2^0;sbitLSA=P2^2;sbitLSB=P2^3;sbit......