计算CAN总线速度

时间:2012-12-07 02:21:17

标签: c

我需要验证和表征我们产品的CAN总线流量(称之为被测单元,UUT)。我有一台机器可以向我们的产品发送指定数量的罐架。我们的产品运行基于Linux的自定义内核。 CAN帧使用特定算法在发送方机器上预先构建软件。 UUT使用该算法来验证接收的帧。 此外,这里是我的问题所在,我正在尝试计算UUT软件中的一些时序数据。所以我基本上尽可能快地做一个读循环。我有一个预先分配的缓冲区来存储帧,所以我只是调用read并将指针递增到缓冲区:

    clock_gettime(clocK_PROCESS_CPUTIME_ID,  timespec_start_ptr);
    while ((frames_left--) > 0)
        read(can_sock_fd, frame_mem_ptr++, sizeof(struct can_frame));  

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID,  timespec_stop_ptr);

我的问题与我在计算这两个时间规格的差异时得到的时间有关(我使用的计算是正确的,我已经验证了它,它是GNU算法)。 此外,在时间实用程序下运行程序与我的时间一致。例如,我的程序叫做tcan,所以我可能会运行 [提示] $ time ./tcan can1 -nf 10000

在10000帧的can1套接字上运行。 (这是FlexCAN,基于套接字的接口,BTW)

然后,我使用时差来计算我获得的数据传输速度。我在时间跨度内收到了num_frames,所以我计算帧数/秒和比特/秒

我的总线速度是每秒250000位CAN总线速度的10倍。怎么会这样?根据我的程序和时间程序(以及顶级实用程序),我只获得2.5%的CPU利用率。 我正在计算的值是否有意义?我能做些什么更好的事情吗?我假设由于时间报告的实际时间比user + sys大得多,因此必须在某处丢失一些时间会计。另一种可能性是,它可能是正确的,我不知道,这是令人费解的。

1 个答案:

答案 0 :(得分:0)

这是一个很长的镜头,但是如果read()提前返回会怎样,否则它将不得不等待传入的数据?要读取的最快数据是完全没有:)

这会弄乱时间,但你是否尝试过这种循环,同时进行错误检查?或者通过recv()实现循环,除非你不要求它,否则应该阻止它?

希望这有帮助。