LINUX的时钟中断中涉及至二个全局变量一个是xtime,另一个则是jiffies。
有一个与时间有关的时钟:实时时钟(RTC),这是一个硬件时钟,用来持久存放系统时间,系统关闭后靠主板上的微型电池保持计时。系统启动时,内核通过读取RTC来初始化WallTime,并存放在xtime变量中,即xtime是从cmos电路中取得的时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期,它的精度是微秒。这是RTC最主要的作用。
jiffies是记录着从电脑开机到现在总共的时钟中断次数。在linux内核中jiffies远比xtime重要,jiffies取决于系统的频率,单位是Hz,是周期的倒数,一般是一秒钟中断产生的次数,所以,假如我们需要知道系统的精确的时间单位时,需要换算了,假如我们系统的频率是200Mhz,那么一次中断的间隔是1/200,000,000Hz=0.000 000005秒,所以理论上我们系统的精确度是5ns。LINUX系统时钟频率是一个常数HZ来决定的,通常HZ=100(Linux内核从2.5版内核开始把频率从100调高到1000),那么他的精度度就是10ms(毫秒)。也就是说每10ms一次中断。所以一般来说Linux的精确度是10毫秒。
内核一般通过jiffies值来获取当前时间。尽管该数值表示的是自上次系统启动到当前的时间间隔,但因为驱动程序的生命期只限于系统的运行期(uptime),所以也是可行的。驱动程序利用jiffies的当前值来计算不同事件间的时间间隔。硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率(即上面所说的HZ=100)。节拍率(tickrate),每一个周期称作一个tick(节拍)。jiffies是内核中的一个全巨变量。系统启动一来产生的节拍数。譬如,如果计算系统运行了多长时间,可以用 jiffies/tick rate 来计算。
jiffies定义在文件
如果您需要更精确的时间来测量或者记录某些事情的话,内核中有个xtime全局变量,类型是struct timespec {time_t tv_sec; long tv_nsec;}按照这个数据结构,它是ns级的。
有一个current_kernel_time函数,通过它就可以获取xtime的值。但是xtime是在时钟中断里更新的,而一个tick往往是10ms或者100ms,它只能保证在时钟中断ISR调用时刻,它返回的值是精确到ns级,并不能保证任何一个调用这个函数的时刻都能这样,原因是xtime的更新速度比它差几个数量级。
kernel的time基本类型:
1) system time
A monotonically increasing value that represents the amount of time the
system has been running. 单调增长的系统运行时间,可以通过time source,xtime及wall_to_monotonic计算出来。
2) wall time
A value representing the the human time of day, as seen on a wrist-watch. Realtime时间: xtime.
3) time source
A representation of a free running counter running at a known frequency, usually in hardware, e.g GPT.
可以通过clocksource->read()得到counter值
4) tick
A periodic interrupt generated by a hardware-timer, typically with a fixed interval defined by HZ: jiffies
这些time之间互相关联,互相可以转换。
system_time = xtime + cyc2ns(clock->read() - clock->cycle_last) + wall_to_monotonic;
real_time = xtime + cyc2ns(clock->read() - clock->cycle_last)
也就是说real time是从1970年开始到现在的nanosecond,而system time是系统启动到现在的nanosecond.
这两个是最重要的时间,由此hrtimer可以基于这两个time来设置过期时间。所以引入两个clock base:
CLOCK_REALTIME: base在实际的wall time
CLOCK_MONOTONIC: base在系统运行system time
CLOCK_REALTIME 调用ktime_get_real()来获得真实时间, 该函数用上面提到的等式计算出realtime.
CLOCK_MONOTONIC 调用ktime_get(), 用system_time的等式获得monotonic time.
Clock API
clock_gettime(clockid_t, struct timespec *)
获取对应clock的时间
clock_settime(clockid_t, const struct timespec *)
设置对应clock时间
clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *)
进程nano sleep
clock_getres(clockid_t, struct timespec *)
获取时间精度, 一般是nanosec
clockid_t 定义了四种clock:
CLOCK_REALTIME
System-wide realtime clock. Setting this clock requires appropriate privileges.
CLOCK_MONOTONIC
Clock that cannot be set and represents monotonic time since some unspecified starting point.
CLOCK_PROCESS_CPUTIME_ID
High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
Thread-specific CPU-time clock.
前两者前面提到了,后两个是和进程/线程统计时间有关系,应用层可以利用这四种clock,提高灵活性及精度。
Timer API
Timer 可以建立进程定时器,单次或者周期性定时。
int timer_create(clockid_t clockid, struct sigevent *restrict evp, timer_t *restrict timerid);
创建定时器。
clockid 指定在哪个clock base下创建定时器。
evp (sigevent) 可以指定定时器到期后内核发送哪个信号给进程,以及信号所带参数;默认为SIGALRM。
timerid 返回所建timer的id号。
在signal 处理函数里,可以通过siginfo_t.si_timerid
获得当前的信号是由哪个timer过期触发的。试验了一下,最多可创建的timer数目和ulimit里的pending
signals的有关系,不能超过pending signals的数量。
int timer_gettime(timer_t timerid, struct itimerspec *value);
获得timer的下次过期的时间。
int timer_settime(timer_t timerid, int flags, const struct itimerspec *restrict value, struct itimerspec *restrict ovalue);
设置定时器的过期时间及间隔周期。
int timer_delete(timer_t timerid);
删除定时器。
这些系统调用都会建立一个posix_timer的hrtimer,在过期的时候发送信号给进程。
相关推荐
在Linux系统中,时钟管理是一项至关重要的任务,...总的来说,Linux时钟管理是一个复杂且精细的领域,涉及到系统运行的多个层面,理解这些概念对于优化系统性能、编写时间敏感的应用程序以及确保系统稳定性至关重要。
Linux时钟同步的方法 Linux系统中的时钟同步是指将Linux系统的时钟与一个公共的时钟源同步,以确保系统时钟的准确性。时钟同步的方法可以分为两类,一类是使用NTP(Network Time Protocol)服务器来同步时钟,另一...
本文旨在深入剖析Linux 2.4.0内核版本中的时钟中断机制,从理论到实践,全面解读其工作原理和实现细节。 #### 二、时钟中断概述 Linux内核主要依赖三种类型的时钟硬件来实现时间管理:实时时钟(RTC)、可编程间隔...
《嵌入式Linux下时钟同步系统的分析与实现》这篇文献主要探讨了在嵌入式Linux环境下,如何实现网络精确时钟同步协议(PTP,Precision Time Protocol)以达到高精度的时间同步。PTP是IEEE 1588标准的一部分,主要用于...
一个自己用qt写的很简单的数字时钟, 支持linux系统. 本人仅在unbuntu14.04上进行了测试. 如果支持其他系统版本请麻烦留个言, 说下支持的其他系 统和版本.谢谢. 因为本人中午在躺椅上睡觉, 系统时钟太小看不清, ...
《采用混合时钟模式提高Linux时钟精度的方法》这篇论文主要探讨了如何在Linux操作系统中提升时钟精度以满足实时任务的需求,特别是在数控系统中的应用。时钟精度对于实时任务的响应时间和调度至关重要,而传统的...
在本实验报告中,我们将详细介绍Linux内核时钟的实现机理、时钟模块的设计和实现、时钟的应用程序设计等内容。 一、时钟的重要性 时钟是操作系统的核心组件之一,它负责提供系统时间和频率 references,控制系统的...
2. 然后调用 `hwclock –systohc` 命令将操作系统时间设置到 RTC 时钟中。 3. 最后,使用示例代码设置 RTC 时钟的日期和时间。 读取 RTC 时间并设置操作系统时间 读取 RTC 时间可以通过 ioctl 系统调用来实现。...
矿用设备在运行过程中需要使用实时时钟,并在设备断电后要求实时时钟仍能依靠独立的供电系统不间断运行。嵌入式Linux系统具有开源、稳定、可移植等优点,它为实时时钟的开发提供了方便,为此提出了嵌入式Linux系统下...
嵌入式Linux系统中实时时钟驱动的设计 嵌入式Linux系统中的实时时钟驱动是指在嵌入式Linux系统中设计和实现实时时钟的驱动程序,以满足设备的实时时钟需求。该驱动程序具有开源、稳定、可移植等优点,为实时时钟的...
在嵌入式Linux设备中,高精度IEEE 1588时钟同步的实现需要借助专门的硬件和软件支持。在硬件方面,使用了DP83640芯片来实现时钟同步。在软件方面,使用了Linux系统标准API来实现IEEE 1588协议软件。 四、实验结果 ...
在Linux的0号中断是一个定时器中断。...Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入CPU,就可以引发一个中断请求信号,我们就把它叫做时钟中断。 “时钟中断”是特
本篇文章将详细讲解ARM9处理器中的系统时钟和定时器,以及如何在嵌入式Linux环境下进行相关开发。 首先,我们要理解系统时钟和定时器的概念。系统时钟是计算机硬件中提供时间基准的组件,它为整个系统提供了一个...
文章提出了一种在基于Linux的实时操作系统RT Linux(Real-Time Linux,RFT OS)中的时钟粒度细化方案。该方案旨在通过优化时钟中断处理机制,在不影响系统整体性能的前提下,实现更高精度的时钟定时。作者通过实验...
实时时钟(RTC)在嵌入式系统设计中扮演着至关重要的角色,它不仅负责保持精确的时间,还在系统启动和运行期间提供时间基准。Linux操作系统作为一个广泛应用的开源平台,对RTC的支持是必不可少的。"RTC.rar_linux...
总结来说,理解Linux下的C语言编程中的时间概念,包括如何获取当前时间、测量代码执行时间以及使用计时器,对于编写高效且可度量性能的程序至关重要。这些知识点不仅适用于系统性能分析,也适用于算法效率评估,是...
总之,Linux时钟的可缩放和全屏功能是通过多种方式实现的,包括调整终端字体、使用桌面小部件、编写自定义程序等。这些方法不仅可以满足日常使用,还特别适用于测试和录像场景,使时间显示更加清晰易见。无论你是...
在Linux操作系统中,C语言是开发系统级程序的常用工具,尤其在处理底层硬件交互、时间同步等任务时。这个“Linux-C时钟传送程序”就是利用C语言编写的一个示例,它包含了发送端和接收端,目的是实现不同主机间的时钟...
在《申延超_嵌入式Linux应用开发完全手册笔记_系统时钟和定时器》这本书中,作者详细介绍了这些概念的原理、使用方法及最佳实践,是初学者和经验丰富的开发者深入理解系统时钟和定时器的宝贵资源。通过阅读和实践,...
以下将详细解析Linux时钟系统的基本概念、关键数据结构以及相关函数的实现原理。 #### 基本概念 **2.1 时钟(源)** 时钟源是所有电子设备的基础,对于计算机来说,时钟源通常是晶振或其他类型的振荡器,它们提供...