Outline 定时的硬件设备 o实时时钟RTC 。时问戳计数器TSC ●可编程间隔定时器PIT @Linx的计时体系结构 。滴答产生机制 o Jiffies变量 。Linux的时钟源 。xtime变量 。时钟中断处理 。软定时器 @廷迟函数 相关PI和命今 小结、作业和project 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28,201410/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 10 / 49
3、可编程间隔定时器PIT ●经过适当编程后,可以周期性的给出时钟中断 ●通常是8254CM0S芯片,使用I/0端口0x400x43 ●Linux将PIT编程为: ●100Hz、1000Hz 。通过IRQ0发出时钟中断 。每若千毫秒(100Hz为10ms)产生一次时钟中断,即一个tick 1口卡40是14P刀0C 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28,201411/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3、可编程间隔定时器PIT 经过适当编程后,可以周期性的给出时钟中断 通常是8254 CMOS芯片,使用I/O端口0x40~0x43 Linux将PIT编程为: 100Hz、1000Hz 通过IRQ0发出时钟中断 每若干毫秒(100Hz为10ms)产生一次时钟中断,即一个tick 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 11 / 49
3、可编程间隔定时器PIT ●Tick的长短 。短 。优点:分辨率高 ●缺点:需要较多的CPU时间处理,会导致用户程序运行变慢 。适用于非常强大的机器,这种机器能够承担较大的系统开销 。Tick的设置是一个折中,例如 ●在大多数患普的Alpha和Intel的IA- 64上约1ms产生一个tick(每秒1024个时钟中断)》 ●Rawhide A1pha工作站采用更高(1200tick/秒) 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.201411/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3、可编程间隔定时器PIT Tick的长短 短 优点:分辨率高 缺点:需要较多的CPU时间处理,会导致用户程序运行变慢 适用于非常强大的机器,这种机器能够承担较大的系统开销 Tick的设置是一个折中,例如 在大多数惠普的Alpha和Intel的IA- 64上约1ms产生一个tick(每秒1024个时钟中断) Rawhide Alpha工作站采用更高(1200tick/秒) 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 11 / 49
3、可编程间隔定时器PIT 。在Linux中,下列宏决定时钟中断频率 #ifdef KERNEL define HIZ CONFIG HZ Internal kernel timer frequency #define USER_HZ 100 /some user interfaces are #define CLOCKS_PER_SEC (USER_HZ)/in ticks"like times()/ #endif 2:每秒钟时钟中断的次数· #ifndef HZ 即每秒tick(滴答)数· #define HZ 100 #endif 参见include/asm-x86/param.h #CONFIG_HZ_100 is not set CONFIG_HZ是Hz的配置情况· CONFIG_HZ_250=y 例如arch/x86/configs/i386 defconfig中 #CONFIG HZ 300 is not set #CONFIG_HZ_1000 is not set CONFIG_HZ=250 4口4四1是14P刀00 陈香兰(x1 anchenoustc,edu.cn)(计算丸应Linux操作看统分析Chapter7 Linux中的时料 0 ctober28.201411/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3、可编程间隔定时器PIT 在Linux中,下列宏决定时钟中断频率 . . #ifdef __KERNEL__ # define HZ CONFIG_HZ /* Internal kernel timer frequency */ # define USER_HZ 100 /* some user interfaces are */ # define CLOCKS_PER_SEC (USER_HZ) /* in ”ticks” like times() */ #endif #ifndef HZ #define HZ 100 #endif . . # CONFIG_HZ_100 is not set CONFIG_HZ_250=y # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=250 HZ:每秒钟时钟中断的次数, 即每秒tick(滴答)数。 参见include/asm-x86/param.h CONFIG_HZ是HZ的配置情况。 例如arch/x86/configs/i386_defconfig中 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 11 / 49
3、可编程间隔定时器PIT ●时钟中断频率在init pit timer()中初始化, 参见arch/x86/kernel/i8253.c case CLOCK_EVT_MODE_PERIODIC: /*binary,mode 2,LSB/MSB,ch 0/ outb_pit(0x34.PIT_MODE): outb_pit(LATCH Oxff,PIT_CHO):/LSB/ outb_pit(LATCH >8.PIT_CHO):MSB break: LATCH:是触发周期性时钟的镇存值, 参见include/1inux/jiffies.h /*LATCH is used in the interval timer and ftape setup. #define LATCHI ((CLOCK_TICK_RATE HZ/2)/HZ)/For divider/ CLOCK_TICK_RATE是时钟的振荡频率, #ifdef CONFIG_X86_ELAN 参见include/asm-x86/timex.h define PIT_TICK_RATE 1189200 AMD Elan has different frequency! #elif defined(CONFIG_X86_RDC321X) #define PIT_TICK_RATE 1041667 Underlying HZ for R8610/ #else define PIT_TICK_RATE 1193182 Underlying HZ #endif 因此,当H2=100时·大约每10ms产生一次 时钟中断。 #define CLOCK_TICK_RATE PIT_TICK_RATE 练香兰(x1 anchenoustc,edu.cn)(计界丸应L1nux操作看统分析Chapter7 Linux中的时料 (ctober 28.2014 11/49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3、可编程间隔定时器PIT 时钟中断频率在init_pit_timer()中初始化, 参见arch/x86/kernel/i8253.c . . case CLOCK_EVT_MODE_PERIODIC: /* binary, mode 2, LSB/MSB, ch 0 */ outb_pit(0x34, PIT_MODE); outb_pit(LATCH & 0xff , PIT_CH0); /* LSB */ outb_pit(LATCH >> 8 , PIT_CH0); /* MSB */ break; . . /* LATCH is used in the interval timer and ftape setup. */ #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */ . . #ifdef CONFIG_X86_ELAN # define PIT_TICK_RATE 1189200 /* AMD Elan has different frequency! */ #elif defined(CONFIG_X86_RDC321X) # define PIT_TICK_RATE 1041667 /* Underlying HZ for R8610 */ #else # define PIT_TICK_RATE 1193182 /* Underlying HZ */ #endif #define CLOCK_TICK_RATE PIT_TICK_RATE LATCH是触发周期性时钟的锁存值, 参见include/linux/jiffies.h CLOCK_TICK_RATE是时钟的振荡频率, 参见include/asm-x86/timex.h 因此,当HZ=100时,大约每10ms产生一次 时钟中断。 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 7 Linux中的 时钟和定时测量 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 28, 2014 11 / 49