本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时行为的区别。本文暂不考虑高精度模式对Linux系统时钟中断的影响。在没有配置高精度模式时,hrtimer的超时在系统时钟中断的轮循中检查,所以此时hrtimer的定时精度(jiffy)还是以轮循的间隔为单位,精度与传统的时间轮定时器一样。在配置高精度模式后,hrtimer的超时由struct clock_event_device的超时中断完成。clock_event_device一般来说描述的都是一个硬件定时器,其定时精度由硬件定时器决定,比如我的板子上的此定时器参数为:Timer at Vir:0xE0100200 = Phy:0xE0100200, using Irq:27, at Freq:250000000,可见其精度之高:250MHz,这也是高精度时钟这个名称的由来。
- struct clock_event_device {
- const char *name;
- unsigned int features;
- u64 max_delta_ns;
- u64 min_delta_ns;
- u32 mult;
- u32 shift;
- int rating;
- int irq;
- const struct cpumask *cpumask;
- int (*set_next_event)(unsigned long evt,
- struct clock_event_device *);
- void (*set_mode)(enum clock_event_mode mode,
- struct clock_event_device *);
- void (*event_handler)(struct clock_event_device *);
- void (*broadcast)(const struct cpumask *mask);
- struct list_head list;
- enum clock_event_mode mode;
- ktime_t next_event;
- unsigned long retries;
- };
下面简要介绍一下在配置了高精度模式之后hrtimer的实现细节。
1. 添加hrtimer
在配置高精度模式后,添加hrtimer也是由函数hrtimer_start完成,这与没有配置高精度模式时一样。但是,高精度模式时,如果添加的hrtimer在红黑树的最左边一个节点,即要添加的hrtimer是将会第一个到期的hrtimer时,那么这时会调用子函数hrtimer_enqueue_reprogram重新设置clock_event_device的超时中断。hrtimer_enqueue_reprogram hrtimer_reprogram tick_program_event tick_dev_program_event clockevents_program_event struct clock_event_device * pDev->set_next_event比如我的平台的clock_event_device的定义如下:
- static struct clock_event_device timer0_clockevent = {
- .name = "my_timer_evt",
- .features = CLOCK_EVT_FEAT_PERIODIC,
- .set_mode = my_set_mode,
- .set_next_event = my_set_next_event,
- .rating = 300,
- .cpumask = cpu_all_mask,
- };
其中timer_set_next_event主要是设置硬件设备的相关registers.
Linux hrtimer的实现Linux hrtimer分析--未配置高精度模式相关资讯 Linux内核
- IT人员必须了解的六项Linux内核变 (今 12:05)
- Linux 内核更新:3.10.98、3.14.62 (02月26日)
- Linux:让手机运行主线内核 (11/26/2015 22:16:17)
| - Linux内核自防护项目 (05月24日)
- Linux 内核架构的理解 (12/09/2015 09:01:01)
- Linux内核被指缺乏安全性 (11/07/2015 08:28:47)
|
本文评论 查看全部评论 (0)