歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux hrtimer分析--配置高精度模式

Linux hrtimer分析--配置高精度模式

日期:2017/2/28 15:55:14   编辑:Linux教程

本文介紹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,這也是高精度時鐘這個名稱的由來。

  1. struct clock_event_device {
  2. const char *name;
  3. unsigned int features;
  4. u64 max_delta_ns;
  5. u64 min_delta_ns;
  6. u32 mult;
  7. u32 shift;
  8. int rating;
  9. int irq;
  10. const struct cpumask *cpumask;
  11. int (*set_next_event)(unsigned long evt,
  12. struct clock_event_device *);
  13. void (*set_mode)(enum clock_event_mode mode,
  14. struct clock_event_device *);
  15. void (*event_handler)(struct clock_event_device *);
  16. void (*broadcast)(const struct cpumask *mask);
  17. struct list_head list;
  18. enum clock_event_mode mode;
  19. ktime_t next_event;
  20. unsigned long retries;
  21. };

下面簡要介紹一下在配置了高精度模式之後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的定義如下:

  1. static struct clock_event_device timer0_clockevent = {
  2. .name = "my_timer_evt",
  3. .features = CLOCK_EVT_FEAT_PERIODIC,
  4. .set_mode = my_set_mode,
  5. .set_next_event = my_set_next_event,
  6. .rating = 300,
  7. .cpumask = cpu_all_mask,
  8. };

其中timer_set_next_event主要是設置硬件設備的相關registers.

Copyright © Linux教程網 All Rights Reserved