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.

[参考译文] TMS570LC4357:以太网控制器(EMAC)和接收时新的未记录竞争条件

Guru**** 2589810 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/734628/tms570lc4357-ethernet-controller-emac-and-new-undocumented-race-condition-on-receive

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我已经描述了与此 主题中相同的 EMAC 硬件竞态条件

如果您在测试中使用 LwIP、则不会看到此问题、因为 LwIP EMAC 驱动程序已实施解决方法、即在添加到链之前等待 EOQ。

在实践中、此延迟会占用大量时间(在我们的实时系统中使用的时间太多)。  我们解决的权变措施是、当新的 CPPI 描述符链接到活动的 CPPI 描述符时、我们启用数据包完成中断。  然后、当数据包完成时、中断触发、如果 EMAC 已停止、ISR 将重新启动。

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

     上面提到的 LwIP 代码。

    具有 lwIP 演示的 HALCoGen EMAC 驱动程序/v00.03.00/TMS570LC43x/HALCoGen-TMS570LC43x/SOURCE /HL_EMAC.c:1427

    /*等待 EOQ 位被置位*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    /* SAFETYMCUSW 134 S MR:12.2 "LDRA 工具问题"*/
    /* SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
    while (EMAC_BUF_DESC_EOQ!=(EMACSwizleData (CURR_BD->flags_pktlen)& EMAC_BUF_DESC_EOQ)
    {
    } 

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

    此演示代码不会将新描述符附加到现有列表中。 它一直等到 EOQ 并启动新的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我同意您的分析。  我的问题是、为什么以这种方式实施 LwIP 驱动程序、因为技术参考中没有提到要求这种行为。  相反、如果只检查一次 EOQ (根据技术参考中的建议)、演示是否继续工作?  在我的实验中、有一个与读取 EOQ 相关的竞态条件、其中 EOQ 将在读取时取消置位(但稍后会置位)、并导致链中止

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

    TRM 表示 EMAC 支持将数据包附加到现有列表的功能。 为了避免竞争条件、SW 应检查缓冲区描述符标志。

    在应用程序通过修补指针将附加描述符附加到列表之前,EMAC 可能会在瞬间将描述符的“下一个”指针读取为 NULL。 这种情况由软件应用程序处理、软件应用程序始终检查所有 EOP 数据包的缓冲区描述符标志、查找称为队列末尾(EOQ)的特殊标志。

    当软件应用程序看到 EOQ 标志置位时、应用程序可以在此时将新列表指针写入启动该过程的同一 HDP、从而提交新列表或附加列表中错过的部分。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价用户="QJ Wang "]当软件应用程序看到 EOQ 标志集时,应用程序可以在此时通过将新列表指针写入启动该过程的相同 HDP 来提交新列表或附加列表中错过的部分。

    问题是软件应用程序何时可以看到 EOQ 标志被置位。  LwIP 解决方案是在 EOQ 被置位前暂停、但这种延迟对于我们的实时应用来说太大了-等待的特征似乎是数据传输的时间、对于一个1500字节的帧@ 100Mbps 将是120us。

    我们找到的唯一解决方案是在数据包传输中断时检查 EOQ。

     

     

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

    我基于通过我们的 HAlCoGen 生成的 LWIP 演示代码测试了 EMAC。 您能否共享您的代码以便我可以在工作台上进行测试?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我附加了一个补丁文件。

    e2e.ti.com/.../7838.patch.txt

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

    在 LWIP 演示中、使用了 hdkif.c 中的函数、而不是 HL_EMAC.c.中的函数 您是否也更改了 hdkif.c 中的代码? 这是否是使它们正常工作的唯一改变? 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、我不确定你的项目为什么使用 hdkif.c、当我使用 RM57x/build-RM57x 时、它使用 HL_EMAC.c、但下面是 hdkif.c 信息:

    hdkif.c 中的注释表明我所关注的代码被称为变通办法(第329行注释)

    hdkif.c @第327行

    否则{
    CURR_BD = txch->ACTIVE_TAIL;
    /* TODO:(这是一种权变措施)等待 EOQ 位置位*/
    while (EMAC_BUF_DESC_EOQ!=(hdkif_swingle_data (CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOQ));
    /* TODO:(这是一种权变措施)在 TXHD0变为零之前不要写入 TXHDP0 */
    while (0!=*((UINT32 *) 0xFCF78600);
    CURR_BD->NEXT = hdkif_swinging_TxP (ACTIVE_HEAD);
    if (EMAC_BUF_DESC_EOQ =>(hdkif_swimming_data (CURR_BD->flags_pktlen)& EMAC_BUF_DESC_EOQ)){
    /*写入标头描述符指针并启动 DMA */
    EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(unsigned int)(active_head)、0);
    }
    

    补丁:

    @@@@ lwIP 演示的 HALCoGen EMAC 驱动程序/v00.03.00/lwip-1.4.1/ports/HDK/netif/hdkif.c "2018-11-14 13:55:86521.364850 -0800 +++"HALCoGen EMAC 驱动程序带有 lwIP 演示/v00.03.008/lwik/lwip.1.4+1.4+14:1h/lwik-0800/lw13:314.0800+14:24/lwif 3k/lwif -0800+1.4k/lwif -0800+++14:24/lwif -0800+14:24/
    *将 BD 连接起来。 如果 DMA 引擎已经到达链的末尾、
    *将设置 EOQ。 在这种情况下、应再次写入 HDP。
    //
    -否则{
    + else if (EMAC_BUF_DESC_EOQ =>(hdkif_swingle_data (CURR_BD->flags_pktlen)& EMAC_BUF_DESC_EOQ)}{
    CURR_BD = txch->ACTIVE_Tail;
    -/* TODO:(这是一种权变措施)等待 EOQ 位被设置*/
    - while (EMAC_BUF_DESC_EOQ!=(hdkif_swiming_data (CURR_BD->flags_pkkEOen)和 EMAC_BUF_DEV_TOQ);
    /* TODO:(这是一种权变措施)在 TXHD0变为零之前不要写入 TXHDP0 */
    while (0!=*((UINT32 *) 0xFCF78600);
    CURR_BD->NEXT = hdkif_swinging_TxP (ACTIVE_HEAD);
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Stephen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    警告! EMAC 中有两种不同的 EOQ 竞争条件。
    一个在发送中、另一个在接收数据片段队列中类似。
    请参阅我原来的文章 e2e.ti.com/.../2576160
    我们能够重复这两种情况。

    问题是、我们的驱动程序被大量修改。 我们不使用原始中断函数(对于我们的中断函数限制而言、这些函数太重、它映射到 RTOS 处理事件)。 我们的驱动程序支持多个存储器片段队列以实现多个数据包优先级(802.1q 标签)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Jiri Dobry">警告! EMAC 中有两种不同的 EOQ 竞争条件。

    我同意、RX 和 TX 链都具有此竞态条件。  我首先关注的是 TX 案例、因为它更容易引起。

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

    我们的 SW 团队计划在2019年第1季度研究代码并更新驱动程序。 只要有新的驱动程序可用、我就会通知您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我们不需要新的驱动程序。 我们有自己的、因为默认情况下不支持所有必要的功能(例如零复制数据流和不同优先级的多个 RX/TX 队列)。
    但我们需要确认这两个错误、分析并推荐解决方法。