首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算CAN总线速度

计算CAN总线速度
EN

Stack Overflow用户
提问于 2012-12-07 10:21:17
回答 1查看 746关注 0票数 0

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

代码语言:javascript
复制
    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大得多,所以一定有一些时间会计丢失了。另一种可能性是,也许它是正确的,我不知道,它令人费解。

EN

回答 1

Stack Overflow用户

发布于 2012-12-07 11:13:52

这有点冒险,但是如果read()提前返回,因为否则它必须等待传入的数据,那该怎么办呢?读取速度最快的数据根本就是none :)

这会打乱计时,但你有没有试过在错误检查的同时做这个循环?或者通过recv()实现循环,除非你要求它不要阻塞?

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13756012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档