tempad
ReadyGo!技术成就梦想 >>Linux >> Linux操作系统下实时定时器posix_timer

Linux操作系统下实时定时器posix_timer

ReadyGo!技术成就梦想 网络搜索 efish 2008-8-31 13:38:35

其实Linux下还有一种高精度的定时器,那就是posix_timer。原理上来说,可以在变频的时候也使用rdtsc指令,因为CPU的频率我们也是知道的,变频的时候内核也是知道的。

下面是我的timer_create的例子,编译的时候要加上rt库,这是linux的realtime库:

gcc -o test test.c #include #include #include #include #include #define rdtsc(low,high) __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) timer_t tt; void handler (int sig, siginfo_t * extra, void *cruft) ...{ static last_i=0; unsigned int i, j; rdtsc(i,j); printf ("time:%u, %u, %uHZ ", j, i, i-last_i, (i-last_i)*10/1000000); last_i = i; } int main () ...{ int i=0; sigset_t sigset; sigfillset (&sigset); sigdelset (&sigset, SIGRTMIN); sigprocmask (SIG_SETMASK, &sigset, NULL); struct sigaction sa; sigfillset (&sa.sa_mask); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; if (sigaction (SIGRTMIN, &sa, NULL) < 0) ...{ perror ("sigaction failed "); exit (-1); } struct sigevent timer_event; struct itimerspec timer; timer.it_interval.tv_sec = 0; timer.it_interval.tv_nsec = 100 * 1000 * 1000; timer.it_value = timer.it_interval; timer_event.sigev_notify = SIGEV_SIGNAL; timer_event.sigev_signo = SIGRTMIN; timer_event.sigev_value.sival_ptr = (void *) &tt; if (timer_create (CLOCK_REALTIME, &timer_event, &tt) < 0) ...{ perror ("timer_create failed"); exit (-1); } if (timer_settime (tt, 0, &timer, NULL) < 0) ...{ perror ("timer_settime failed"); exit (-1); } while (i++ < 10) ...{ pause (); } return 0; }

输出结果:

time:166081, 1934350847, 2163HZ time:166081, 2120528291, 1861HZ time:166081, 2306679576, 1861HZ time:166081, 2494695630, 1880HZ time:166081, 2680865389, 1861HZ time:166081, 2867018473, 1861HZ time:166081, 3053152230, 1861HZ time:166081, 3239309935, 1861HZ time:166081, 3425467261, 1861HZ time:166081, 3611639266, 1861HZ

(责任编辑:云子)

责任编辑: efish 参与评论 查找更多:
相关文章
学习园地:编译Linux系统内核的方法步骤 (1) 学习园地:编译Linux系统内核的方法步骤 (1)
虚拟机中RH9 2.4内核升级为2.6内核方法 虚拟机中RH9 2.4内核升级为2.6内核方法
高手进阶:Linux系统下驱动程序框架概述 高手进阶:Linux系统下驱动程序框架概述
Linux2.4内核和2.6内核对Initrd处理流程 Linux2.4内核和2.6内核对Initrd处理流程
如何自己动手做一个迷你型Linux操作系统 (1) 如何自己动手做一个迷你型Linux操作系统 (1)
2.6.24内核编译 initrd-2.6.24.img分析 2.6.24内核编译 initrd-2.6.24.img分析
新手学堂:Linux系统下使用net send工具 新手学堂:Linux系统下使用net send工具
Linux系统下如何删除某个目录下大量文件 Linux系统下如何删除某个目录下大量文件
Linux系统Fcitx中文输入法开机启动方法 Linux系统Fcitx中文输入法开机启动方法
Slackware开机 出现lost interrupt错误 Slackware开机 出现lost interrupt错误
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想