序言Linux高精度定时器说明Linux高精度定时器驱动编撰
初始化定时器工作模式:hrtimer_init(&kthread_timer,CLOCK_MONOTONIC,HRTIMER_MODE_REL);
设置定时器的反弹函数:kthread_timer.function=hrtimer_cb_func;
启动定时器:hrtimer_start(&kthread_timer,ktime_set(HRTIMER_TEST_CYCLE),HRTIMER_MODE_REL);
在定时器反弹函数中,降低定时到期时间:hrtimer_forward(timer,timer->base->get_time(),ktime_set(HRTIMER_TEST_CYCLE));
#include "hrtimer_test.h"
#define HRTIMER_TEST_PIN 7
#define HRTIMER_TEST_CYCLE 0, (100000 / 2)
#define DEVICE_NAME "HRTIMER_TEST"
#define CLASS_NAME "HRTIMER_TEST"
int major_number;
struct device *device;
struct class *class;
static struct hrtimer kthread_timer;
int value = 0;
enum hrtimer_restart hrtimer_cb_func(struct hrtimer *timer) {
ChipBspGpio_ExportSet(ULTRASONIC_TEST_PIN, value);
value = !value;
hrtimer_forward(timer, timer->base->get_time(), ktime_set(HRTIMER_TEST_CYCLE));
return HRTIMER_RESTART;
}
void kthread_hrtimer_init(void) {
hrtimer_init(&kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
kthread_timer.function = hrtimer_cb_func;
hrtimer_start(&kthread_timer, ktime_set(HRTIMER_TEST_CYCLE), HRTIMER_MODE_REL);
}
static int __init hrtimer_test_init(void) {
printk(KERN_ALERT "hrtimer_test : Init !!n");
major_number = register_chrdev(0, DEVICE_NAME, NULL);
if (major_number < 0) {
printk(KERN_ALERT "hrtimer_test: Register fail!n");
return major_number;
}
printk(KERN_ALERT "Registe success, major number is %dn", major_number);
class = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(class)) {
unregister_chrdev(major_number, DEVICE_NAME);
return PTR_ERR(class);
}
device = device_create(class, NULL, MKDEV(major_number, 0), NULL, DEVICE_NAME);
if (IS_ERR(device)) {
class_destroy(class);
unregister_chrdev(major_number, DEVICE_NAME);
return PTR_ERR(device);
}
printk(KERN_ALERT "hrtimer_test: init success!!n");
kthread_hrtimer_init();
return 0;
}
static void __exit hrtimer_test_exit(void) {
hrtimer_cancel(&kthread_timer);
device_destroy(class, MKDEV(major_number, 0));
class_unregister(class);
class_destroy(class);
unregister_chrdev(major_number, DEVICE_NAME);
printk(KERN_ALERT "hrtimer_test: exit success!!n");
}
module_init(hrtimer_test_init);
module_exit(hrtimer_test_exit);
MODULE_AUTHOR("RieChen");
MODULE_LICENSE("GPL");
Linux高精度定时器的评测
周期1ms评测:
#define HRTIMER_TEST_CYCLE 0, (1000000 / 2)
周期100us评测:
#define HRTIMER_TEST_CYCLE 0, (100000 / 2)
周期10us评测:
#define HRTIMER_TEST_CYCLE 0, (10000 / 2)
周期1us评测:
#define HRTIMER_TEST_CYCLE 0, (1000 / 2)
总结
Linux提供的高精度定时器可以满足我们大部份需求的linux usb驱动程序开发,要注意的的linux通配符,定时器反弹函数不能做太多任务,并须要快速执行,否则难以保证其周期性。(作者觉得高精度定时器可以看作一个外部中断的思想进行处理)
通过这次评估,Linux提供的高精度定时器可以满足我的项目需求,并且建议几十毫秒级的需求使用比较合适,假如几微秒的需求不适宜。
通过评估数据上看,DS100Mini数字示波器可以代替通常的台式示波器。
DS100Mini数字示波器可以在大部份场景上使用,可以满足项目需求
关注陌陌公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者陌陌,备注”入群“linux usb驱动程序开发linux 电子书,便可约请步入技术交流群。