hrtimer和work工作队列的使用
来源:互联网 发布:联合国条约数据库 编辑:程序博客网 时间:2024/06/05 15:33
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);
5 例子代码
#include <linux/module.h> /* MODULE_LICENSE */ #include <linux/kernel.h> /* printk,pr_info */ #include <linux/errno.h> /* EINVAL,EAGAIN,etc. */ #include <linux/err.h> /* IS_ERR */ #include <linux/fb.h> /* FB header file */ #include <linux/init.h> /* module_init */ #include <linux/semaphore.h> /* init_MUTEX APIs */ #include <linux/mm.h> /* vm_area_struct */ #include <linux/dma-mapping.h> /* DMA APIs */ #include <linux/delay.h> /* mdelay,msleep */ #include <linux/hrtimer.h> #include <linux/time.h> /* struct timespec */ #define KER_PRINT(fmt, ...) printk("<ker-driver>"fmt, ##__VA_ARGS__); static struct hrtimer vibe_timer; static struct work_struct vibe_work; static void vibe_work_func(struct work_struct *work) { KER_PRINT("vibe_work_func:msleep(50)/n"); msleep(50); /* CPU sleep */ } static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer) { struct timespec uptime; do_posix_clock_monotonic_gettime(&uptime); KER_PRINT("Time:%lu.%02lu/n", (unsigned long) uptime.tv_sec, (uptime.tv_nsec / (NSEC_PER_SEC / 100))); KER_PRINT("vibrator_timer_func/n"); schedule_work(&vibe_work); return HRTIMER_NORESTART; } static int __init ker_driver_init(void) { int value = 2000; /* Time out setting,2 seconds */ struct timespec uptime; KER_PRINT("ker_driver_init/n"); hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); vibe_timer.function = vibrator_timer_func; hrtimer_start(&vibe_timer, ktime_set(value / 1000, (value % 1000) * 1000000),HRTIMER_MODE_REL); //static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) 第一个参数为秒,第二个为纳秒 do_posix_clock_monotonic_gettime(&uptime); KER_PRINT("Time:%lu.%02lu/n", (unsigned long) uptime.tv_sec, (uptime.tv_nsec / (NSEC_PER_SEC / 100))); INIT_WORK(&vibe_work, vibe_work_func); /* Intialize the work queue */ return 0; } static void __exit ker_driver_exit(void) { hrtimer_cancel(&vibe_timer); } module_init(ker_driver_init); module_exit(ker_driver_exit); MODULE_AUTHOR("Woodpecker <Pecker.hu@gmail.com>"); MODULE_DESCRIPTION("Kernel driver"); MODULE_LICENSE("GPL");
6 测试结果
0 0
- hrtimer和work工作队列的使用
- hrtimer和work工作队列的使用
- hrtimer和work工作队列的使用
- hrtimer和work工作队列的使用
- Hrtimer定时器以及等待队列的使用
- hrtimer的简单使用 + 原理和实现
- hrtimer的简单使用 + 原理和实现
- hrtimer的简单使用 + 原理和实现
- hrtimer定时器的使用
- hrtimer的简单使用
- linux: work工作队列
- 工作队列work queue
- 实例探讨工作队列(work queue)的工作原理
- linux work queue工作队列小结与使用
- linux work queue工作队列小结与使用
- Linux work queue工作队列小结与使用
- Linux 工作队列( Work Queue)
- Nuttx 工作队列 work queue
- Redis在win7上的可视化应用
- 113. Path Sum II
- (转)本地通知和远程推送
- jdk1.8下dubbo-admin启动失败
- GDI+图形图像-----C#
- hrtimer和work工作队列的使用
- QT:使用C++还是QML
- 【leetcode】111. Minimum Depth of Binary Tree【java】
- 图像处理之局部二值特征
- Python爬虫_基础
- 百度地图坐标转换API和地图API
- c++ 学习之:bitset
- iOS 对源代码进行混淆
- PHP中spl_autoload_register函数的用法 ---转载自http://www.cnblogs.com/myluke/archive/2011/06/25/2090119.html