0

我需要为我们的产品验证和表征 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);

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

在具有 10000 帧的 can1 套接字上运行。(这是 FlexCAN,基于套接字的接口,顺便说一句)

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

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

4

1 回答 1

0

这是一个很长的镜头,但是如果 read() 提前返回怎么办,否则它将不得不等待传入的数据?读取速度最快的数据根本没有:)

它会打乱时间,但是您是否尝试过在错误检查时执行此循环?或者通过 recv() 实现循环,除非你要求它不要这样做,否则它应该阻塞?

希望这会有所帮助。

于 2012-12-07T03:13:52.147 回答