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.

[参考译文] CC2540:使用 CC2540上的 DMA 的 UART 的 TX 吞吐量问题

Guru**** 2538950 points
Other Parts Discussed in Thread: CC2540

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/587314/cc2540-tx-throughput-issue-with-uart-using-dma-on-cc2540

器件型号:CC2540

使用 DMA 的 UART - BLE Stack 1.4.0的 Tx 吞吐量问题

 

背景

我们的系统上有一个运行 BLE Stack 1.4.0的嵌入式 CC2540、其主机处理器可通过 UART 或 USB 与 CC2540通信、具体取决于主机处理器的硬件是支持 UART 还是 USB。  此端口称为管理端口。 管理端口始终以115、200波特运行。

无论是采用 UART 配置还是 USB 配置、CC2540都能积极扫描环境中是否有其他 BLE 器件以及它接收到的每个 BLE 广播或扫描响应、 以一种大约50字节左右的众所周知的格式对其进行封装、并通过115200波特串行链路将其发送给主机处理器。

每20秒、两个不同的管理数据包(称为第一个管理数据包和第二个管理数据包)将通过相同的115、200波特链路背对背发送到主机处理器。

问题说明

据观察、在采用 UART 配置的 BLE 器件上、我们漏掉了大量这些管理数据包。 但是、在 USB 配置中、我们会接收每个管理数据包。 下表对此进行了说明:

 

第一个管理包

配置

第一个管理数据包的预期数量

首次管理数据包的实际数量

%age 丢失第一管理包

USB

3011.

2060.

31.5%

UART

3012.

3012.

0%


第二个管理包

配置

第二管理数据包的预期数量

第二管理数据包的实际数量

%age 丢失第一管理包

USB

3011.

618-

79.48%

UART

3012.

3012.

0%


在浏览 HAL UART 代码和 Tx 驱动程序时,特别是在_hal_UART_dma.c 中,看到 Tx 例程 HalUARTWriteDMA()使用 ISR 而不是 DMA,这令人惊讶,也令人不安。 显然、在该代码的上下文中 DMA 存在"问题"。 以下是代码的几个片段:

 

hal_UART_dma.c 的第8行:

已知缺陷是当启用流控制时、函数 HalUARTPollTxTrigDMA ()可以提前调用 HAL_DMA_MAN_TRIGGER (HAL_DMA_CH_TX)和 clober、即一个 txBuf[]块传输的最后一个字节和下一个 txBuf[]块传输的第一个字节。  此外、当使用 DMA 进行 Tx 和硬件流控制时、Tx 可能会在重用和/或同步重无线电流量期间永久停止。

 

hal_UART_dma.c 的第199行

//对于上面 moduel 说明中描述的已知缺陷,最好由 ISR vice 驱动 Tx
// DMA,除非未使用 H/W 流控制,并且 Tx 上的全吞吐量是绝对必要的。

 

我还检查了在 BLE Stack 1.4.0和 BLE Stack 1.4.1或 BLE Stack 1.4.2之间的 HalUARTWriteDMA()中的更改、但未找到任何内容。

代码中关于不使用 DMA 进行 Tx 声音严重的警告。  我们更喜欢使用 DMA。 但是、上面的一个注释令人不安、"此外、当使用 DMA 进行 Tx 和硬件流控制时、Tx 在重用和/或同时繁重的无线电流量期间可能会永久停机。"  

以下是我的问题:

  1. 我们不在硬件配置中使用流控制、因此上述消息是否适用于我们的设置?
  2. 当管理端口通过 USB 运行时、以115、200波特运行、我们不会看到任何丢弃的数据包。  当管理端口是 ISR 处理的 UART 端口时、以115、200波特运行、我们可以看到几乎有32%的第一管理端口和80%的第二管理数据包被丢弃。  ISR 处理的 UART 端口的预期吞吐量是多少?
  3. 我通过更改以下行将端口配置更改为使用 DMA 而不是 ISR:

      #define HAL_UART_TX_BY_ISR 0

      并将 DMA Tx 缓冲器增加为256、而不是128。

    现在、当管理端口是作为 DMA 处理的 UART 端口时、我们看到管理数据包减少了10%。  为什么这种行为与 USB 端口不等效、因为从理论上讲、DMA 应该能够以115、200波特运行、这与 USB 非常相似?
  4. 请记住、我们不使用流控制、如果我转向使用 DMA、Tx 可能会永久停止?  
  5. 使用 DMA 时、我能否检测到一个挂起的 Tx 并将 UART 复位以恢复正常运行?
  6. 底线是、如何使 UART 以115、200波特运行?

 

我非常感谢你在这一问题上的帮助。

此致、
KK

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

    由于您不使用流控制、我认为代码注释不适用于您、但我将进一步对此进行研究。 当我研究您的一些更具体的问题时、我有几个问题可能有助于解决此问题:

    您说您启用了 DMA、管理数据包减少了10%。 第一个数据包和第二个数据包上都是这样吗?

    您能告诉我有关您的主机器件的更多信息吗? UART 和 USB 的器件是否相同?

    如何检查数据包的丢弃位置? 是否检查了 HalUARTWrite 的返回值?

    在 CC2540上、您使用的是哪个 DMA 通道? 您是否实现了节能? 您是否正在使用加密? 在写入 UART 之前、您是否正在检查 DMA 是否占线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速响应!

    [引用 user="rachelP">您说您启用了 DMA,管理数据包减少了10%。 第一个数据包和第二个数据包上都是这样吗?
    [/报价]

    是的。  对于第一个和第二个管理数据包、它都大约为10%。

    [报价用户="RCachelP">您能告诉我有关您的主机设备的更多信息吗? UART 和 USB 的器件是否相同? [/报价]

    UART 和 USB 器件的主机器件不同。 实际上、UART 或 USB 的选择取决于主机是支持两个 UART 还是支持一个带有 USB 的 UART。  我们将 CC2540上的另一个 UART 用于不同的用途。

    [报价用户="RCachelP">如何检查丢包的位置? 是否检查了 HalUARTWrite 的返回值?
    [/报价]

    我已经添加了计数器来检查 HalUARTWrite()的返回值,但在这种情况下,我将检查在主机上接收到的数据包数量。

    [报价用户="RCachelP"> 在 CC2540上、您使用的是哪一个 DMA 通道? 您是否实现了节能? 您是否正在使用加密? 在写入 UART 之前、您是否正在检查 DMA 是否处于繁忙状态?

    我正在使用 TI 提供的 HAL UART 驱动程序、就像现在一样。  当我转移到使用 DMA 进行 Tx 时(即使您指定了 DMA、也不使用默认的 ISR)、我将  HAL_UART_DMA 设置 为2。  在 CC2540上、我们会实现节能。  我们使用加密。  在应用程序级别,我只调用 HalUARTWrite(),而不检查 DMA 是否占线,因为这不是一个要求。  如果缓冲区中有足够的空间并且 DMA 引擎从该缓冲区中拾取、则对 HalUARTWriteDMA()的调用依次调用 HalUARTWriteDMA()将要发送的数据排队到缓冲区中。  

    我期待您的答复。

    此致、
    KK

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

    感谢您提供这些附加信息。 请告诉我您的计数器会告诉您什么。 如果缓冲区已满、则 HalUARTWriteDMA 将返回0。 DMA 强制执行"全部"或"无"策略、因此如果剩余空间不足、您不会发送任何内容。

    我还想了解更多有关如何检查主机上接收到的数据包数量的信息。 您是检查 UART 缓冲区的内容还是进行更高级别的检查? 您是否有串行端口监视器用于检查实际发送的内容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rachel、

    [引用 user="rachelP">感谢您提供的其他信息。 请告诉我您的计数器会告诉您什么。 如果缓冲区已满、则 HalUARTWriteDMA 将返回0。 DMA 强制执行"全部"或"无"策略、因此如果剩余空间不足、您不会发送任何内容。
    [/报价]

    对。  计数器(基于 HalUARTWrite 的返回值)显示更多的数据包与 ISR 一同丢弃(用于带有 DMA 设置的 Tx)、而在使用带有 DMA 设置的 Tx 时、数据包数量要少得多。  但是、我需要您确认、如果我们不使用流控制、通过使用 DMA 设置切换到 Tx 的 DMA 不会导致文件注释中提到的停止。  其次、DMA 似乎使用比 ISR 大得多的缓冲区、也就是说、如果我们将128指定为 Tx 缓冲区的大小、则它分配的数量是 ISR 的两倍。  但是、如果 ISR 无法满足115、200波特的要求、那么我们可能必须切换到 DMA。

    [引用 user="RCachelP">我还想了解有关如何检查主机上接收到的数据包数量的更多信息。 您是检查 UART 缓冲区的内容还是进行更高级别的检查? 您是否有串行端口监视器用于检查实际发送的内容?
    [/报价]

    我将根据主机接收的数据包数量检查 BLE 发送的数据包数量。  我没有使用串行端口监视器。

    此致、
    KK

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

    我们一直在研究这个问题、但无法找到 UART 和 USB 之间差异的原因。 当您通过 UART 进行传输时、器件是否仍处于扫描模式?

    您能否在 TI 开发套件上重现此问题? 如果您可以提供使用 Simple Observer 重新创建此行为的说明、则有助于加快此调查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rachel、

    [引用 USER="RachelP">我们一直在研究此问题、但无法找到 UART 和 USB 之间差异的原因。 当您通过 UART 进行传输时、器件是否仍处于扫描模式?
    [/报价]

    是的、当我通过 UART 进行传输时、器件可能处于扫描模式。  有问题吗?  

    如果 UART 上的 Tx 使用 ISR、您会想到 UART 和 USB (可能使用 DMA?) 具有相同的吞吐量。  Tx by ISR 可以处理的最大速度是多少?  您是否有使用 TI 开发套件的测试设置、该设置显示了使用 ISR 的 UART Tx 的最大吞吐量?

    在该主题中的早期消息中、您曾提到过、您将研究当流控制使用时、Tx by DMA 是否有可能对数据进行编号或停止。  结论是什么?  我们如何知道是否发生了这些情况?  如果我们确实遇到这种情况、我们需要采取哪些纠正措施?

    此致、
    KK

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

    您好、Rachel、

    请帮我的客户关闭此帖子。

    您是否会就您在未使用流量控制时、由 DMA 发送是否有可能对数据进行序号处理或停止处理的调查提供反馈?

    Kannan 想知道在具有 ISR 而非 DMA 的情况下以1152k 波特 BPS 的速率进行 UART 传输的最佳情况是什么?

    谢谢!

    此致、

    Peter