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);

  1. /* linux/drivers/ker-driver.c
  2. * Author: Woodpecker <Pecker.hu@gmail.com>
  3. *
  4. * kernel-driver
  5. *
  6. * This file is subject to the terms and conditions of the GNU General Public
  7. * License.  See the file COPYING in the main directory of this archive for
  8. * more details.
  9. *
  10. */
  11. #include <linux/module.h>     /* MODULE_LICENSE     */
  12. #include <linux/kernel.h>     /* printk,pr_info     */
  13. #include <linux/errno.h>      /* EINVAL,EAGAIN,etc. */
  14. #include <linux/err.h>            /* IS_ERR             */
  15. #include <linux/fb.h>         /* FB header file     */
  16. #include <linux/init.h>           /* module_init        */
  17. #include <linux/semaphore.h>  /* init_MUTEX APIs    */
  18. #include <linux/mm.h>         /* vm_area_struct     */
  19. #include <linux/dma-mapping.h>  /* DMA APIs             */
  20. #include <linux/delay.h>      /* mdelay,msleep      */
  21. #include <linux/hrtimer.h>
  22. #include <linux/time.h>           /* struct timespec    */
  23. #define KER_PRINT(fmt, ...) printk("<ker-driver>"fmt, ##__VA_ARGS__);
  24. static struct hrtimer vibe_timer;
  25. static struct work_struct vibe_work;
  26. static void vibe_work_func(struct work_struct *work)
  27. {
  28. KER_PRINT("vibe_work_func:msleep(50)/n");
  29. msleep(50); /* CPU sleep */
  30. }
  31. static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer)
  32. {
  33. struct timespec uptime;
  34. do_posix_clock_monotonic_gettime(&uptime);
  35. KER_PRINT("Time:%lu.%02lu/n",
  36. (unsigned long) uptime.tv_sec,
  37. (uptime.tv_nsec / (NSEC_PER_SEC / 100)));
  38. KER_PRINT("vibrator_timer_func/n");
  39. schedule_work(&vibe_work);
  40. return HRTIMER_NORESTART;
  41. }
  42. static int __init ker_driver_init(void)
  43. {
  44. int value = 2000;   /* Time out setting,2 seconds */
  45. struct timespec uptime;
  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. INIT_WORK(&vibe_work, vibe_work_func);  /* Intialize the work queue */
  57. return 0;
  58. }
  59. static void __exit ker_driver_exit(void)
  60. {
  61. hrtimer_cancel(&vibe_timer);
  62. }
  63. module_init(ker_driver_init);
  64. module_exit(ker_driver_exit);
  65. MODULE_AUTHOR("Woodpecker <Pecker.hu@gmail.com>");
  66. MODULE_DESCRIPTION("Kernel driver");
  67. MODULE_LICENSE("GPL");

驱动的运行结果:

hrtimer和work工作队列的使用的更多相关文章

  1. Linux下的hrtimer高精度定时器【转】

    转自:http://blog.csdn.net/waverider2012/article/details/38305785 hrtimer高精度定时器的interval由ktime_set(cons ...

  2. linux下jiffies定时器和hrtimer高精度定时器【转】

    本文转载自:http://blog.csdn.net/dosculler/article/details/7932315 一.jiffies定时器,HZ=100,精度只能达到10ms. 注:采用jif ...

  3. 工作队列(workqueue) create_workqueue/schedule_work/queue_work

    --- 项目需要,在驱动模块里用内核计时器timer_list实现了一个状态机.郁闷的是,运行时总报错"Scheduling while atomic",网上搜了一下:" ...

  4. 第3.3 案例2: 工作队列 job queue

    第2个案例就是工作队列,典型的点对点的消息,一个Producer发送一个工作消息到队列去,具有Listener类的Consumer能够从工作队列中获得一个工作情况的消息,这个消息被这个消费者消费掉之后 ...

  5. 【译】RabbitMQ:工作队列(Work Queue)

    在第一篇我们写了两个程序通过一个命名的队列分别发送和接收消息.在这一篇,我们将创建一个工作队列在多个工作线程间分发耗时的工作任务. 工作队列的核心思想是避免立刻处理资源密集型任务导致必须等待其执行完成 ...

  6. rabbitmq消息队列——"工作队列"

    二."工作队列" 在第一节中我们发送接收消息直接从队列中进行.这节中我们会创建一个工作队列来分发处理多个工作者中的耗时性任务. 工作队列主要是为了避免进行一些必须同步等待的资源密集 ...

  7. RabbitMQ入门教程——工作队列

    什么是工作队列 工作队列是为了避免等待一些占用大量资源或时间操作的一种处理方式.我们把任务封装为消息发送到队列中,消费者在后台不停的取出任务并且执行.当运行了多个消费者工作进程时,队列中的任务将会在每 ...

  8. RabbitMQ官方中文入门教程(PHP版) 第二部分:工作队列(Work queues)

    工作队列 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序.在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Works ). 工作队列 ...

  9. RabbitMQ 工作队列

    创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务,然后必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送给队列.工作进 ...

随机推荐

  1. Oracle-数据库

    Oracle 1.特点 关系型数据库 采用二维表的行使管理数据库 具有行和列  表间存在关联关系 2.安装 数据库(11g) 版本类型 32位    64位  安装类型 桌面类 本机开发 服务器类 生 ...

  2. csuoj 1112: 机器人的指令

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1112 1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit:  ...

  3. length() 和 size()

    length() 和 size() ==>length() 是针对数组字符串说的 size() 是针对 泛型集合的

  4. CCF真题之日期计算

    201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: 1) 年份是4的整数倍,而且不是100的整数倍: 2 ...

  5. 3D语音天气球(源码分享)——完结篇

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 由于这篇文章是本系列最后一篇,有必要进行简单的回顾和思路整理. 这个程序是由两 ...

  6. PAT乙级 1003. 我要通过!(20)

    答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1. ...

  7. yii2 render和renderPartial区别

    1.render()方法使用到项目中的布局layout,renderPartial()不使用布局

  8. 蒙地卡罗法求 PI

    问题: 蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名.蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考 ...

  9. android 开发(百度地图)

    百度地图开放平台:http://lbsyun.baidu.com/ 百度地图API:http://developer.baidu.com/map/reference/ Android地图SDK 百度地 ...

  10. mysql笔记04 MySQL高级特性

    MySQL高级特性 1. 分区表:分区表是一种粗粒度的.简易的索引策略,适用于大数据量的过滤场景.最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分 ...