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.

[参考译文] AM6442:停止调用来自 FPGA 的旧中断。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called

器件型号: AM6442

大家好!

目前、我们正在使用基于 Processor SDK Linux v9.2 的 Linux 验证配备 AM64x 的定制电路板上的 PCIe 根复合体功能。

FPGA 连接为端点器件。
在 Linux 上、FPGA 被正确识别为 PCIe 端点器件、我们能够访问其 PCIe 配置空间和 BAR。
接下来、我们正在尝试验证是否可以检测来自 FPGA 的旧中断。

为了验证传统中断检测、我们使用以下方法:
我们使用该pci_alloc_irq_vectors()函数向 FPGA 分配了一个旧中断向量、
已使用检索相应的 Linux IRQ 编号pci_irq_vector()
并向注册了处理程序函数、request_irq()以便在 IRQ 发生时进行调用。
当我们从 FPGA 触发一次传统中断时、我们确认已成功调用寄存的处理程序函数。

但是、当我们以大约一秒的间隔从 FPGA 重复触发传统中断时、
处理程序函数被调用一定次数、
但之后、它就不再被调用了。
这一“特定数字“并不一致、而且每次重复都有变化。

我们检查了 Linux 源代码后发现、当发生传统中断时、
j721e_pcie_legacy_irq_handler()pci-j721e-host.c调用中的函数、
在该函数内、将触发与分配给 FPGA 的中断向量相对应的 IRQ。
参考资料:
https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/pci/controller/cadence/pci-j721e-host.c?h=ti-rt-linux-6.1.y

我们向j721e_pcie_legacy_irq_handler()函数添加了 LOG 输出、
并观察到、当来自 FPGA 的旧中断被反复触发时、
日志输出出现在处理程序函数停止被调用的位置。
在该点之后、未观察到进一步的 LOG 输出。
因此,我们认为注册的处理程序函数停止被调用的原因
j721e_pcie_legacy_irq_handler()函数本身不再被调用。

我们想提出以下两个问题:

[问题 1]
当 PCIe 端点器件触发传统中断时、
预计j721e_pcie_legacy_irq_handler()中的函数pci-j721e-host.c会被调用是正确的
软件开发工具?

[问题 2]
当端点器件重复触发传统中断时、
j721e_pcie_legacy_irq_handler()函数最终停止被调用。
这种现象的可能原因是什么?

此致、

