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.

[参考译文] Linux/AM3359:当 AM335x#39;s UART 在波特率3686400处工作时、数据丢失

Guru**** 2548520 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/773392/linux-am3359-data-lost-when-am335x-s-uart-working-at-baudrate-3686400

器件型号:AM3359

工具/软件:Linux

您好!

 我有两个定制板、都是通过"AM335x-bonebblack"进行的更改很少。

 我需要通过一个 UART 端口以波特率3686400将数据从一个板发送到另一个板。

 根据手册、波特率3686400是 IT 支持的最高数据。

 

 两个板使用相同的软件版本运行:

 TI-PROCESSOR-SDK-LINUX-AM335x-EVM-05.02.00.10、原始内核版本为4.14.79、稍后我将其更新为 GitHub 中的最新版本、该内核版本 为4.14.97。

 然后、 通过 uart4 (两侧)将2MB 从一个板发送到另一个板。

 如果在没有 DMA 的情况下接收、400字节~ 10KB 将丢失。

 如果使用 DMA 接收、则2MB 中的0 ~ 10KB 将丢失。

 在3686400下工作时、DMA 似乎无法提高 UART 的可靠性。

 通过"cat /proc/interrupts | grep dma"和"cat /proc/interrupts | serial"指令、我可以知道在整个测试期间产生了多少个中断。

 如果在没有 DMA 的情况下接收、则产生的串行中断约为18000次、没有 DMA 中断。

 如果通过 DMA 接收、则产生的串行中断约为35000次、DMA 中断约为35000次。

 当启用 UART DMA 时、AM335x 在不额外偿还的情况下会增加负载。

 那么、在以波特率3686400工作时、您对 AM335x 的 UART 有没有任何测试结果?

 您能否解释启用 UART DMA 时产生的中断负载?

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好吗、您是否在两个电路板上都为 UART4启用了硬件流控制?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尚未连接硬件 RTS/CTS。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UART 本身支持高达3.6Mbps 的波特率、但您可能需要启用硬件流控制以确保不会丢失 RX 数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    中断编号如何、为何启用 DMA 时会有更多的中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以提供命令"grep serial /proc/interrupts 的输出? 您可能不会查看 UART4的中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    硬件板已经在那里、我必须启用 UART DMA 来确定是否可以实现波特率3686400的新要求。 因此、我无法添加硬件流控制。

    实际上、我使用 UART5进行了测试、中断编号为46。  通过省略 DTS 文件来启用或禁用 DMA。

    这是 UART5在没有 DMA 的情况下接收时的屏幕截图。 您可以看到串行中断上升了大约30000次、但 DMA 中断几乎保持不变。

    这是 UART5通过 DMA 接收时的屏幕截图。 您可以看到串行中断提升了44000次、超过了没有 DMA 的情况。 此外、还产生了43000次 DMA 中断。

    这就是为什么我说"多了点钱、少了点钱"。

    这两种情况使用相同的 u-boot、相同的内核、相同的发送/接收程序、但不同的 DTB 文件(一个为 uart5启用了 DMA、另一个禁用 DMA)运行。

    在测试期间、所有 printk (我在内核中添加了)和 DMA 日志都被禁用。

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

    从上部的屏幕截图中、您将看到使用 DMA 接收的 UART 产生的中断比不使用 DMA 产生的中断更多。

    我在8250_omap.c 中添加了一些 printk 来检查和识别中断编号和类型、我有一些 findouts。

    无 DMA 的接收。 总共32725个串行中断包括:

    3803次 cc (IIR = 0xcc、Rx 超时)、

    54次 C6 (IIR = 0xc6、接收线路状态错误)、

    C4的28842次(IIR = 0xc4、RHR)、

    26次 IT_PENDING (IIR & IT_PEND= 1、无中断挂起)。

    2.在没有 DMA 的情况下接收。 总共49179个串行中断包括:

    4433次 cc (IIR = 0xcc、Rx 超时)、

    C6的28倍(IIR = 0xc6、接收线路状态错误)、

    C4的8次(IIR = 0xc4、RHR)、

    IT_PENDING 的44710倍(IIR &IT_PEND= 1、无中断挂起)。

     通过启用 DMA、中断"C4"大幅减少、这表示 DMA 确实起作用。

     打印'xx'表示"IIR & IT_PEND= 1"、表示无中断挂起。

     进入 ISR 处理程序、发现没有中断。 "8250_omap.c"中的 ISR 没有执行任何操作、只返回。

     但是、为什么启用 DMA 时会有这么多的'IT_PEND= 1"中断。

     尽管在 ISR 中不需要执行任何操作、但这些大量中断会给系统(AM335x+Linux)带来更大的负载。 它将抵消 DMA 的优势。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、需要将上柱案例2修改为"2"。 使用 DMA 接收。 总共49179个串行中断包含:"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="user4248043]硬件 板已经存在,我必须启用 UART DMA 以确定是否可以实现波特率3686400的新要求。 因此、我无法添加硬件流控制。[/quot]

    如果未启用硬件流控制、则几乎无法避免 Rx 数据丢失。

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

    但是中断的情况如何?为什么启用 DMA 时 iir.it_pending=1会有这么多中断?

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

    您好!

    这可能是由 UART 控制器的硬件引起的、但没有软件解决方案。 问题不仅发生在 AM335x UART 上、而且出现在其他供应商的 UART 上。 请查看以下讨论。

    lkml.org/.../588