Linux下的高精度时间获得与定时器

Linux内核时钟系统和定时器实现 1. Linux内核时钟系统和定时器实现Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式: 系统启动后,会读取时钟源设备(RTC, HPET,PIT…),初始化当前系统时间; 内核会根据HZ(系统定时器频率,节拍率)参数值,设置时钟事件设备,启动tick(节拍)中断。HZ表示1秒种产生多少个时钟硬件中断,tick就表示连续两个中断的间隔时间。在我电脑上,HZ=250, 一个t 阅读详情

    本文主要介绍Linux下高精度时间函数,及相关的具有超时机制的函数,对定时器也进行简单的介绍。

    在linux下通常可用的精度最高的时间接口是gettimeofday,它返回一个timeval结构,其精度为us,即10-6 秒,大多数情况这个精度已经够用了。不过有时为了更高的精度,比如纳秒级的时间精度,我们需求探索Linux为我们提供的时间调用。

    首先介绍struct timespec结构,这个结构体有两个成员,一个是秒,一个是纳秒。

    在librt库中,提供了高精度的时间函数,分别是:

    long clock_gettime(clockid_t ,struct timespec*)

    获取特定时钟的时间,时间通过fp结构传回,目前定义了6种时钟,分别是

       CLOCK_REALTIME                            系统当前时间,从1970年1.1日算起
       CLOCK_MONOTONIC                        系统的启动时间,不能被设置
       CLOCK_PROCESS_CPUTIME_ID       进程运行时间

       CLOCK_THREAD_CPUTIME_ID          线程运行时间
       CLOCK_REALTIME_HR                      CLOCK_REALTIME的高精度版本
       CLOCK_MONOTONIC_HR                 CLOCK_MONOTONIC的高精度版本

    long clock_getres(clockid_t )

    获取特定时钟的时间精度

    long clock_settime(clockid_t ,struct timespec*)

    设置特定时钟的时间

    long clock_nanosleep(clockid_t ,int flag,timespec* time,timespec* left_time)

    休眠time中指定的时间,如果遇到信号中断而提前返回,则由left_time返回剩余的时间。

   
    有了这些个时间函数之后,我们再来看下如何实现一些不同精度的简单的定时器。

    最粗糙的定时器可以由sleep来实现,其精度为秒级,系统也提供像nanosleep,usleep,ualarm等,当然你愿意也可以由poll(ms)、select(us)、ppoll或pslect(ns)等来实现各种精度的sleep。通过这些高精度的sleep函数,也可以实现一系统不同精度的定时器。

 

     通过上述sleep实现的定时器通常需要我们自行进行编码,而且过多的sleep也会导致某个cpu不能充分的利用,对于大量定时器的场合就需要小心编写代码,这种方式通常以单独线程控制或主循环轮询的方式查看哪些定时器到期。总体来说,实现复杂,效率较低,而且也没有一种好的定时器到期时的通知机制,通常是被动由定时器线程强行执行或者自身线程在线程主循环中检查到期的定时器并执行。

 

     下面我们将探索一下由操作系统提供的一些定时器机制。操作系统提供了两个种类的定时器,一种是显式的定时器,另一种是隐藏在调用的超时时间或特定文件属性之上。后者我们在前面已经见到过,比如select、套接字描述符的超时属性,这些需要在不同的编程领域去积累,当然它们也有各自的精度。下面我们主要介绍一下系统提供的显式的定时器。

 

      Linux系统为每个进程提供了三个间隔定时器,精度为us。定时器到期时将触发相应的信号,定时器可能会重新开始,值得注意的是,fork生成的子进程并不继承父进程的定时器。

      int  getitimer(int type, itimerval* val)

      int  setitimer(int type, itimerval* nval, itimerval* oval)

      itimerval 有两个成员,it_interval和it_value,均为timeval类型,前者保存的是下次定时器的定时间隔,后者为本次超时时的定时间隔。也就是说,定时器将从it_value减少,当变为0时,发送信号,并从it_interval取值,重新开始定时器。如果val被置为0,则停止定时器。

      getitimer()用于设置一个定时器,而setitimer用于修改已经设置的定时器,如果在设置时定时器尚未超时,则剩余时间保存于oval。

      定时器定时器三个定时器分别是

      ITIMER_REAL         以系统时间递减,超时时投递SIGALRM信号

      ITIMER_VIRTUAL    以进程执行时间递减,超时时投递SIGVTALRM

      ITIMER_PROF         当进程执行或进程执行系统调用时均递减,超时时投递SIGPROF信号。

 

      此外Posix1.b中为我们提供了实时高精度的定时工具,精度可以达到纳秒。不过每个进程只能有一个。

      int timer_creat()

      int timer_delete()

      int timer_gettime()

      int timer_settime()

      具体使用方法不在这里详述,可见系统提供的定时器是一种珍惜资源,通常只是一种最基本的设施,应用需要使用这个最基本的设施定义多样化的定时器,以满足程序中使用多种及多个定时器。当然系统提供的定时器需要人工设置信号处理等相关工作,需要专门处理信号的代码,这个在一定程度上增加了程序的复杂性。因此说来,从sleep族的定时器到系统显式的定时器,各有优缺点,使用时根据情况权衡选择。

 

 

 

 

Linux 下获取纳秒级精度时间&使用usleep函数作为定时器&实现在特定时间点执行程序 Linux 高精度时间获取+usleep定时器使用=在特定时间点执行程序(ms级精度) 因为项目需要,我需要在多个终端(基于openwrt的AP)上同时执行某一程序,多个终端开始执行程序的时间误差需要在毫秒(ms)级及以下,在查阅了相关资料之后,我设计了相应方案,下面介绍怎样实现上述功能。 内核时间概念   内核时间包括了几个时间:    系统时间:自系统开始启动所经过的时间;    ... 阅读详情

相关推荐

浅析linux 内核 高精度定时器(hrtimer)实现机制(一)

在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足,最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到Tick级别,按照内核配置选项的不同,在100Hz到1000Hz之间。但是,原有的定时器层由于实现教早,应用广泛,如果完全替换掉会引入大量代码改动。因此,Linux内核又独立设计出了一个叫高精度定时器层(High Resolution Timer)的框架,可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求的应用程序或内核驱动程序。

m0_74282605的博客 4410

Linux中的定时器的使用与三个定时器ITIMER_REAL,ITIMER_VIRTUAL,ITIMER_PROF的区别

Linux中的定时函数 定时函数 默认绑定 SIGALRM信号 alarm (只发一次) unsigned int alarm(unsigned int seconds); 函数会在所指定的seconds之后收到SIGALRM信号 例如: signal(SIGALRM,printf); alarm(2); 函数会在两秒之后触发SIGALRM信号,执行printf函数 ualarm (循环发送) useconds_t ualarm(useconds_t usecs, useconds_t inte

一只青木呀 3814

Linux驱动中断与时间篇——高精度定时器hrtimer

低分辨率定时器是用jiffies来定时的,所以会受到HZ影响,如果HZ为200,代表每秒种产生200次中断,那一个jiffies就需要5毫秒,所以精度为5毫秒。如果精度需要达到纳秒级别,则需要使用高精度定时器hrtimer。

嵌入式Linux充电站 3109

Linux内核hrtimer高精度定时器介绍及使用

linux内核hrtimer高精度定时器使用

Cool_summer_wind的博客 2351

Linux内核高精度定时器(hrtimer)

内核为高精度定时器重新设计了一套软件架构,它可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求的应用程序或内核驱动。该套架构相关文件为kernel\time\hrtimer.c和include\linux\hrtimer.h。 ...

大帅的博客 4958

Linux 高精度定时器(hrtimer):特性与应用

高精度定时器(hrtimer)是 Linux 内核中一种强大的时间管理工具,提供了高精度、灵活性和高效性。通过本文的介绍,你应该对 hrtimer 的特性、工作原理以及如何在实际应用中使用 hrtimer 有了更深入的了解。希望这些知识能帮助你在实时系统和高性能计算场景中更好地利用 hrtimer。

小灰灰的博客 1680

linux没有高精度定时器,Linux下的高精度时间获得与定时器

int getitimer(int type, itimerval* val)int setitimer(int type, itimerval* nval, itimerval* oval)itimerval 有两个成员,it_interval和it_value,均为timeval类型,前者保存的是下次定时器的定时间隔,后者为本次超时时的定时间隔。也就是说,定时器将从it_value减少,当变为...

weixin_42526087的博客 227

从TI官方手册里挖细节:TPS5430负压电路那个不起眼却救命的Cd电容

本文深入解析TPS5430负压电路中关键Cd电容的作用与设计要点,揭示其在DC-DC电源设计中的重要性。通过对比TI手册和实战案例,详细阐述Cd电容在高频电流回路、能量缓冲和噪声抑制中的核心功能,并提供选型与布局指南,帮助工程师避免芯片烧毁风险,提升电路稳定性。

weixin_27102543的博客 357

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时器的出现创造了条件。内核从2.6.16开始加入了高精度定时器架构。在实现方式上,内核的高分辨率定时器的实现代码几乎没有借用低分辨率定时器的数据结构和代码,内核文档给出的解释主要有以下几点:

DroidPhone的专栏 10万+

晶圆表面缺陷检测现状概述

凹坑,凸起,尖角,沟槽),使用光束对晶圆进行照射,收集反射光和散射光信息进行缺陷判断,进一步可分为无图案晶圆表面检测和宏观缺陷检测设备。KLA使用SR-DUV光,检测精度在10nm以下。扫描电子显微(电子束和晶圆表面产生二次电子,X射线等)获取高分辨率的图像,然后用图像处理表面缺陷(凹坑,凸起,尖角,沟槽等)表面容貌和材料信息,分辨率可达5-10nm。晶圆表面缺陷检测设备主要检测晶圆外观呈现出来的缺陷,损伤、毛刺等缺陷,主要设备供应商KLA,AMAT,日立等,其中KLA在晶圆表面检测设备占有市场52%左右。

