#include #include #include #include static void m_udelay(int us,struct timespec *start, struct timespec *end) { ktime_get_ts( start ); udelay( us ); ktime_get_ts( end ); } static void m_udelay_ir(int us,struct timespec *start, struct timespec *end) { static spinlock_t mylock; spin_lock_irq( &mylock ); ktime_get_ts( start ); udelay( us ); ktime_get_ts( end ); spin_unlock_irq( &mylock ); } static void m_usleep(int us,struct timespec *start, struct timespec *end) { ktime_get_ts( start ); usleep_range( us, us ); ktime_get_ts( end ); } static void m_msleep(int ms,struct timespec *start, struct timespec *end) { ktime_get_ts( start ); msleep( ms ); ktime_get_ts( end ); } static void loop( void (*messure)(int,struct timespec*, struct timespec*),int tm) { unsigned long i, diff, mean, shortest=0x7fffffff, highest=0; struct timespec start; struct timespec end; unsigned long before_us, after_us; for (i=0, mean=0; i<1000; i++) { messure( tm, &start, &end ); before_us = (start.tv_sec*1000000)+(start.tv_nsec/1000); after_us = (end.tv_sec*1000000)+(end.tv_nsec/1000); diff = after_us - before_us; mean += diff; if (diff > highest) highest = diff; if (diff < shortest) shortest = diff; } mean = mean / i; printk("shortest: %ld mean: %ld highest: %ld\n", shortest, mean, highest); return; } static int __user mod_init( void ) { struct sched_param schedpar; loop( m_udelay, 15 ); loop( m_udelay_ir, 15 ); loop( m_udelay_ir, 100 ); loop( m_usleep, 15 ); schedpar.sched_priority = 99; sched_setscheduler( current, SCHED_FIFO, &schedpar ); loop( m_usleep, 15 ); loop( m_usleep, 100 ); sched_setscheduler( current, SCHED_NORMAL, &schedpar ); loop( m_usleep, 110000 ); loop( m_msleep, 10 ); loop( m_msleep, 15 ); loop( m_msleep, 18 ); loop( m_msleep, 24 ); loop( m_msleep, 50 ); loop( m_msleep, 100 ); loop( m_msleep, 110 ); return -EIO; } static void __exit mod_exit( void ) { return; } module_init( mod_init ); module_exit( mod_exit ); MODULE_LICENSE("GPL");