Linux操作系统分析 Chapter7 Linux中的时钟和定时测量 陈香兰(xlanchen@ustc.edu.cn) 计算机应用教研室©计算机学院 嵌入式系统实验室●苏州研究院 中国科学技术大学 Fa112014 October 28,2014 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分所Chapter7 Linux中的时料 0 ctober28.20141749
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Linux操作系统分析 Chapter 7 Linux中的 时钟和定时测量 陈香兰(xlanchen@ustc.edu.cn) 计算机应用教研室@计算机学院 嵌入式系统实验室@苏州研究院 中国科学技术大学 Fall 2014 October 28, 2014 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 1 / 49
Outline 定时的硬件设备 ●实时时钟RTC ●时间戳计数器TSC ·可编程间隔定时器PIT ②Linux的计时体系结构 ●滴答产生机制 。Jiffies变量 ●Linux的时钟源 ●xtime变量 。时钟中断处理 ·软定时器 延迟函数 相关API和命令 小结、作业和project 1口t4四1是42刀00 东香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作表统分所Chapter7 Linux中的时料 0 ctober28.20142/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Outline 1. 定时的硬件设备 实时时钟RTC 时间戳计数器TSC 可编程间隔定时器PIT .2 Linux的计时体系结构 滴答产生机制 Jiffies变量 Linux的时钟源 xtime变量 时钟中断处理 软定时器 .3 延迟函数 4. 相关API和命令 5. 小结、作业和project 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 2 / 49
定时测量 。Linux内核提供两种主要的定时测量 ●获得当前的时间和日期 ·系统调用:time(),ftime()以及gettimeofday() ©维持定时器 o settimer(),alarm() ●定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的 1口4四1是4P在刀0C 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分所Chapter7 Linux中的时华 0 ctober28.20143/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 定时测量 Linux内核提供两种主要的定时测量 1. 获得当前的时间和日期 系统调用:time(), ftime()以及gettimeofday() 2. 维持定时器 settimer(), alarm() 定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 3 / 49
Outline 定时的硬件设备 。实时时钟RTC 。时间戳计数器TSC ·可编程间隔定时器PIT Lx的计时体系结构 延迟画数 相天APT和命今 合小结、作业和project 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.20144/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Outline . 1. 定时的硬件设备 实时时钟RTC 时间戳计数器TSC 可编程间隔定时器PIT .2 Linux的计时体系结构 .3 延迟函数 4. 相关API和命令 5. 小结、作业和project 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 4 / 49
硬时钟概述 ●80x86体系结构上,内核必须显式的与各种时钟打交道 O实时时钟(Real time clock,RTC) O时间戳计数器(Time stamp counter,TSC) O可编程间隔定时器(Programmable interva1 timer,PIT) OCPU本地定时器 ⊙高精度事件定时器 ACPI电源管理定时器 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.20145/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 硬时钟概述 80x86体系结构上,内核必须显式的与各种时钟打交道 1. 实时时钟(Real time clock,RTC) 2. 时间戳计数器(Time stamp counter,TSC) 3. 可编程间隔定时器(Programmable interval timer, PIT) 4. CPU本地定时器 5. 高精度事件定时器 6. ACPI电源管理定时器 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 5 / 49
Outline 定时的硬件设备 ●实时时钟RTC 。时问戳计数器TSC 。可编程问隔定时器PII @Linx的计时体系结构 。滴答产生机制 o Jiffies变量 。Linux的时钟源 。xtime变量 。时钟中断处理 。软定时器 廷迟函数 相关PI和命今 小结、作业和progject 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.20146/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Outline . 1. 定时的硬件设备 实时时钟RTC 时间戳计数器TSC 可编程间隔定时器PIT .2 Linux的计时体系结构 滴答产生机制 Jiffies变量 Linux的时钟源 xtime变量 时钟中断处理 软定时器 .3 延迟函数 4. 相关API和命令 5. 小结、作业和project 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 6 / 49
1、实时时钟RTC ●基本上所有的PC都包含实时时钟RTC 。RTC独立于CPU与所有其他芯片依靠一个独立的小电池供电给 RTC中的振荡器 。即使关闭PC电源,还会继续运转 ●RTC与CMOS RAM往往集成在一个芯片内 。例如:Motoro1a146818 ●RTC能在IRQ8上发出周期性的中断,频率在2HZ8192之间 ·可以对其编程实现一个闹钟 ●内核通过0x70和0x71两个端口访问RTC 。Linux本身只使用RTC获得时间和日期 1口4四1是42刀00 陈香兰(xlanchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时# 0 ctober28.20147/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1、实时时钟RTC 基本上所有的PC都包含实时时钟RTC RTC独立于CPU与所有其他芯片,依靠一个独立的小电池供电给 RTC中的振荡器 即使关闭PC电源,还会继续运转 RTC与CMOS RAM往往集成在一个芯片内 例如:Motorola 146818 RTC能在IRQ8上发出周期性的中断,频率在2HZ~8192之间 可以对其编程实现一个闹钟 内核通过0x70和0x71两个端口访问RTC Linux本身只使用RTC获得时间和日期 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 7 / 49
1、实时时钟RTC ●可以通过设备文件/dev/rtc对其编程 #include #include #include #include #include int main(void){ int fd; struct rtc_time rtc_time; if ((fd=open("/dev/rtc",O_RDONLY))>0)( if(ioct1(fd,RTC_RD_TIME,&rtc_time)!=-1) printf(”CURRENT TIME(H:M:S):%d:d:%dn”, rtc_time.tm_hour, rtc_time.tm_min, rtc_time.tm_sec); else(perror(”I0 CTL error\n”):exit(-1);) else perror("OPEN failed\n")exit(-1): ·系统管理员可以通过执行时钟程序设置时钟 4口4四1是42刀00 陈香兰(x1 anchenoustc,edu.cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.20147/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1、实时时钟RTC 可以通过设备文件/dev/rtc对其编程 . . #include #include #include #include #include int main(void){ int fd; struct rtc_time rtc_time; if ((fd=open(”/dev/rtc”,O_RDONLY))>0){ if(ioctl(fd,RTC_RD_TIME,&rtc_time)!=-1) printf(”CURRENT TIME(H:M:S): %d:%d:%d\n”, rtc_time.tm_hour, rtc_time.tm_min, rtc_time.tm_sec); else { perror(”IOCTL error\n”); exit(-1); } } else { perror(”OPEN failed\n”); exit(-1); } } 系统管理员可以通过执行时钟程序设置时钟 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 7 / 49
Outline 定时的硬件设备 。实时时钟RTC ·时间戳计数器TSC 。可编程问隔定时器PII @Linx的计时体系结构 。滴答产生机制 o Jiffies变量 。Linux的时钟源 。xtime变量 。时钟中断处理 。软定时器 @廷迟函数 相关PI和命今 小结、作业和project 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.20148/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Outline . 1. 定时的硬件设备 实时时钟RTC 时间戳计数器TSC 可编程间隔定时器PIT .2 Linux的计时体系结构 滴答产生机制 Jiffies变量 Linux的时钟源 xtime变量 时钟中断处理 软定时器 .3 延迟函数 4. 相关API和命令 5. 小结、作业和project 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 8 / 49
2、时间戳计数器TSC 。在80x86微处理器中,有一个CLK输入引线 ·接收外部振荡器的时钟信号 ●从pentium-开始,很多80x86微处理器都引入了一个TSC ·一个64位的、用作时间戳计数器的寄存器 ·它在每个时钟信号(CLK)到来时+1,例如时钟 频率400MHz的微处理器,TSC每2.5ns就+1 ·rdtsc指令用于读该寄存器 ·与后面介绍的可编程间隔定时器相比,TSC可以获得更精确的时钟 。为此,Liux在系统初始化的时候必须确定时钟信号CLK的频率 (即CPU的实际频率) ●tsc_calibrate ●根据在一个相对较长的时间问隔内(约5ms)所发生的TSC 计数的个数进行计算 ●那个问隔由可编程间隔定时器给出 。由于只在系统初始化的时候运行一次,因此本程序可以执行 较长时问,而不会引起问题 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应L1nux操作看统分所Chapter7 Linux中的时华 0 ctober28.20149/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2、时间戳计数器TSC 在80x86微处理器中,有一个CLK输入引线 接收外部振荡器的时钟信号 从pentium开始,很多80x86微处理器都引入了一个TSC 一个64位的、用作时间戳计数器的寄存器 它在每个时钟信号(CLK)到来时+1,例如时钟 频率400MHz的微处理器,TSC每2.5ns就+1 rdtsc指令用于读该寄存器 与后面介绍的可编程间隔定时器相比,TSC可以获得更精确的时钟 为此,Linux在系统初始化的时候必须确定时钟信号CLK的频率 (即CPU的实际频率) tsc_calibrate 根据在一个相对较长的时间间隔内(约5ms)所发生的TSC 计数的个数进行计算 那个间隔由可编程间隔定时器给出 由于只在系统初始化的时候运行一次,因此本程序可以执行 较长时间,而不会引起问题 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 9 / 49