ITO

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

    尊敬的 Ito-San:

    我将查看相应的 PCIe 代码并返回给您。

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

    尊敬的 Bin:

    感谢你的帮助。

    此致、

    ITO

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

    大家好!

    这个问题的进展如何?

    此致、

    ITO

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

    尊敬的 Ito-San:

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called [问题 1]
    当 PCIe 端点器件触发传统中断时、
    预计j721e_pcie_legacy_irq_handler()中的函数pci-j721e-host.c会被调用是正确的
    和基于 PSDK Linux v9.2 的 Linux 中的软件开发工具[/报价]

    是的、这是预期结果。

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called [问题 2]
    当端点器件重复触发传统中断时、
    j721e_pcie_legacy_irq_handler()函数最终停止被调用。
    这种现象的可能原因是什么?

    如果等待时间过长、则让端点设备取消置位并重新置位旧中断、它是否会改变问题的行为?

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

    尊敬的 Ito-San:

    我们向j721e_pcie_legacy_irq_handler()函数添加了日志输出、
    并观察到、当来自 FPGA 的旧中断被反复触发时、
    日志输出出现在处理程序函数停止被调用的位置。
    在此之后、没有观察到进一步的日志输出。

    当 FPGA 重复触发传统中断时、您是否已检查 PCIe EP 始终发送 Assert_INTA 数据包后跟 DEASSERT_INTA 数据包、并且从未错过 DEASSERT_INTA?

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

    您好、Ito-San、

    当问题发生并且中断不再被触发时(即 j721e_pcie_legacy_irq_handler () 不再被调用)、您能否在 Linux 提示符下运行以下命令并查看中断是否再次被触发?

    devmem2 0x0F1000C8 w 0x2

    此致、
    Siddharth。

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

    尊敬的 Bin-san:

    感谢您的答复。

    如果等待的时间较长、则让端点设备置为无效并重新置为旧中断、它是否会改变问题的行为?

    我们尝试将从 FPGA 重复生成传统中断的时间间隔从 1 秒延长到 10 秒、
    但行为没有改变。
    在出现一定次数后、j721e_pcie_legacy_irq_handler()函数停止被调用。

    当 FPGA 重复触发传统中断时、您是否检查了 PCIe EP Always Sent Assert_INTA 数据包后跟 DEASSERT_INTA 数据包、并且从未错过 DEASSERT_INTA?

    我们使用 Altera 的 FPGA 并利用 Intel 的 PCIe 硬盘 IP。
    我们已确认 FPGA 可以持续发出指令以将数据包发送到 Intel 的 PCIe 硬盘 IP。
    虽然我们没有直接验证数据包本身、但我们认为没有传输错误。

    此致、

    ITO

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

    尊敬的 Siddharth、

    感谢您的答复。

    我执行了您提供的命令、但中断未被重新触发。

    此致、

    ITO

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我执行了您提供的命令、但中断没有被重新触发。

    Ito-san、奇怪的是没有触发中断、因为我能够在我的设置中重新创建问题、并且 devmem2 命令触发了中断。 在 AM64 SoC 上运行 devmem2 命令后、您是否可以尝试再次从 FPGA 发出中断、并查看中断是否已注册?

    此致、
    Siddharth。

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

    伊图 — 桑,

    您能否将以下“diff"应用“应用于 SDK 中的 PCI-j721e-host.c 驱动程序、并检查问题是否已解决?

    diff --git a/drivers/pci/controller/cadence/pci-j721e-host.c b/drivers/pci/controller/cadence/pci-j721e-host.c
    index 624ae38c38f3..275bfe658d36 100644
    --- a/drivers/pci/controller/cadence/pci-j721e-host.c
    +++ b/drivers/pci/controller/cadence/pci-j721e-host.c
    @@ -125,6 +125,7 @@ static void j721e_pcie_legacy_irq_handler(struct irq_desc *desc)
            }
    
            chained_irq_exit(chip, desc);
    +       j721e_pcie_user_writel(pcie, USER_EOI_REG, EOI_LEGACY_INTERRUPT);
     }
    
     static void j721e_pcie_irq_eoi(struct irq_data *data)

    此致、
    Siddharth。

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

    尊敬的 Siddharth、

    感谢您的答复。

    检查中断寄存后、我确认了该j721e_pcie_legacy_irq_handler()函数、
    已停止被调用、现在再次被调用。

    此外、通过应用您提供的修补程序pci-j721e-host.c
    我确认j721e_pcie_legacy_irq_handler()即使不执行devmem2命令也可以调用该函数。

    但是、在j721e_pcie_legacy_irq_handler()功能处理中、
    尽管它应该触发与分配给 FPGA 的中断矢量相对应的 IRQ、但仍然不会调用寄存的函数。

    FPGA 配置为在访问其 PCIe 栏空间中的特定地址时生成传统中断。
    FPGA 指示 Intel PCIe Hard IP 发送 assert_INTA 数据包、然后将 DEASSERT_INTA 数据包设置为 20 微秒之间的间隔。

    我怀疑可能无法调用已注册的函数、因为旧中断发生与j721e_pcie_legacy_irq_handler()调用该函数之间的时间间隔超过 20 微秒。 为了进行调查、我将内核配置为在访问条形空间和j721e_pcie_legacy_irq_handler()调用函数之前输出日志。

    因此、条形码访问之前的日志输出与调用处理程序时的时间戳之间的时间戳差异通常约为 10 微秒、但在 100 中的 1 或 2 种情况下、时间戳超过 20 微秒。 当差值超过 20 微秒时,j721e_pcie_legacy_irq_handler()函数被调用,但注册函数不被调用。

    当我第一次提问题时、我提到 Linux 是基于 Processor SDK Linux v9.2 构建的。 更准确地说、它是基于 PSDK PROCESSOR-SDK-LINUX-RT v9.2 的 AM64X-AM64X 版本构建的。

    因此、我还有一个问题:

    [问题 3]
    在 Processor SDK Linux-RT v9.2 中、是否有任何关于从接收 PCIe 传统中断到调用j721e_pcie_legacy_irq_handler()函数所需时间的基准测试信息?
    例如、如果 FPGA 上的传统中断从置为有效到置为无效所需的时间短于调用处理程序所需的最长时间、则会调用处理程序、但注册的函数不会。
    我担心旧中断的发生可能无法正确地通知用户程序。

    此致、

    ITO

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

    伊图 — 桑,

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6119564

    检查中断寄存后、我确认了该j721e_pcie_legacy_irq_handler()函数、
    已停止被调用、现在再次被调用。

    此外、通过应用您提供的修补程序pci-j721e-host.c
    我确认j721e_pcie_legacy_irq_handler()即使不执行devmem2命令也可以调用该函数。

    [/报价]

    感谢您确认该补丁修复了未调用中断处理程序的问题。

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6119564

    但是、在j721e_pcie_legacy_irq_handler()功能处理中、
    尽管它应该触发与分配给 FPGA 的中断矢量相对应的 IRQ、但仍然不会调用寄存的函数。

    FPGA 配置为在访问其 PCIe 栏空间中的特定地址时生成传统中断。
    FPGA 指示 Intel PCIe Hard IP 发送 assert_INTA 数据包、然后将 DEASSERT_INTA 数据包设置为 20 微秒之间的间隔。

    [/报价]

    FPGA 是否在 20 微秒后无条件发送 DEASSERT_INTA? 理想情况下、只有在 Linux 上运行的 FPGA 的中断处理程序清除 FPGA 上的中断后、才应发送 DEASSERT_INTA。

    因此、条形码访问前的日志输出与调用处理程序时的时间戳之间的时间戳差异通常约为 10 微秒、但在 100 个案例中大约有 1 或 2 个、超过 20 微秒。 当差值超过 20 微秒时,j721e_pcie_legacy_irq_handler()函数被调用,但注册函数不被调用。

    这是预期行为。 请注意以下几点:
    i) 当 FPGA 发送 assert_INTA 时、将调用 j721e_pcie_legacy_irq_handler () 函数。
    ii) 在 j721e_pcie_legacy_irq_handler () 执行期间、将读取 STATUS 寄存器以识别 INTA、INTB、INTC 和 INTD 中的哪个已生效。
    iii) 如果在读取 STATUS 寄存器之前由 FPGA 发送 DEASSERT_INTA、则 STATUS 寄存器将指示 INTA、INTB、INTC 或 INTD 均未置为有效。

    出现该问题的原因是 FPGA 无条件在 20 微秒后发送 DEASSERT_INTA。 因此、修复方法如下:
    i) 请勿无条件地从 FPGA 发送 DEASSERT_INTA
    ii) Linux 上运行的 FPGA 的中断处理程序(不是 j721e_pcie_legacy_irq_handler ()、而是 FPGA 端点的中断处理程序)应处理中断并在 FPGA 端点上“清除“中断
    iii) 仅当 FPGA 端点上的中断被清除时、它才应发送 DEASSERT_INTA

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6119564 [问题 3]
    在 Processor SDK Linux-RT v9.2 中、是否有任何关于从接收 PCIe 传统中断到调用j721e_pcie_legacy_irq_handler()函数所需时间的基准测试信息?
    例如、如果 FPGA 上的传统中断从置为有效到置为无效所需的时间短于调用处理程序所需的最长时间、则会调用处理程序、但注册的函数不会。
    我担心旧中断的发生可能无法正确地通知用户程序。

    中断延迟不是进行基准测试、正如您正确地注意到的、它本质上是可变的。 中断由作为应用内核的 ARM Cortex-A 处理、该 ARM Cortex-A 针对性能而不是延迟进行了优化、因此、如果要求对中断处理延迟具有严格的约束、那么 ARM Cortex-R 非常适合此类情况。

    然而、无论中断延迟有何限制、无条件发送 DEASSERT_INTA 的方法都是不正确的。 仅当中断处理程序为 DEASSERT_INTA 提供服务并清除 FPGA 端点上的中断后、才应发送 DEASSERT_INTA。

    此致、
    Siddharth。

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

    尊敬的 Siddharth、

    我们没有无条件地从 FPGA 发送 DEASSERT_INTA、而是对 FPGA 进行了修改、以便写入1 FPGA PCIe 条形空间中的特定地址会发出 ASSERT_INTA 数据包、而写入0同一地址会发出 DEASSERT_INTA 数据包。

    此外、在注册为 FPGA 端点中断处理程序的函数中、我们实现了一种机制来重复写入0该地址、直到读回确认0已成功写入。

    应用这些更改后、我们确认以下序列 (1–4) 按预期工作:

    1. 写入1条形空间中的特定地址、以从 FPGA 触发 ASSERTE_INTA
    2. 执行该j721e_pcie_legacy_irq_handler()功能
    3. 执行注册为 FPGA 端点中断处理程序的函数(写入特定地址) 0
    4. 从 FPGA 触发 DEASSERT_INTA

    但是、在检查日志输出时、我们观察到对于单个 assert_INTA 发出、该j721e_pcie_legacy_irq_handler()函数被调用了 4–5 次。 从注册的函数j721e_pcie_legacy_irq_handler()也被调用了两次。

    此外、我们1以大约一秒的间隔重复执行“写入特定条形空间地址以触发来自 FPGA 的 assert_INTA “操作。 经过大约 500 次重复后、SSH 窗口通过以太网连接到 Linux 环境、关闭后我们无法再次登录。
    Linux 似乎已“崩溃“。

    从这些结果来看,似乎j721e_pcie_legacy_irq_handler()函数独立于注册函数运行,并且 DEASSERT_INTA 只在注册函数成功写入后才由 FPGA 发出0。 在 INTA 状态取消置位之前、处理程序似乎被重复调用。

    如果由于某种原因、注册的函数无法0正确写入并且 INTA 状态仍然有效、我们怀疑会j721e_pcie_legacy_irq_handler()反复调用该函数、最终导致 Linux “崩溃“。

    因此、我们还有两个额外的问题:

    [问题 4]
    我们假设j721e_pcie_legacy_irq_handler()调用 IRQ 注册函数。 是否j721e_pcie_legacy_irq_handler()等待被调用函数完成其处理?

    [问题 5]
    如果 INTA 状态仍然有效、是否有可能j721e_pcie_legacy_irq_handler()无限期重复调用、从而导致 Linux 出现“崩溃“的情况?

    此致、

    ITO

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

    您好、Ito-San、

    应用这些更改后、我们确认以下序列 (1–4) 符合预期:

    感谢您测试建议的更改并确认其有效。

    但是、在检查日志输出时、我们观察到对于单个 assert_INTA 发行、该j721e_pcie_legacy_irq_handler()函数被调用了 4–5 次。 从注册的函数j721e_pcie_legacy_irq_handler()也被调用了两次。

    这是因为来自 FPGA 的 DEASSERT_INTA 尚未到达 AM64 SoC 上的 PCIe 控制器。 请注意、PCIe 使用通过 PCIe 链路传输的消息来模拟传统中断 (INTx)、这些消息将需要有限的持续时间来传播。

    如果由于某种原因、注册的函数无法0正确写入、并且 INTA 状态仍然有效j721e_pcie_legacy_irq_handler()、我们怀疑会反复调用该函数、最终导致 Linux “崩溃“。

    如上所述、注册函数未能写入 0 的情况并非如此。 DEASSERT_INTA 需要时间来传播、直到它被接收、将继续调用 j721e_pcie_legacy_irq_handler ()。

    因此、该修复方案是为了在 FPGA 上的“经修改的函数“将 DEASSERT_INTA 消息清除后从 FPGA 发送的有限传播延迟。 在“已更新功能“中、请在退出该功能之前增加大约 1 毫秒的延迟。 这样、完整的序列将为:

    1. 写入1条形空间中的特定地址、以从 FPGA 触发 ASSERTE_INTA
    2. 。  j721e_pcie_legacy_irq_handler() function is invoked
    3. 会调用注册为 FPGA 端点中断处理程序的函数
    4. 寄存的中断处理程序将“0"写入“写入条形空间中的特定地址、以清除中断并使 FPGA 发送 DEASSERT_INTA
    5. 将“0"写入“写入条形码空间后、使用“delay (1)“等待 1 毫秒。
    6. 从注册的中断处理程序返回到其调用程序、它是 j721e_pcie_legacy_irq_handler ()。
    7. j721e_pcie_legacy_irq_handler () 将 EOI_legacy_interrupt 写入 USER_EOI_REG 寄存器并退出

    在上述序列中、通过向 USER_EOI_REG 寄存器写入 EOI_legacy_interrupt (0x2)、可以确认现有中断并准备新的中断。 在该机制确认现有中断后、如果到目前为止尚未接收到 DEASSERT_INTA、则将再次为前一个中断本身触发中断。 因此、上面的步骤 5 中所述的建议将防止发生这种情况。

    由于延迟取决于所使用的设置、请对延迟值进行实验、从 1 毫秒开始并以 1 毫秒为单位增加、直到不再发生虚假中断问题。

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6131612 “][Question 4]
    我们假设j721e_pcie_legacy_irq_handler()调用 IRQ 注册函数。 是否j721e_pcie_legacy_irq_handler()等待被调用函数完成其处理?

    是的、它等待“生成的函数以供 FPGA 端点中断处理程序“运行直至完成。

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6131612 “][Question 5]
    如果 INTA 状态仍然有效、是否有可能j721e_pcie_legacy_irq_handler()无限期重复调用、从而导致 Linux “崩溃“?

    是的、正确。 请实施上面建议的“Step-5",“,并、并检查是否不再看到虚假中断。

    此致、
    Siddharth。

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

    尊敬的  Siddharth、

    感谢你的帮助。

    是的、它等待“gised function for FPGA Endpoint interrupt handlers“运行到完成状态。

    从日志输出中、j721e_pcie_legacy_irq_handler()函数似乎没有等待注册的处理程序完成。
    当我们在建议序列的步骤 2、4 和 7 中添加日志打印时、日志按以下顺序打印:
    “步骤 2 日志 (j721e… 函数)→步骤 7 log (j721e… Function)→Step 4 log(注册的处理程序)“。

    因此、在通过注册 FPGA 端点中断处理程序时request_irq()、我们先前已将第三个参数设置flags为 0。
    作为试用、我们IRQF_NO_THREAD在中指定flags、然后按以下顺序打印日志:
    “步骤 2 日志 (j721e… 函数)→步骤 4 日志(注册的处理程序)→步骤 7 日志 (j721e… 功能)“。
    步骤 4 日志和步骤 7 日志的时间戳相差超过 1 毫秒。
    我们还能够确认与建议的顺序一致的行为。

    接下来、我们request_irq()将对 FPGA 端点中断处理程序的调用修改为始终IRQF_NO_THREAD在中指定flags、并运行一个用户程序、该程序每隔 100 毫秒写入条形空间中的特定地址。
    在这些条件下、我们确认了连续 10,000 次迭代中每个序列的正确行为。

    基于此、我们认为已经解决了 FPGA 的旧中断最终停止检测的问题。

    [问题 6]
    我们将从 Linux-AM64X 基于 PSDK PROCESSOR-SDK-LINUX-RT v9.2 构建 Linux。
    如果IRQF_NO_THREADflags通过注册处理程序时未在中指定request_irq()、该j721e_pcie_legacy_irq_handler()函数是否可能不会等待注册的处理程序完成?

    此致、

    ITO

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从日志输出中、j721e_pcie_legacy_irq_handler()函数似乎没有等待注册的处理程序完成。
    当我们在建议序列的步骤 2、4 和 7 中添加日志打印时、日志按以下顺序打印:
    “步骤 2 日志 (j721e… 函数)→步骤 7 log (j721e… 函数)→步骤 4 日志(注册的处理程序)。“

    通常、当中断处理程序(在本例中为寄存的处理程序)可能需要时间来执行、并且可能存在多个中断及其各自的处理程序 (INTA、INTB、INTC 和 INTD) 时、会使用“threaded_IRQ"。“。 由于我们不想在 INTA 的处理程序完成之前阻止 INTB、INTC 和 INTD 的中断处理程序、因此我们使用“threaded_IRQ",“,它、它将调度“经过处理程序“以在稍后的时间点运行。

    [引述 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6138132

    接下来、我们request_irq()将对 FPGA 端点中断处理程序的调用修改为始终IRQF_NO_THREAD在中指定flags、并运行一个用户程序、该程序每隔 100 毫秒写入条形空间中的特定地址。
    在这些条件下、我们确认了连续 10,000 次迭代中每个序列的正确行为。

    基于此、我们认为已经解决了 FPGA 的旧中断最终停止检测的问题。

    [/报价]

    感谢您确定并分享潜在的修复方案。 尽管这确实解决了该问题、但请注意、“IRQF_NO_THREAD"在“在实时系统中不是首选。 通过使用“IRQF_NO_THREAD"来“来标记处理程序、处理程序不仅禁用所有 IRQ、还会延迟其他中断处理程序的执行。 因此、如果考虑到实时系统中采用这种方法时的潜在问题、它能满足您的用例要求、那么可以在意识到缺点的同时继续下去。

    [引用 userid=“584182" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1581440/am6442-the-legacy-interrupt-from-the-fpga-stops-being-called/6138132 ]我们将基于 PSDK PROCESSOR-SDK-LINUX-RT v9.2 从 AM64X 构建 Linux。
    如果IRQF_NO_THREADflags通过注册处理程序时未在中指定request_irq()、该j721e_pcie_legacy_irq_handler()函数是否可能不会等待注册的处理程序完成?

    是的、考虑到我们使用的是'RT'(实时)系统、优先选择是具有线程化 IRQ 处理程序、这种情况似乎确实如此。

    由于“Step 7“(使用默认驱动程序)之后将运行“已更新的处理程序“、使其在更新的顺序中仍然工作的一种方法是:

    1. 写入1条形空间中的特定地址、以从 FPGA 触发 ASSERTE_INTA
    2. 。  j721e_pcie_legacy_irq_handler() function is invoked
    3. j721e_pcie_legacy_irq_handler () 计划将来要执行的“已更新的端点中断处理程序“
    4. j721e_pcie_legacy_irq_handler () 将 EOI_legacy_interrupt 写入 USER_EOI_REG 寄存器并退出
    5. 会调用注册为 FPGA 端点中断处理程序的函数
    6. 寄存的中断处理程序将“0"写入“写入条形空间中的特定地址、以清除中断并使 FPGA 发送 DEASSERT_INTA
    7. 从端点触发新中断的用户空间应用程序应注意在写入 BAR 以触发来自端点的下一个中断之前正在执行“Step 6“-不应在前一个中断未得到处理/清除的情况下生成新中断。

    要同步步骤 6 和 7、可以在条形空间中使用“状态“位、顺序为:
    -端点中断处理程序写入 BAR 空间以清除中断
    -端点中断处理程序写入条形空间中的“状态“位以指示中断已被清除
    -用户空间应用程序等待条形空间中的“状态“位被设置
    -验证条形空间中的“状态“位已设置后,用户空间应用程序将清除“状态“位,然后写入条形空间以引发新的中断

    此致、
    Siddharth。