【原创】一个小示例测试动态链接对实时性的影响

以下示例为测量函数调用时间,读取时间戳本身操作的耗时忽略。

/* foo.c */
#define ONE_BILLION     1000000000
static inline long long diff_ts(struct timespec *left, struct timespec *right)
{
    return (long long)(left->tv_sec - right->tv_sec) * ONE_BILLION
        + left->tv_nsec - right->tv_nsec;
}

void call_timediff(struct timespec *start)
{
    struct timespec now;
    clock_gettime(CLOCK_MONOTONIC, &now);
    printf("time diff:%dns\n",(int32_t)diff_ts(&now, start));
    return;
}

/*main.c*/
int main(void) {
    ...
    while(!finished) {
        sleep(1);
        clock_gettime(CLOCK_MONOTONIC, &start);
        call_timediff(&start);
    }
	return 0;
}

将foo.c编译为动态库,然后运行main程序。

结果如下:

$./main
time diff:3857
time diff:718
time diff:768
time diff:735
time diff:756
time diff:799
time diff:765
......
time diff:706
time diff:657
time diff:669
time diff:676
time diff:690

可以看到动态链接需要us级时间,考虑一种情况,我们实时任务运行后,产生一个事件,这时是第一次调用动态库中的函数,函数第一次调用需要动态绑定,这就导致了时间的不确定性,这也是为什么在文章【原创】有利于提高xenomai 实时性的一些配置建议中,我们建议实时任务尽量使用静态库,latency测试要舍去前几次预热值的原因。

posted @ 2025-11-09 09:53  沐多  阅读(8)  评论(0)    收藏  举报