hrtimer高精度定时器的interval由ktime_set(const long secs, const unsigned long nsecs)决定,可做到ns级。此处的例子为5ms interval:
#include
#include
#include
#include
MODULE_LICENSE("GPL");
staticstructhrtimer hr_timer;
staticstructwork_struct wq_hrtimer;
staticktime_t ktime;
staticunsignedintinterval=5000;/* unit: us */
structtimespec uptimeLast;
staticunsignedintcount=0;
#define COUNT_INTERVAL 4000
unsigned longlongdiff_tv(structtimespec start,structtimespec end) {
return(end.tv_sec-start.tv_sec)*1000000000+(end.tv_nsec-start.tv_nsec);
}
enumhrtimer_restart my_hrtimer_callback(structhrtimer *timer )
{
schedule_work(&wq_hrtimer);
returnHRTIMER_NORESTART;
}
staticvoidwq_func_hrtimer(structwork_struct *work)
{
structtimespec uptime;
hr_timer.function = my_hrtimer_callback;
ktime = ktime_set( interval/1000000, (interval%1000000)*1000 );
hrtimer_start(&hr_timer, ktime, HRTIMER_MODE_REL );
/* print time every COUNT_INTERVAL*interval second*/
if(count%COUNT_INTERVAL==0)
{
do_posix_clock_monotonic_gettime(&uptime);
printk(KERN_INFO"hrtimer:%9lu sec, %9lu ns, interval_delay=%lu ns\n&#