浅谈 Linux 下的 Timer 框架
n6xb
10年前
前言
看着图中的计时器,想一想现实中我们是如何计时的?想一想如果计划用 20 分钟来煮一锅粥都有哪些步骤?
- 在心里记下时钟上 20 分钟的位置。
- 开始煮粥,并按下计时器。
- 重复拿当前时间和 20 分钟比较。如果还没到,继续煮粥。
- 当当前时间到达目标时间 20 分钟后,告诉自己,粥好了可以吃了。
从上面的例子,我们能得到什么?如果抽象并构建一个时钟模型,我们需要哪些东西呢?我想大概是这样:
- 一个单调递增的计数器 counter
- 一个可设置的比较器 comparer
- 当 counter 中的数字增加到等于 comparer 的时候触发中断,告诉你,“粥”好了可以吃了
Linux 下的 Timer 框架
Linux 下的 Timer 框架和上面的例子大致相似,它把一个 Timer 拆分成两部分:Clocksource 和 Clock_event_device。Clocksource 主要包括 counter 等时钟源信息,Clock_event_device 主要包括:设置 comparer,触发中断,中断处理等任务。
Clocksource
Clocksource 最重要的接口是 read counter func,通过此接口,内核可以读取 counter 中的值。完整的 Clocksource 接口定义见 include/linux/clocksource.h。
Clock_event_device
Clock_event_device 部分需要实现如下接口
- 通过 set_next_event 来设置下次时钟中断触发的条件。
- 通过 irq && irq_action 来设置时钟中断触发后要做的事情。
完整的 Clock_event_device 接口定义见 include/linux/clockchips.h
来自:http://www.tinylab.org/take-a-look-at-the-linux-timer-framework/