跟涛哥一起学嵌入式 28:Linux下的时间管理和定时器编程

2023-10-28 12:30

本文主要是介绍跟涛哥一起学嵌入式 28:Linux下的时间管理和定时器编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间是我们生活中非常重要的一个概念,我们的生活处处离不开时间:你跟朋友定在晚上7点去吃火锅;你老板让你半个小时后去他办公室;还有一周就要放假过年了...。在现代社会中,没有时间的度量,我们的生活将寸步难行。除非你去终南山隐居,去过日出而作,日落而息的生活。

计算机中处处需要时间

在计算机系统中,也是处处需要时间,离开时间寸步难行:你的电影播放时间、系统日志log、QQ 微信聊天记录、电脑每周一次的杀毒、清理垃圾、软件更新,都需要时间。包括操作系统的任务调度,给每个进程分配运行时长,也需要时间。

生活中的时间可分为绝对时间和相对时间:公元2020年1月24日,你的电脑开机时间,这些可以算是绝对时间;万历15年、昨天今天和明天,则是相对时间。其实,相对时间和绝对时间并没有一个清晰的划分概念,一切时间可能都要以某一个时刻为起点,都是相对时间。绝对时间也是一种特殊的相对时间,因为大家都使用默认的参考起点,所以一般就看做绝对时间了。

你沐浴在温暖在阳光里,我在漆黑的夜里沉睡。由于地球自转的原因,世界各地的日落日出时间不一样,因此也引出了时区的概念:全球划分为24个时区,以伦敦的本初子午线为准,往东叫东X区,往西叫西X区。如伦敦时间凌晨0点,因为我们在东八区,太阳比伦敦早8个小时升起,所以我们的时间就是早上八点。

 

v2-c71fc94944961937829c48f1753624c7_b.jpg

伦敦的时间,也就是子午线0时区的时间,一般称为格林威治时间(GMT,Greenwich Mean Time),又称作世界协调时间( UTC,Coordinated Universal Time)。计算机中一般保存的就是这种世界标准时间,以1970年1月1日零时零分0秒为起点,记录到现在的秒数。但是世界各地的电脑显示的一般是本地时间,会将世界标准时间结合你本地电脑设置的时区,转换为本地时间并显示在电脑桌面的右下角。

 

时间的计量

戴过手表的同学可能都有过这种经历:每过一段时间就会发现自己的手表时间不准了,需要校准。为什么不准了呢?很简单,计时出现了误差。到哪里校准呢?很简单,每天晚上7点的新闻联播,很多人开始掏出自己的手表开始调时。为什么要以新闻联播为准呢?还得从计时器的发展历程说起。

古时候科技不发达,古人只能观天计时:日出日落、月圆月缺、春夏交替、四季轮回,发明了阳历和阴历。这种计时的精度只能以天来计算。后来古人发明了各种计时设备:日晷、沙漏、刻漏等,将计时精度推进了小时级别。但是这种计时器误差很大,四季太阳高度的变化、冬天夏天刻漏的滴水口的热胀冷缩,都会影响计时的精度。

 

v2-3b6bb96f1553d0b5a3a29b08600e0a49_b.jpg

后来欧洲人发明了机械钟,使用发条或单摆作为动力,把计时的精度推进到了秒级。比较有代表性的就是瑞士手表,可以说是机械钟的巅峰之作,风靡了几个世纪。

 

v2-e016642732155b75edf3e17869ee6084_b.jpg

电的出现和电子技术的发展,将计时器又推向了一个高度:采用晶振计时。给适应振荡器两边加电压,晶振就会发出规律的正弦波,再经过整形就可生成周期频率的方波,方波再讲过分频或倍频,就可以引入到CPU或SOC的内部,作为计时的时钟之源。

 

v2-711d8c1de5085dcea95c9b6d404be1b3_b.jpg

采用晶振计时的电子设备,一般精度可以达到微秒级别,多少年的计时误差可能只差1秒。现在的计算机或电子设备一般都采用这种晶振计时,给晶振两端加电压就可以让他永远振荡下去,唯一的缺陷就是当电脑或手机关机时就无法计时了。因此现在的计算机一般都有两个计时器,其中一个单独供电,比如我们电脑上的主板上就有一个CMOS电池给实时时钟供电,当电脑关机时,实时时钟仍可以继续计时。等你下次开机,你会发现时间一直很准确,这里面就有主板上的CMOS实时时钟的功劳。

随着时间流逝,不同计算机的计时也会出现或快或慢的误差。尤其是互联网时代,不同计算机之间进行通信,更需要时间同步。那该如何是好?不用担心,一种更精密的计时器出来了:铯原子钟。它是根据铯原子的原子跃迁产生振动磁场的振荡周期来作为原子时间的标准,误差是千万分之一秒。世界上第一个原子钟由美国国家物理实验室建造,作为世界标准标准时间之源。后来世界各地的实验室纷纷建立自己的实验室,作为本国的授时中心。如我国位于西安的中科院国家授时中心,新闻联播的实时报时就是以此为时间之源的。

 

v2-de70ad146231f8ddc74327f96734ea26_b.jpg

除了铯原子钟外,还有氢原子钟、铷原子钟等计时设备。在一些对时间要求比较高的航空航天、军事科研领域,一般会购买这种精密的计时设备,作为时间之源。

 

v2-17cece6c963d14f010d4ba815b4cf3f7_b.jpg

Linux中的时间管理

想对时间进行管理,光有硬件还不行,还需要软件的配合。在Linux系统中,内核中会对这些定时器进行设置,一般每隔 10ms 来一个时钟中断,即时钟节拍。每一次时钟到期产生中断后,内核中有一个叫jiffies的全局变量,用来记录系统启动以来发生中断的次数,因为时钟发生中断是周期性的,因此可以用来计时。

 

v2-5d2fe4ba5057aad9a878b325b483a275_b.jpg

为了计时准确,内核中使用另外一个全局变量 xtime 来记录实时时间:当系统启动后,内核会从CMOS上的实时时钟读取实时时间,保存到 xtime 变量中,随后随着时钟中断,不断更新 xtime 和 jiffies这两个值。关机时,内核再把实时时间 xtime 保存到CMOS主板上的实时时钟内,这样断电后,计算机仍可以使用独立电源实时计时。

 

时间管理和定时器编程

用户通过Linux操作系统提供的系统调用 或 C标准库函数的 API,可以方便的获取系统时间、设置系统时间,以及使用计算机的定时器进行编程,周期性地去做一些事情:比如定期杀毒、垃圾清理、软件升级等。

《Linux系统编程》第08期:时间管理和定时器编程,视频教程已经发布,将会给大家介绍Linux系统下关于时间的获取、设置、定时器编程的各种 API 接口的使用。CSDN学院搜课程名称或讲师名字“王利涛”即可。

 

这篇关于跟涛哥一起学嵌入式 28:Linux下的时间管理和定时器编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293230

相关文章

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat