定时器 8253

计算机中的时钟,大致可以分为两大类:内部时钟和外部时钟

内部时钟

内部时钟是指处理器中内部元件,如运算器、控制器的工作时序,主要用于控制、同步内部工作过程的步调。内部时钟是由晶体振荡器产生的,简称晶振,它位于主板上,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就是基于外频。

Intel 处理器将此外频乘以某个倍数(也称为倍频)之后便称为主频。处理器取指令、执行指令中消耗的时钟周期,都是基于主频的。内部时钟是由处理器固件结构决定的,在出厂时就设定好了,无法改变。处理器内部元件的工作速度是最快的,所以内部时钟的时间单位粒度比较精细,通常是纳秒级别的

注意:内部定时是无法改变的

外部时钟

外部时钟是指处理器与外部设备或外部设备之间通信时采用的一种时序,比如 I/O 接口和处理器之间在 A/D 转换时的工作时序、两个串口设备之间进行数据传输时也要事先同步时钟等。外部设备的速度对于处理器来说就很慢了,所以其时钟的时间单位粒度较大,一般是毫秒级或秒级的


外部时钟和内部时钟是两套独立运行的定时体系,他们按照自己的步调协同工作。外部设备需要与处理器通信,他们之间的通信是由 IO 接口中转完成的。

因此,当外部设备和处理器连接时,我们就要考虑处理器与外部设备间同步数据时的时序配合问题?如何保证运行在不同设备的时钟,既要符合处理器内部运行时序的规定,又要满足外部设备工作时序的要求。定时计数器就是用来解决时序配合问题的。处理器的内部时钟信号由晶振产生,因此计时精准稳定。但晶振产生的信号频率过高,因此必须将其送到定时计数器分频,这才能产生所需要的各种定时信号。

比如我们实现外部定时,如果用软件实现,

1
2
int cycle_cnt = 99999;
while (cycle_cnt-- > 0) {}

软件实现的定时,效率极差,处理器在空转。但是如果使用硬件:定时器处理的话,当到达了所计数的时间,计数器自动发一个输出信号,可以用该信号向处理器发出中断,这样处理器可以去执行相应的中断处理程序,或者用该信号直接启动某些外部设备。

计数器

计数器有时钟脉冲信号,也称为计数脉冲信号,每一次时钟脉冲信号到来时就会修改计数值。定时器的计数方式有两种:

  • 正计时,每一次时钟脉冲发生时,将当前计数值加一,直到与设定的目标终止值相等时,提示时间已到
  • 倒计时,先设定好计数器的值,每一次时钟脉冲发生时将计数值减一,直到为 0 时提示时间已到。

8253 采用的是倒计时的方式,对他的编程就是围绕着如何为其计数器赋初始的计数值。

为什么要定时?在微型计算机系统中,比如为防止 RAM 中的数据丢失,每隔一段时间就要对 RAM 进行充电刷新,或者定时监测某些参数,还有最重要的,定时向处理器发时钟中断。