qq_36786800的博客 1万+

QCM6490平台DDR测试:从QDUTT配置到眼图分析的实战指南

本文详细介绍了QCM6490平台DDR测试的全流程,从QDUTT工具安装配置到眼图分析,提供了实战操作指南和常见问题解决方案。通过具体案例分享,帮助工程师掌握DDR测试技巧,确保内存稳定性,特别适用于物联网和边缘计算设备的开发调试。

weixin_33910191的博客 456

Linux 内核中的定时器机制:从低精度到高精度

Linux 内核中的定时器机制是实现时间相关功能的核心组件。定时器机制通过低精度定时器、高精度定时器、定时器轮、时钟源和时钟事件设备等组件,实现了精确的时间调度和管理。工作也要流程化,定时器机制就像是系统中的时间管理工具,它确保了任务的按时执行和系统的高效运行。在实际应用中,我们需要选择合适的定时器,避免长时间持有锁,正确处理定时器取消,使用高精度定时器,以及优化定时器数量,以实现系统的最佳性能和可靠性。

jiang_style的博客 4525

基于CNN的三相故障识别算法及实现(Matlab)

通过预处理数据、构建CNN模型、训练与评估模型等步骤,我们可以准确快速地识别三相故障。现代电力系统中,三相故障是一种常见的故障情况,可以导致电网中断、设备损坏甚至火灾等严重后果。本文将介绍基于卷积神经网络(CNN)的三相故障识别算法,并提供Matlab源代码实现。首先,将原始信号分为训练集和测试集。然后,对输入信号进行归一化处理,确保数据在合适的范围内。CNN适用于处理二维数据,所以我们可以将输入信号看作是时间序列数据和特征(如电压、电流等)的二维矩阵。在开始之前,我们需要一个包含正常和故障样本的数据集。

学习使你进步。 383

Linux内核的高精度定时器

本文介绍了Linux内核中的高精度定时器(HrTimer)技术。高精度定时器可提供纳秒级精度,适用于任务调度等高精度场景。文章详细讲解了高精度定时器的核心结构体hrtimer及其成员变量,包括回调函数、定时器状态等;并列举了相关操作接口函数,如初始化(hrtimer_init)、启动(hrtimer_start)、取消(hrtimer_cancel)等。最后给出了一个示例程序test_hrtimer.c,演示了如何实现每3秒打印一次消息的高精度定时器功能。该技术需要硬件支持,适用于对时间精度要求较高的应用场

ych4444的博客 1294

2、机器人控制技术:阻抗/导纳控制与强化学习的融合

本文探讨了阻抗/导纳控制与强化学习在机器人控制中的融合应用。阻抗/导纳控制广泛应用于外骨骼和跟踪控制,通过改进方案提升建模误差下的鲁棒性;强化学习则为解决维度灾难、实现最优交互提供了有效途径,尤其在大输入空间、连续时间系统、冗余机器人及鲁棒控制中表现突出。结合近似器与合理奖励设计,强化学习可在无模型情况下实现高效控制。未来,两者融合有望推动更智能、更安全的机器人系统发展。

ice55的博客 299

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5247

Linux 内核中的时间管理:时钟源与定时器的实现

Linux 内核中的时间管理系统是一个核心组件,它负责维护系统的时间,提供定时器功能,支持各种时间相关的操作。时间管理的设计思路与企业管理中的时间规划有着密切的联系,它通过时间基准、任务调度、效率优化和可靠性等机制,为系统的高效运行提供了保障。工作也要流程化,时间管理就像是系统中的时间规划工具,它确保了系统的时间准确性和任务的按时执行。在实际应用中,我们需要根据具体场景选择合适的时钟源和定时器类型,并优化定时器的使用,以实现系统的最佳性能。

jiang_style的博客 4506

【2023校招】网易雷火_研发岗_笔试题解

几个月没写题,果然水平不在线了hh,AK更难实现喽,当天只AK了疯狂游戏; 题目描述和数据等尽量多的CV到了DEVC里,可能不够细节和准确; 下面进入正题,分享我们此次笔试的题目描述和代码设计吧~.........

米莱虾 4544

Linux 低精度和高精度 定时器分析

低精度率定时器(timer_list) & 高精度定时器(hrtimer) & 内核抽象timer硬件(struct clock_event_device)

yyymmmmyyy的博客 1401

YOLOV26详解 从原理到部署

计算机视觉领域最具影响力的目标检测框架迎来重大里程碑。2026年1月,Ultralytics 正式发布 YOLOv26——这不是一次简单的版本迭代,而是一场面向边缘计算时代的架构重构。本专栏基于 Ultralytics 官方技术白皮书、YOLO Vision 2025 大会首发内容及国际前沿研究成果,系统拆解 YOLOv26 从算法原理到工程落地的全栈技术体系。与常规教程不同,我们聚焦与,帮助你在端侧 AI 部署的实战中掌握核心竞争力。

u012133341的博客 2016

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux 内核 高精度定时器(hrtimer)实现机制

目录 1 hrtimer 概述 2 相关数据结构 2.1hrtimer 2.2hrtimer_clock_base 2.3hrtimer_cpu_base 3 高精度定时器相关API 3.1 高精度定时器层初始化hrtimers_init 3.2 定时器初始化 hrtimer_init 3.3 定时器移除remove_hrtimer 3.4 定时器激活hrtimer_start_range_ns 3.5 定时器的迁移switch_hrtimer_base 3.6 查找...

1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux内核高精度定时器hrtimer的使用

Linux内核高精度定时器hrtimer的使用 hrtimer:(high resolution timer): 高精度定时器,为我们提供了纳秒级别的定时精度,以满足对精确时间有迫切需求的应用程序或内核驱动。因原有定时器已经相对完善,避免大幅度改动,内核为高精度定时器重新设计了一台软件架构。 数据结构:定义在<Linux/hrtimer.h>中 /** * struct...

Kunaly 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux驱动开发高精度定时器的精度测量

前言今天我们来评测linux内核的高精度定时器。顺便利用通过Tektronix示波器 和 DS100 Mini 数字示波器进行交叉测试。因项目需要用到精准的时间周期,所以要评估它的可行性,...

Rice开发经验分享 2772

【LINUX】Linux从闹钟到高精度定时器的实现

本文系统讲解了Linux定时器的实现与选型。从基础的sleep/alarm到setitimer,再到融入事件循环的timerfd;从内核的时间轮、红黑树到高性能服务器常用的多级时间轮。不同方案在精度(秒级到纳秒级)、性能(O(1)到O(log n))和适用场景(简单脚本到百万连接)上各有特点。建议网络服务优先选用timerfd+epoll,海量连接场景采用时间轮,游戏服务器可混合使用红黑树和时间轮。理解这些实现机制有助于在不同业务场景中选择最优定时方案。

NoBack7--For the dream 9245
上一篇: 我的web开发学习2--JavaScript与HTML DOM
下一篇: volatile编写多线程程序的好帮手
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值