我正在研究实时linux并希望创建一个免费运行的计时器。但我无法找到有关实时Linux的信息。有人可以建议我一些文件,或者有人可以告诉我如何创建一个自由运行的高精度计时器??
成就:创建一个自由运行的计时器后,我可以获得时间戳值。
答案 0 :(得分:0)
使用实时Linux的全部意义在于它是Linux - 所有现有的Linux和POSIX服务都可用,如果可移植性是一个可以避免使用专有的非POSIX OS服务问题 - 否则你也可以使用真正的RTOS。
标准函数clock()
在POSIX上的CLOCKS_PER_SEC
为1000000(即微秒)。但实际粒度取决于实现。您可以使用以下命令检查系统:
#include <time.h>
#include <stdio.h>
int main()
{
clock_t t0 = clock() ;
clock_t t1 = t0 ;
while( t0 == t1 )
{
t1 = clock() ;
}
printf( "Clock granularity = %lf seconds\n", (double)(t1 - t0)/(double)(CLOCKS_PER_SEC) ) ;
return 0 ;
}
在ideone.com上,这给出了以下结果:
Clock granularity = 0.010000 seconds
即。为10ms。
如果这还不够,则定义了许多时钟源用于clock_gettime()
,每个时钟源的分辨率可由clock_getres()
确定。时钟ID CLOCK_PROCESS_CPUTIME_ID
可能是合适的。请注意,此处的分辨率和粒度也不相同。我在ideone.com上进行了以下测试:
#include <time.h>
#include <stdio.h>
int main()
{
struct timespec t0 ;
struct timespec t1 ;
clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &t0) ;
t1 = t0 ;
while( t0.tv_nsec == t1.tv_nsec )
{
clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &t1) ;
}
printf( "Clock granularity = %lf seconds\n", (double)(t1.tv_nsec - t0.tv_nsec)/1e9 ) ;
struct timespec res ;
clock_getres( CLOCK_PROCESS_CPUTIME_ID, &res ) ;
printf( "CPUTIME resolution = %.15lf seconds\n", e, (double)(res.tv_nsec)/1e9) ;
return 0 ;
}
结果:
Clock granularity = 0.000001 seconds
CPUTIME resolution = 0.000000001000000 seconds
因此粒度为1微秒。