当先锋百科网

首页 1 2 3 4 5 6 7
 

1.hrtimers - 为高分辨率kernel定时器,可作为超时或周期性定时器使用

1). hrtimer_init初始化定时器工作模式。

 hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 vibe_timer.function = vibrator_timer_func;

 

 static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer)

 注:该回调函数为原子操作不能被中断

 

2). hrtimer_start的第二个参数用于设置超时参数。
  hrtimer_start(&vibe_timer,
  ktime_set(value / 1000, (value % 1000) * 1000000),HRTIMER_MODE_REL);

 

3). INIT_WORK初始化工作队列。

  INIT_WORK(&vibe_work, vibe_work_func);

  static void vibe_work_func(struct work_struct *work)

 

4). schedule_work调用工作队列。

  schedule_work(&vibe_work);

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1.   
  2.   
  3. #include <linux/module.h>       
  4. #include <linux/kernel.h>       
  5. #include <linux/errno.h>        
  6. #include <linux/err.h>              
  7. #include <linux/fb.h>           
  8. #include <linux/init.h>             
  9. #include <linux/semaphore.h>    
  10. #include <linux/mm.h>           
  11. #include <linux/dma-mapping.h>    
  12. #include <linux/delay.h>        
  13. #include <linux/hrtimer.h>   
  14. #include <linux/time.h>             
  15.   
  16. #define KER_PRINT(fmt, ...) printk("<ker-driver>"fmt, ##__VA_ARGS__);  
  17. static struct hrtimer vibe_timer;  
  18. static struct work_struct vibe_work;  
  19.   
  20. static void vibe_work_func(struct work_struct *work)  
  21. {  
  22.     KER_PRINT("vibe_work_func:msleep(50)/n");  
  23.     msleep(50);   
  24. }  
  25.   
  26. static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer)   
  27. {             
  28.     struct timespec uptime;  
  29.       
  30.     do_posix_clock_monotonic_gettime(&uptime);  
  31.     KER_PRINT("Time:%lu.%02lu/n",  
  32.             (unsigned long) uptime.tv_sec,  
  33.             (uptime.tv_nsec / (NSEC_PER_SEC / 100)));  
  34.       
  35.     KER_PRINT("vibrator_timer_func/n");   
  36.     schedule_work(&vibe_work);  
  37.     return HRTIMER_NORESTART;  
  38. }  
  39.   
  40. static int __init ker_driver_init(void)  
  41. {  
  42.   
  43.     int value = 2000;     
  44.     struct timespec uptime;  
  45.       
  46.     KER_PRINT("ker_driver_init/n");  
  47.     hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);  
  48.     vibe_timer.function = vibrator_timer_func;  
  49.     hrtimer_start(&vibe_timer,  
  50.         ktime_set(value / 1000, (value % 1000) * 1000000),HRTIMER_MODE_REL);  
  51.       //static inline ktime_t ktime_set(const long secs, const unsigned long nsecs)  第一个参数为秒,第二个为纳秒
  52.     do_posix_clock_monotonic_gettime(&uptime);  
  53.     KER_PRINT("Time:%lu.%02lu/n",  
  54.             (unsigned long) uptime.tv_sec,  
  55.             (uptime.tv_nsec / (NSEC_PER_SEC / 100)));  
  56.   
  57.     INIT_WORK(&vibe_work, vibe_work_func);    
  58.     return 0;  
  59.   
  60. }  
  61.   
  62. static void __exit ker_driver_exit(void)  
  63. {  
  64.     hrtimer_cancel(&vibe_timer);  
  65. }  
  66.   
  67. module_init(ker_driver_init);  
  68. module_exit(ker_driver_exit);  
  69.   
  70. MODULE_AUTHOR("Woodpecker <[email protected]>");  
  71. MODULE_DESCRIPTION("Kernel driver");  
  72. MODULE_LICENSE("GPL");  

 

驱动的运行结果: