This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3352:AM335x DCAN 问题(TX;echo_skb 被占用)

Guru**** 2924210 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1646417/am3352-am335x-dcan-issue-tx-echo_skb-is-occupied

器件型号: AM3352

我们的一款产品中的电路板遇到问题、该电路板使用 AM335x MPU 通过 CAN(特别是 AM3352BZCZA60)与外设通信。 有时、在 CAN TX 端具有重负载的情况下(上下文:我们通过 CANopen CiA 302 对其中一个外设进行 DFUing、即进行块下载、因此 TX 上每个块有 128 条消息)、我们注意到在 TX 端似乎停止工作之前、DCAN 驱动程序发出以下消息:

kernel: c_can_platform 481cc000.can can0: can_put_echo_skb: BUG! echo_skb 29 is occupied!

我们正在运行一个相对较新的驱动程序版本 (6.1.46-ti-r19)、这是否是此 MPU/外设的已知软件问题、或者是否对此器件/此版本的 DCAN 进行了任何可能导致该问题的勘误表?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Michael 和 Anshu /TI:

    Michael 和我在离线时交换了一些电子邮件、我想请您注意以下事项:

    [TI/CY]

    您看到的内容

    您粘贴的 à can_put_echo_skb 消息:bug! echo_skb 29 已占用!

    是当驱动程序尝试在仍在使用的每个‑Ω 套接字‑缓冲区中放置新的传输“回显“ skb 时、Linux CAN 网络协议栈生成的。  在 AM335x(包括您注意到的 AM3352BZCZA60)上、DCAN 驱动器分配一个固定的‑μ s 大小的回波缓冲区(默认为 32 个条目)。  ‑、当您基本上“淹没“ CAN 总线时、可能会导致驱动程序因为在每个块上下载 128 个 CANopen 帧(这实际上是相当多的)、因为没有回声时隙就会出现这个错误。

     我认为我们是一致的。

     查看已知的 TI 勘误表

    • AM335x DCAN 勘误表 
      ‑我们至少在此时还没有明确找到在驱动程序回波缓冲区耗尽时可能导致内部 FIFO 停滞的勘误表、从而导致您观察到内核级别错误、但仍有一些权变措施可供尝试和测试。

     软件‑侧面修复/解决方法‑解决方法

    1. ‑回波 μ 缓冲区大小
      驱动程序将曝光

    echo_skb_max 模块‑(或器件树中的 echo_skb_cnt 字段)。 将其从默认的 32 提升 到 64 或 128 可为驱动程序提供足够的插槽、以实现高‑吞吐量 CANopen 块下载。  (这实际上可能是一个很好的快速测试)

    #如果驱动程序是作为模块构建的

    modprobe ti_dcancan echo_skb_max=128

    ‑、在使用设备树时、添加(或修改)属性:

    dcan0:CAN@481cc000{

       状态=“正常“;

       echo-skb-max =<128>;

       /*其他属性*/

    };

    1. 增加网络‑器件 TX 队列长度
      CAN 网络器件的 tx_queue_len 默认为 10。 提高它使内核在丢弃数据包之前有更多的空间,并可以降低达到回波‑缓冲区限制的可能性:IP 链路集 CAN0 txqueueelen 200
    2. 应用上游 Linux 补丁(强烈建议)
      主‑线路 Linux 内核(v5.15 及更高版本)包含一个补丁、为 AM335x DCAN 驱动程序添加了运行时检查和更大的默认回波缓冲区(根据内部知识搜索结果,此处显示 commit 63c9a0f9“ti-dcan:将默认回声‑skb 池增加到 64 个条目“)。 ‑您使用 TI‑提供的“kernel‑ti“树(此更改早于此更改)、则可以升级到更新的“kernel‑ti“版本(例如 5.15‑ti‑2024‑03)或手动返回 移植补丁。
    3. 调节 CANopen 块下载
      ‑无法更改驱动程序或硬件、请考虑减小突发大小(例如,每个块发送 64 帧、而不是 128 帧)  、或者插入较小的 1 μ s 间帧延迟(≈1ms)、以便驱动程序有时间回收回波时隙。  这可能是另一个很好的快速测试、只是为了测试前后的行为。
    4. 验证器件修订版本
      运行 TI‑提供的 ti-evm-info 实用程序或读取/sys/bus/platform/devices/481cc000.dcan/revision.中的修订字段 根据我们的内部搜索结果、如果器件为版本 0x2 或更低版本、硬件勘误表仍然适用。 对于版本 0x4+、此问题不应在上述驱动程序更改后出现。

    针对您的产品的建议措施

    1. 检查器件版本 –?
    2. 将内核 ‑到‑支持的最新版本(或至少为 v5.15‑ti‑2024 03)。
    3.    通过模块参数或 DTS 配置更大的回波缓冲区(64–128 个条目)。
    4. 增加 CAN0 上的 TX 队列长度。
    5. 重新测试 DFU CANopen 块下载。 使用较大的回波池时、“echo_skb… 已占用“错误应消失。

    如果在应用上述步骤后您仍然看到消息、请告知我们内核版本、器件版本和您使用的确切驱动程序参数、我们可以深入了解(例如,启用驱动程序调试跟踪)。

    【迈克尔】  

    感谢您的详细答复。 澄清您提到的一些事项:

    1. 我们正在运行 6.1.46-ti-r19 内核、因此据我所知、应该拥有大多数最新补丁、但是否有我可以检查的存储库以确保 100%确定?
    2. Im 因 echo_skb_max 参数(dts 或模块参数)而感到有点困惑、因为我没有看到可以配置的指示。 根据我对驱动程序的读数、它与与硬件 (64 / 2 ie 32) 对齐的 TX_ring 对齐、如果我对其中的内容有误解、您能纠正我吗?
    3. 我们执行第二个建议、即增加 txqueuelen、以便软件可以缓冲我们发送的所有消息、但这个错误似乎是一个非常填充的软件 txqueue 和驱动程序消耗它来放入硬件消息对象的问题
    4. 如果没有其他解决方案、我们希望避免使用#4(限制 DFU)。 只是担心如果我们不能完全理解问题,我们将再次遇到它,只是较少/更随机
    5. 之前的版本可能存在哪些勘误? 我们可以尝试查看故障单位的版本。
    6. 还没有 E2E、我将尝试尽快打开一个

    [TI/CY ]  

    1. gotcha–每个版本的发行说明(甚至在 TI.com 上)都显示了内核版本:  2.1.版本说明—Processor SDK Linux for AM335X 文档
    2. 对于 echo_skb_max 参数的假设、您可能是正确的。  我们可以检查这一点,并纠正任何不准确的陈述,我们可能昨天晚上。
    3. 我懂了。  
    4. 也很理解。  商定的工作让我们尝试确定根本原因。
    5. 这也是我们要考虑的问题–昨晚的首次通过并没有显示任何必然有定论的内容(但 E2E 会在这里提供帮助)
    6. E2E 确实有助于直接与我们的 Sitara 产品和应用团队(而不仅仅是我们的现场支持团队成员)短路此咨询。  如果可以、请立即开始设计。

    Anshu 任何额外的意见欢迎和赞赏!

    CY、
    CY

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好克里斯,迈克尔,

    AM335x 上的 CAN 没有流控制功能、因此好像您使用的是 DFU、这将用数据泛洪 CAN。

    您使用的比特率是多少? 对于一个实验、请尝试将比特率减半以查看是否出现缓冲区溢出问题。

    此外、使用 CAN 总线分析仪查看总线上的输出消息和时序。 查看接收端是否以足够快的速度接收消息会很有帮助。

    根据勘误表、我在勘误表列表中没有看到任何内容: https://www.ti.com/lit/pdf/sprz360

    commit 63c9a0f9 “ti-dcan:将默认 echo‑skb 池增加到 64 个条目“

    我无法找到您所指的此承诺。 您能提供一个链接吗? 如果仅为内部 TI 员工、请通过电子邮件发送。

    TI‑提供了早于此更改的“kernel‑ti“树、升级到更新的“kernel‑ti“

    我也找不到关于这一点的任何信息。 TI Linux 内核的命名约定是 ti-kernel-X.X.y、如下所示: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/?h=ti-linux-6.1.y

    此致、

    Anshu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们以 1Mbps 的速率运行、但很难降低比特率、因为总线上有很多器件、在这种速度下运行的某些固件很难改变比特率。 此外、不幸的是、我们还无法在实验室中重现问题;只能在某些现场单元上观察到问题(但会在受影响的单元上造成重大问题)。 因此、由于此问题、我们无法在总线上进行 CAN 探头。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael:

    是否可以降低 DFU 速度? 您通过 DFU 发送的数据有多大?

    是否有任何其他可能更改的变量?

    请注意、支持团队和我明天将离开办公室、直到假期后的下周。

    此致、

    Anshu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们可能会减慢发送 CAN 消息的速度;但这感觉就像是掩盖了问题而不是解决问题。 我认为发送的典型数据大小为 100KiB;不过、在最多 127 条消息的块中(因此每个块 889 字节的数据)。 如前所述、由于我们无法在实验中重新创建它、因此很难收集有关错误发生时具体情况的更多数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael:

    我们将回顾明天是否有任何其他可能性、并返回给您。

    谢谢、

    Anshu  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael:

    根据您描述的内容、正在更新的设备无法跟上进入设备 RX 的 CAN 流量。  

    同一总线上还有多少个其他 CAN 器件?  

    在运行 DFU 过程时、您能否停止与同一 CAN 总线上的其他器件通信? 这可能会消除总线上的一些变量和流量。

    这样、DFU 过程可能是完成的最佳机会。

    只是为了确认、您使用的是 RT Linux 内核吗?

    此致、

    Anshu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Im 不知道为什么我们认为器件无法跟上发展步伐;尽管器件需要处理块下载时需要延迟、但在需要确认块时也会出现延迟。

    CAN 总线上有 6 个器件。 如前所述、遗憾的是、我们无法在实验室中重新出现问题、因此无法从总线移除器件。 它可能同时从另一台设备接收消息、但我们还无法捕获该数据。

    否、我们实际上内核使用 Preempt Not Preempt_RT。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael:

    [quote userid=“699794“ url=“~/support/processors-group/processors/f/processors-forum/1646417/am3352-am335x-dcan-issue-tx-echo_skb-is-occupied echo_skb 29 已占用!

    对于所有返回此错误的产品、这是否在第 29 个套接字缓冲区中持续发生?

    此致、

    Anshu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    从日志中、我看到它并不总是 29、但一直在列表的末尾 (29、30)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael:

    由于您提到无法移除 CAN 总线上的其他器件、因此除了接收 DFU 的器件之外、是否有一种机制可以停止与总线上的其他器件通信? 如果可能的话,我想减少比赛条件的可能性。

    谢谢、

    Anshu