2012-12-07 90 views
0

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

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); 

我的问题,当我计算在这两个的区别与时代我可以做timespecs(我使用的计算是正确的,我已经验证了它,它是GNU算法)。 此外,在时间实用程序下运行该程序与我的时代一致。例如,我的程序被称为tcan,因此我可能运行 [提示] $ time ./tcan can1 -nf 10000

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

然后,我使用时间差来计算获得的数据传输速度。我在时间范围内收到了num_frames,所以我计算帧/秒和位/秒我得到的总线速度是CAN总线速度的10倍,每秒250000比特。怎么会这样?根据我的程序和时间程序(以及顶级实用程序),我只获得2.5%的CPU利用率。 我计算的值是否有意义?有什么更好的我可以做吗?我假设,由于时间报告的实际时间比用户+ sys大得多,因此必须在某处丢失一些时间记帐。另一种可能性是,也许这是正确的,我不知道,这是令人费解的。

回答

0

这是一个很好的例子,但是如果read()返回的时间早,否则它将不得不等待传入的数据?最快的数据读取是根本没有:)

它会弄乱时间,但你有没有尝试做这个循环,同时错误检查?或者通过一个recv()来实现循环,除非你不要求它会被阻塞?

希望这会有所帮助。