Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算CAN总线速度_C - Fatal编程技术网

计算CAN总线速度

计算CAN总线速度,c,C,我需要验证和描述我们产品的CAN总线通信量(称之为测试单元UUT)。我有一台机器,可以将指定数量的罐架发送到我们的产品。我们的产品运行基于Linux的定制内核。CAN帧是使用特定算法在发送机上预先内置的软件。UUT使用该算法来验证接收到的帧。 另外,这里是我的问题所在,我试图计算UUT软件中的一些计时数据。所以我基本上是尽可能快地做一个读循环。我有一个预分配的缓冲区来存储帧,所以我只需调用read并递增指向缓冲区的指针: clock_gettime(clocK_PROCESS_CPUTI

我需要验证和描述我们产品的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算法)。 此外,在时间实用程序下运行程序与我的时间一致。例如,我的程序名为tcan,因此我可能会运行 [提示]$time./tcan can1-nf 10000

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

然后,我使用时间差来计算得到的数据传输速度。我在时间跨度内收到了num_帧,因此我计算每秒帧数和每秒比特数

我得到的总线速度是每秒250000位CAN总线速度的10倍。这怎么可能?根据我的程序和时间程序(以及top实用程序),我只能获得2.5%的CPU利用率。
我计算的值有意义吗?我能做些更好的事吗?我假设,由于时间报告的实时时间远大于user+sys,所以一定有一些时间损失。另一种可能是,也许这是正确的,我不知道,这令人费解

这有点遥不可及,但如果read()返回得很早,因为否则它将不得不等待传入的数据,该怎么办?要读取的最快数据是零:)

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

希望这能有所帮助