【原创】一个小示例测试动态链接对实时性的影响
以下示例为测量函数调用时间,读取时间戳本身操作的耗时忽略。
/* 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测试要舍去前几次预热值的原因。

浙公网安备 33010602011771号