Linux 內核定時器使用 二 高精度定時器 hrtimer 的用例【轉】


轉自:https://blog.csdn.net/fuyuande/article/details/82193600

之前介紹了timer_list內核定時器,它的精度在毫秒級別,再高一點它就無能為力了,所幸內核提供了高精度定時器 hrtimer。

源文件在linux/kernel/hrtimer.c中。接口簡單。下面介紹一下相關接口

  1. 1. 定時器定義與綁定超時回調函數
  2. static struct hrtimer timer;
  3.  
  4. /* 設置回調函數 */
  5. timer.function = hrtimer_hander;
  6.  
  7. 2. 定時器初始化
  8. /*
  9. * 參數timer是hrtimer指針,
  10. * 參數clock_id有如下常用幾種選項:
  11. * CLOCK_REALTIME //實時時間,如果系統時間變了,定時器也會變
  12. * CLOCK_MONOTONIC //遞增時間,不受系統影響
  13. * 參數mode有如下幾種選項:
  14. * HRTIMER_MODE_ABS = 0x0, /* 絕對模式 */
  15. HRTIMER_MODE_REL = 0x1, /* 相對模式 */
  16. HRTIMER_MODE_PINNED = 0x02, /* 和CPU綁定 */
  17. HRTIMER_MODE_ABS_PINNED = 0x02, /* 第一種和第三種的結合 */
  18. HRTIMER_MODE_REL_PINNED = 0x03, /* 第二種和第三種的結合 */
  19. */
  20. void hrtimer_init( struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode);
  21.  
  22. 3. 定時器啟動
  23. /*
  24. * 參數timer是hrtimer指針
  25. * 參數tim是時間,可以使用ktime_set()函數設置時間,
  26. * 參數mode和初始化的mode參數一致
  27. */
  28. hrtimer_start( struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);
  29.  
  30. 4. 設置時間
  31. /*
  32. * 單位為秒和納秒組合
  33. */
  34. ktime_t ktime_set(const long secs, const unsigned long nsecs);
  35.  
  36. /* 設置超時時間,當定時器超時后可以用該函數設置下一次超時時間 */
  37. hrtimer_forward_now( struct hrtimer *timer, ktime_t interval)
  38.  
  39. 5. 注意事項:
  40. 定時器超時后會調用回調函數,回調函數結構類似這樣:
  41. enum hrtimer_restart (*function)(struct hrtimer *);
  42.  
  43. enum hrtimer_restart {
  44. HRTIMER_NORESTART, /* 不重啟定時器 */
  45. HRTIMER_RESTART, /* 重啟定時器 */
  46. };
  47. 在回調函數返回前要手動設置下一次超時時間。
  48. 另外,回調函數執行時間不宜過長,因為是在中斷上下文中,如果有什么任務的話,最好使用工作隊列等機制。
  49.  
  50. 6. 關閉定時器
  51. int hrtimer_cancel( struct hrtimer *timer);
  52.  
  53. 簡單用例:
  54. /*
  55. * Description : 高精度定時器用例
  56. * Author : mason
  57. * Date : 201808
  58. */
  59.  
  60. #include <linux/module.h>
  61. #include <linux/kernel.h>
  62. #include <linux/hrtimer.h>
  63. #include <linux/jiffies.h>
  64.  
  65. static struct hrtimer timer;
  66. ktime_t kt;
  67.  
  68. /* 定時器回調函數 */
  69. static enum hrtimer_restart hrtimer_hander(struct hrtimer *timer)
  70. {
  71. printk( "hrtimer up\r\n");
  72.  
  73. /* 設置下次過期時間 */
  74. kt = ktime_set( 3,0);
  75. hrtimer_forward_now(timer, kt);
  76.  
  77. /* 該參數將重新啟動定時器 */
  78. return HRTIMER_RESTART;
  79. }
  80.  
  81. static int __init hrtimer_demo_init(void)
  82. {
  83. printk( "hello hrtimer \r\n");
  84.  
  85. kt = ktime_set( 1,10);
  86.  
  87. /* hrtimer初始化 */
  88. hrtimer_init(&timer,CLOCK_MONOTONIC,HRTIMER_MODE_REL);
  89.  
  90. /* hrtimer啟動 */
  91. hrtimer_start(&timer,kt,HRTIMER_MODE_REL);
  92.  
  93. /* 設置回調函數 */
  94. timer.function = hrtimer_hander;
  95.  
  96. return 0;
  97. }
  98.  
  99. static void __exit hrtimer_demo_exit(void)
  100. {
  101. /* hrtimer注銷 */
  102. hrtimer_cancel(&timer);
  103. printk( "bye hrtimer\r\n");
  104. }
  105.  
  106.  
  107. module_init(hrtimer_demo_init);
  108. module_exit(hrtimer_demo_exit);
  109. MODULE_LICENSE( "GPL");
  110.  

參考文檔 :

1. Linux 下定時器的實現方式分析

https://www.ibm.com/developerworks/cn/linux/l-cn-timers/

2. hrtimer高精度定時器的簡單使用【學習筆記】

https://www.cnblogs.com/zzb-Dream-90Time/p/7084916.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM