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.

[参考译文] RTOS/AM5726:AM57xx UART、在百万次测试期间出现 DMA 通信错误

Guru**** 2551110 points
Other Parts Discussed in Thread: AM5726

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/757178/rtos-am5726-am57xx-uart-with-dma-communication-error-during-million-test

器件型号:AM5726

您好、香榭丽舍

当客户 UART 通信测试数百万次时、有时会发生通信错误。

我们确认发送到 Rx 的 Tx 数据成功。

AM572x RX 端数据失败。  我们仍在调查这一细节。  

您是否曾遇到过这样一个无法接收数据的问题?

AM572x RX --- TX 器件

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

    器件型号:AM5726

    工具/软件:TI-RTOS

    您好 Champ、

    我们将使用具有 DMA 模式的 UART。

    我们有两个问题。

    1) 1)尽管 在接收 DMA 数据之前 Rx 缓冲器上存在"使缓存无效"、但有时在读取数据之前会自动启用缓存  

    您是否有过这种现象?

    下面是详细现象。

    DMA 接收设置遵循以下步骤、

    1:RX 缓冲缓存无效

    2:开始接收数据

    3:完成接收

    4:读出 Rx 缓冲器。

    在这种情况下,它将 Rx 缓冲区值设置为与缓存行大小对齐,并为缓存行大小设置多个长度。

    我们在1和4期间的理解使"缓存"失效。 通常、系统工作正常。

    但是、每100万次通信会有1次、 缓存 会在" 2~4 "期间自动"验证"并读取以前的数据。  

    我们确认了 μ 1~4流程未访问 PGM 上的 Rx 缓冲器。

     

    此致、

    Kz777

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

    请根据需要在 以下网址提供使用案例的完整详细信息:processors.wiki.ti.com/.../Checklist_for_Processor_SDK_RTOS_questions_on_E2E
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,总结两个问题。 Howeve、r 每个问题都是独立的。 很抱歉、这不是 RTOS 问题。
    主要是 UART DMA 问题。 并删除了 RTOS 标签。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请提供详细信息:
    -使用哪个发布的 Processor SDK RTOS?
    -如何为 UART 启用 DMA?
    -哪个 UART 库链接到应用程序?
    -您是在回调模式还是块模式下使用 DMA?
    -您运行的是什么内核?
    -您是否参考任何 TI UART 测试示例、如 UART_BasicExample_idkAM572x_DMA_armTestproject?

    我们最近发现一个问题、即 UART DMA 未正确测试、因为在.cfg 文件中指定了非 DMA 支持库并使用了该库。 该校正将位于.cfg 文件中、如下所示:

    VAR UART = XDC.loadPackage ('ti.drv.UART');
    UART.Settings.enableProfiling = true;
    UART.Settings.socType = socType;
    Uart.Settings.useDma ="true";

    我们还发现、在 A15上、即使您执行与缓存行大小对齐的 DMA RX 缓冲区、且缓冲区长度等于多个缓存行、以下操作也不总是包含 A15接收的数据:

    1. memset/initialize the RX buffer
    2. rx 缓冲区的 cache_wbInv()
    DMA 将数据移动到 RX 缓冲区中(我们通过使用 CCS 存储器物理视图验证存储器来知道数据确实到达)
    CPU 尝试读取数据

    第4步可能无法获得正确的数据。

    我们建议在步骤4之前添加一个步骤:
    cache_Inv() Rx 缓冲区。 也就是说、在 CPU 读取之前使数据缓冲区无效。 尽管 CPU (A15)没有操作、因为 A15具有推测取指令、因此在 DMA 填充该缓冲区后、它可以在没有 CacheInv 的情况下获取过时的数据。

    希望这与您遇到的问题相同、因此可以得到解决。

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

    有更新吗?

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

    尊敬的 Eric:

    很抱歉我迟到了。

    当我问您的问题时、并建议他们采取后续行动。 他们接受此操作。

    他们将检查以下操作。 当他们仍然有问题时、我将再次尝试获取您所需的信息。

    我们最近发现一个问题、即 UART DMA 未正确测试、因为在.cfg 文件中指定了非 DMA 支持库并使用了该库。 该校正将位于.cfg 文件中、如下所示:

    VAR UART = XDC.loadPackage ('ti.drv.UART');
    UART.Settings.enableProfiling = true;
    UART.Settings.socType = socType;
    Uart.Settings.useDma ="true";

    我们还发现、在 A15上、即使您执行与缓存行大小对齐的 DMA RX 缓冲区、且缓冲区长度等于多个缓存行、以下操作也不总是包含 A15接收的数据:

    1. memset/initialize the RX buffer
    2. rx 缓冲区的 cache_wbInv()
    DMA 将数据移动到 RX 缓冲区中(我们通过使用 CCS 存储器物理视图验证存储器来知道数据确实到达)
    CPU 尝试读取数据