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.

[参考译文] AM3894:EMAC 接收阈值中断设置

Guru**** 2553450 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/618626/am3894-emac-receive-threshold-interrupt-setup

器件型号:AM3894

AM389x TRM (SPRUGX7C)介绍了以下有关 EMAC 接收阈值中断的信息:  

  • 接收阈值中断使用与流控制相同的自由缓冲器计数和阈值逻辑、但中断与流控制是独立启用的。 阈值中断旨在向主机指示特定通道的资源正在运行低电平。

我想在 我的设计中添加接收阈值通知(不带流控制)、该设计目前仅对接收通道实施接收数据包完成中断、以避免 EMAC 耗尽可用的 Rx 缓冲区(导致 HOSTPEND 错误)。  但是、到目前为止、我尝试使用 Rx 阈值功能的尝试未成功。


根据 TRM 中的指令、看起来应该相当简单。 为了按照 我的理解使用、配置 Rx 阈值功能所需的步骤如下:

  1. 用为接收通道分配的 Rx 缓冲器总数初始化接收通道 n 空闲缓冲器计数寄存器(RXnFREEBUFFER)。
  2. 通过 RXnFLOWTHRESH 寄存器建立触发阈值。
  3. 使能 接收中断屏蔽置位寄存器(RXINTMASKSET)中的接收通道中断位、该位已经为接收数据包完成中断完成。
  4. 通过 CMRXTHRESHINTEN 寄存器启用中断。

设置所有这些之后(包括修改我的代码以针对主机回收的每个缓冲区更新 RxnFREEBUFFER)、我可以看到 RxnFREEBUFFER 按预期更新(EMAC 正在使用缓冲区、主机正在回收缓冲区)。  但是、即使 RXnFLOWTHRESH 缓冲器设置为人为的高阈值、也不会看到 CMRXTHRESHINTSTAT 寄存器指示通道上的 Rx 阈值条件。  是否缺少一些设置步骤?

谢谢!


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

    您检查 CMRXTHRESHINTSTAT 寄存器是否存在挂起的中断、但 MACINVECTOR 寄存器会怎么样? 您是否还可以检查该寄存器中是否存在挂起中断?

    您正使用的8个通道中的哪一个? 或者您正在使用所有这些器件?

    RX_THRES_PEND [7:0]中断位在启用时有效、并且当通道的相关接收通道 n 自由缓冲区计数寄存器(RXnFREEBUFFER)小于或等于通道的相关接收通道 n 流量控制阈值寄存器(RXnFLOWTHRESH)时有效。

    首先验证是否启用了中断、然后验证 RXnFREEBUFFER 寄存器的值是否小于或等于 RXnFLOWTHRESH 的值。

    您是否还能提供相关寄存器的寄存器转储(地址和值)? 在配置时进行转储、然后在预期发生中断时进行转储。

    CMRXTHRESHINTEN
    CMRXTHRESHINTSTAT
    MACINVECTOR
    RXINTMASKSET
    RXnFLOWTHRESH
    RXnFREEBUFFER


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

    我们仅使用通道0。

    以下是您请求的寄存器转储。 第一组设置在配置后立即进行、第二组设置在我启动了我认为应该触发 Rx 阈值中断的条件之后进行。 (对于本实验、我分配了256个 Rx 缓冲器、并将 Rx 阈值人为设置为255 (最大值)、以确保中断能够在不花费太多的精力的情况下触发)。

    INIT 后的寄存器值:
    --------------------------
    CMRXTHRESHINTEN:0x00000001
    CMRXTHRESHINTSTAT:0x00000000
    MACINVECTOR: 0x00000000
    RXINTMASKSET: 0x00000001
    RX0FLOWTHRESH:0x000000FF
    RX0FREEBUFFER:0x00000100

    应导致 Rx 阈值中断的条件下的寄存器值
    ------------------------------------------------------
    CMRXTHRESHINTEN:0x00000001
    CMRXTHRESHINTSTAT:0x00000000
    MACINVECTOR: 0x00000001
    RXINTMASKSET: 0x00000001
    RX0FLOWTHRESH:0x000000FF
    RX0FREEBUFFER:0x000000FA

    Rx 数据包完成中断工作可靠、但我从未见过 Rx 阈值中断激活。

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

    您是否使用 AM389x EZSDK? 您是否还可以在列表中添加寄存器 MACEOIVECTOR 以及寄存器转储。

    在读取 CMRXTHRESHINTSTAT 寄存器以检查中断是否发生之前、请确保某些代码段不清除位0 (从1到0)。

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

    我们不使用 AM389x EZSDK。 我们将 VxWorks 6.9与已针对硬件定制的 ti_dm81xx_EVM BSP 的修改版本配合使用。 但是、VxWorks 仅管理我们系统中的 EMAC0。 EMAC1由我们自己的自定义“驱动程序”直接管理,该驱动程序基本基于 Spectrum Digital 提供的 DM816x 测试代码。 我们从 evm816x_BSL\evm816x\tests\emac_loopback\emac_gmii_test.c 中找到的代码开始、并对其进行了调整、以便用作 VxWorks 任务、该任务为 EMAC1提供服务。 我当前没有连接任何 ISR 或为 Rx 阈值中断启用任何 ISR、因此据我所知、不应该有任何代码访问 CMRXTHRESHINTSTAT 寄存器。

    这里是这些寄存器转储、这次包含了 MACEIVECTOR 值:

    INIT 后的寄存器值:
    --------------------------
    CMRXTHRESHINTEN:0x00000001
    CMRXTHRESHINTSTAT:0x00000000
    MACINVECTOR:0x00000000
    MACEOIVECTOR: 0x00000001
    RXINTMASKSET:0x00000001
    RX0FLOWTHRESH:0x000000FF
    RX0FREEBUFFER:0x00000100

    应导致 Rx 阈值中断的条件下的寄存器值
    ------------------------------------------------------
    CMRXTHRESHINTEN:0x00000001
    CMRXTHRESHINTSTAT:0x00000000
    MACINVECTOR:0x00000001
    MACEOIVECTOR: 0x00000001
    RXINTMASKSET:0x00000001
    RX0FLOWTHRESH:0x000000FF
    RX0FREEBUFFER:0x000000F6

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

    Shane、

    [引用 user="Shane Hargrove">但是,VxWorks 仅管理我们系统中的 EMAC0。 EMAC1由我们自己的自定义“驱动程序”直接管理,该驱动程序基本基于 Spectrum Digital 提供的 DM816x 测试代码。[/报价]

    对于 EMAC0和 EMAC1、您是否观察到此问题?

    [引用 user="Shane Hargrove">我们从 evm816x_BSL\evm816x\tests\emac_loopback\emac_gmii_test.c 中找到的代码开始,并对其进行了调整,以用作 VxWorks 任务,该任务为 EMAC1提供服务。 我当前没有连接任何 ISR 或为 Rx 阈值中断启用任何 ISR、因此据我所知、不应该有任何代码访问 CMRXTHRESHINTSTAT 寄存器。 [/报价]

    我不熟悉 VxWorks 代码库、因此我无法确认没有任何内容清除暂挂的中断。

    [引用用户="Shane Hargrove">RX0FLOWTHRESH:0x000000FF
    RX0FREEBUFFER:0x00000100[/QUERP]

    您能否尝试使用以下寄存器设置、是否有任何差异?

    RX0FLOWTHRESH:0x000000FA

    RX0FREEBUFFER:0x0000010F

    [引用用户="Shane Hargrov"] RXINTMASKSET:0x00000001[/QUERT]

    您是否还可以在列表中添加 RXINTMASKCLEAR 寄存器以及寄存器转储。

    此致、
    帕维尔

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

    您是否问我们是否曾在 EMAC0上看到过 HOSTPEND 条件? 如果是这样,答案是否定的,我不认为是这样。 但是、VxWorks 网络堆栈任务的运行优先级比用户应用任务高、因此它们不太可能遇到这种类型的问题。 此外、我们使用 EMAC1的方式与 EMAC0完全不同。 EMAC1用作"背板"以太网接口、通过链路层消息直接与板上的另一个处理器进行通信、而 EMAC0是典型的外部 LAN 接口。

    但是、我确实检查了用于 TI EMAC 的 VxWorks 终端驱动程序、该驱动程序包含在我们的 BSP 中、希望找到一个示例、说明如何处理 Rx 阈值中断、但似乎没有实现该中断。 我只在驱动程序代码中发现 Rx 和 Tx 数据包中断的处理、因此没有什么可与之比较的。

    我非常确信 VxWorks 不会操纵我们系统中的 EMAC1寄存器。 该接口已在操作系统中禁用、因此我们可以直接通过应用代码对其进行控制。

    您指定的 RX0FLOWTHRESH 和 RX0FREEBUFFER 值是否有任何特殊之处? (我假设您希望使用0x0000010F 作为 RX0FREEBUFFER 的初始值、因为该值在初始化后会动态变化、对吧?) 我可能需要做一些额外的工作来建立这个实验。 在我的当前测试设置中、我最多只能以一个速率将数据以导致 RX0FREEBUFFER 和 RX0FLOWTHRESH 之间的差值大约为9的速率发送到 EMAC (根据我的观察结果)。 这就是我将阈值设置得如此高的原因。 要实现21的增量、需要一些时间和我目前无法访问的其他设备。

    RXINTMASKCLEAR 始终为0x00000001。

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

    [报价用户="Shane H"]您是否问我们是否曾在 EMAC0上看到过 HOSTPEND 条件?[/QUERP]

    不,我不是。 我询问的是 Rx 阈值中断条件。

    [引用 USER="Shane H]但是、我确实检查了我们的 BSP 中包含的 TI EMAC 的 VxWorks 终端驱动程序、希望找到一个示例、说明如何处理 Rx 阈值中断、但似乎没有实现该中断。 我只在驱动程序代码中发现 Rx 和 Tx 数据包中断的处理、因此没有什么可与之比较的。 [/报价]

    我还检查了 AM389x EZSDK (u-boot、Linux 内核)和 TI EVM EMAC 诊断测试、但未实现 Rx 阈值中断。

    [引用 USER="SHANE H]您指定的 RX0FLOWTHRESH 和 RX0FREEBUFFER 值是否有任何特殊之处? (我假设您希望使用0x0000010F 作为 RX0FREEBUFFER 的初始值、因为该值在初始化后会动态变化、对吧?) 我可能需要做一些额外的工作来建立这个实验。 在我的当前测试设置中、我最多只能以一个速率将数据以导致 RX0FREEBUFFER 和 RX0FLOWTHRESH 之间的差值大约为9的速率发送到 EMAC (根据我的观察结果)。 这就是我将阈值设置得如此高的原因。 要实现21的增量、需要一些时间、而且我目前无法访问的其他设备也需要一些时间。

    我的想法是隔离一些计时问题、当 Rx 阈值中断条件对系统来说发生得太快、从而导致丢失时。 对于该用例、9之间的差值应该是可以的、例如:

    RX0FLOWTHRESH:0x000000F7

    RX0FREEBUFFER:0x00000100

    此致、
    帕维尔

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

    感谢您检查 EZSDK 和 TI EVM EMAC 诊断测试源代码。 我想知道是否有任何 TI 驱动程序实现了该特定中断。

    您的想法对我来说很有意义...我当时的想法完全相同。 不过、这就是我决定使用小增量(小至1)而不是较大增量的原因、以便更容易触发阈值中断、并且可能会在这种情况下保持更长的时间。 TRM 状态:"接收阈值中断是在主机清除触发条件之前保持有效的电平中断。" 我对这种情况的思考不正确吗?

    谢谢、
    Shane