空燃比分析仪,horiba尾气分析仪,CAN总线分析仪,CAN数据记录仪

广州智维电子科技有限公司

Guangzhou Triv Electronic Technologies Co.LTD

技术服务
SUPPORT

目前位置: 首页 > 技术服务 > 技术资讯

2017-04-21

Kvaser 使用 CANlib 检测溢出情况

作者:admin    点击:2186

Kvaser CANlib 检测

如果您在开发过程中很依赖通信协议的软件应用程序,那么如何让应用程序快速地处理传入的报文,而不会丢弃报文就显得尤为关键了。

这种情况可能是由于应用程序花费太多时间处理某一报文,应用程序暂停等待用户交互,或者应用程序正在等待共享系统资源,如数据文件。不管什么原因,应用程序开发人员应计划检测这些丢弃的报文,以防止在由应用程序行为导致错误时搜索系统问题。

为了检测这个问题,CANlib 提供了几种机制来检查接收缓冲区状态和确定 CAN帧是否已经丢弃。

canRead 标志参

用于确定 CAN 帧是否已被丢弃的第一种方法是监视由 canRead 函数返回的标志参数。标志参数包含两个位,它们表示在此函数调用和和当前调用返回的最后一个报文之间是否发生软件或硬件溢出。

这些位被定义为用于硬件溢出的 canMSGERR_HW_OVERRUN 和用于软件溢出的 canMSGERR_SW_OVERRUN。你也可以使用 canMSGERR_OVERRUN 掩码同时检查这两种情况。

因此,当应用程序检查到这些位集中的一个时,应用程序就会获知在当前 CAN帧和接收的前一个 CAN 帧之间丢弃了报文。

要了解在使用软件的情况下如何显示,可假设一个接收缓冲区,它可容纳 10帧。(当然,CANlib 中的默认接收缓冲区大小远远大于10.)硬件已接收到 10 CAN 帧并将其放入可填入的缓冲区。

硬件接收到另一个 CAN 帧,但接收缓冲区已满,因此该帧未添加到缓冲区。

硬件接收到第 12 CAN 帧,覆盖未添加到缓冲区的帧。

应用程序调用 canRead 删除第一个接收的 CAN 帧,并为要添加到接收缓冲区的第 12 帧留下点。

1 10 CAN 帧在由 canRead 检索时不会指示溢出。 当第 11 帧丢弃,通过 canRead 从缓冲区检索时,第 12 CAN 帧将指示溢出。

canReadStatus

    用于确定CAN帧是否已被丢弃的第二种方法是调用 canReadStatus。如果设置了 canSTAT_HW_OVERRUN canSTAT_SW_OVERRUN 位,该函数返回的标志参数将指示溢出。你可以使用 canSTAT_OVERRUN 掩码检查这些溢出位是否已设置。

此状态信息是异步更新的,意味着 canReadStatus 返回的值是最后一次报告的值,但不一定是当前状态。要确保报告的数据是最新的,你可以以周期性速率调用 canRequestChipStatus canRequestChipStatus 要求更新状态信息,但是函数退出时信息不是最新的。调用完成后状态将是的当前的一段时间。

所以让我们拿前面的我们的完整的缓冲区以及硬件接收到第 11 个报文为例来说明。我们每秒调用 canRequestChipStatus 两次,每秒调用一次canReadStatus 

此时 canReadStatus 不会指示溢出。当硬件接收到第 12 CAN 帧覆盖未添加到缓冲区的帧时,芯片状态改变以指示溢出。

在下一个周期性 canRequestChipStatus 调用过程中报告该状态开始。当进程完成时,下一次调用canReadStatus将指示溢出。这意味着根据第 12 CAN 帧在canRequestChipStatuscanReadStatus调用的周期中到达的时间,canReadStatus调用将不会在事件(在本例中)后最多一秒钟指示状态。

一旦在 canReadStatus 调用的标志参数中指示溢出,状态将保持锁定状态,直到你使用 canIOCtl 例程与 canIOCTL_CLEAR_ERROR_COUNTERS 函数清除状态。这是为了防止应用程序由于检查到溢出和使用 canReadStatus 例程轮询状态之间的竞争情况而丢弃检测到的溢出。 

请求接收缓冲区级别

第三种方法是通过使用函数参数设置为canIOCTL_GET_RX_BUFFER_LEVEL canIoCtl 例程来监视接收缓冲区的当前深度。返回的缓冲区将是当前存储在接收缓冲区中的 CAN 帧的计数。

请记住,检查缓冲区级别所花费的时间实际上可能更好地用于清空接收缓冲区。在执行预定义块传输时,检查接收缓冲区级别可能更有用,其中应用程序可以等待直到在处理帧之前接收到整个块。 

操作有后果

你可能会注意到,当使用最后两个方法(canReadStatuscanIOCTL_GET_RX_BUFFER_LEVEL)之一时,如果缓冲区已满并处于溢出状态,则在以下调用canRead中指示溢出状态。要在这些方法中检索数据,接收队列必须置于稳定状态,以便可以检查整个队列。在此过程中,由于缺少空间,可能在驱动程序和应用程序缓冲区之间报文被丢弃。此丢弃是由在使用canRead 检索的下一个 CAN 帧上的溢出状态指示。 

结论

应用程序开发人员应该在 canRead() 处理期间始终检测丢弃的报文,以防止在由应用程序行为导致错误时搜索系统问题。你的应用程序设计可能会对 CAN 总线上的流量造成问题,这是你的第一条指示。使用此方法进行监视将有助于确定在握手报文丢弃或预期的周期性报文超时时故障发生在何处。虽然你可以使用单独的工具来监视总线上所需的报文,但监视溢出标志将指示你的应用程序节点是最终原因或至少有风险。

你可以使用 canRead 溢出信息来跟踪溢出的频率。当流量带宽由于报文突发而增加时,这可以识别应用的可能问题。

当在 GUI 上指示当前溢出状态或向用户发出重要报文可能已被丢弃的警告时,使用 canReadStatus 方法。

当你愿意停止 GUI 或其他进程时,将使用检查接收缓冲区级别,以便在达到特定大小后专门计算资源立即清空缓冲区——防止发生溢出。一个这样的情况是闪烁节点。

返回列表