实时创建一个免费运行的计时器linux

时间:2014-03-25 06:47:25

标签: c linux timer timestamp rtos

我正在研究实时linux并希望创建一个免费运行的计时器。但我无法找到有关实时Linux的信息。有人可以建议我一些文件,或者有人可以告诉我如何创建一个自由运行的高精度计时器??

成就:创建一个自由运行的计时器后,我可以获得时间戳值。

1 个答案:

答案 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微秒。