我需要验证和表征我们产品的CAN总线流量(称为被测单元,UUT)。我有一台机器,可以发送指定数量的can帧到我们的产品。我们的产品运行的是基于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,基于套接字的接口,BTW)
然后,我使用时间差来计算我获得的数据传输速度。我在时间跨度内收到num_frames,因此我计算每秒的帧数和每秒的位数
我得到的总线速度是CAN总线速度(每秒250000位)的10倍。这怎么可能呢?根据我的程序和time程序(以及top实用程序),我只能获得2.5%的CPU利用率。我计算的值有意义吗?有什么更好的我可以做的吗?我假设,由于time报告的实时时间比user+sys大得多,所以一定有一些时间会计丢失了。另一种可能性是,也许它是正确的,我不知道,它令人费解。
发布于 2012-12-07 11:13:52
这有点冒险,但是如果read()提前返回,因为否则它必须等待传入的数据,那该怎么办呢?读取速度最快的数据根本就是none :)
这会打乱计时,但你有没有试过在错误检查的同时做这个循环?或者通过recv()实现循环,除非你要求它不要阻塞?
希望这能有所帮助。
https://stackoverflow.com/questions/13756012
复制相似问题