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.

[参考译文] TMDS64EVM:UART_LLD_dmaDisableChannel 中的环形刷新环路行为 (MCU+ SDK v11、AM64x)

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1651930/tmds64evm-behavior-of-ring-flush-loop-in-uart_lld_dmadisablechannel-mcu-sdk-v11-am64x

器件型号: TMDS64EVM

在的当前实现中 UART_lld_dmaDisableChannel、调用后 Udma_chDisable、代码使用循环执行空闲队列描述符的刷新:

while (temp == true)

  uint64_t pDesc;
  int32_t tempRetVal;

  tempRetVal = UDMA_ringFlushRaw (
           UDMA_chGetFqRingHandle (chHandle)、&pDesc);
  IF (UDMA_ETIMEOUT == tempRetVal)
  {
    TEMP = FALSE;
  }
}

此循环将继续调用、 Udma_ringFlushRaw 直到函数返回 UDMA_ETIMEOUT

问题: 在我的用例中、我需要 在 ISR 上下文中中止 DMA 读取传输。 在 ISR 中运行此循环有问题、因为它会阻塞且耗时‑μ s。

我想了解、 对的单次调用是否 Udma_ringFlushRaw 足以确保通道保持一致的状态、或者跳过循环是否可能导致问题(例如,未发布描述符,内部不一致)。

问题:

  • 为什么 SDK 实施会在循环中刷新描述符、直到 ETIMEOUT

  • 为了确保正确的通道禁用行为、是否严格需要该环路?

  • 在 ISR 上下文中中止 DMA 传输 而不执行这个可能阻塞的循环的建议方法是什么?

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

     您好、Slim、

    感谢您的提问。

    为什么 SDK 实施在循环中刷新描述符直到 ETIMEOUT

    UDMA_chDisable 完成拆卸后、UDMA 硬件会将任何飞行描述符移回空闲队列 (FQ) 环。 循环逐个消耗这些能量、直到环的硬件占用达到零、此时 UDMA_ringFlushRaw 返回 UDMA_ETIMEOUT、这意味着环为空。 请注意、每个调用不会阻塞、只是通过代理直接读取的寄存器、会立即返回。

    为了保证正确的通道禁用行为、是否严格要求此循环?

    是、如果您打算重复使用该通道。 UART DMA 驱动程序每次传输只提交一个 HPD、因此在实践中、循环始终只运行两次迭代(一次成功出队,一次 ETIMEOUT)。 如果跳过刷新、过时的描述符将保留在 FQ 环中、下一次传输将损坏或错误处理它。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    首先、感谢您先前对中的冲洗循环行为的解释 UART_lld_dmaDisableChannel。 它帮助我更好地理解为什么 SDK 实施耗尽描述符直到 ETIMEOUT.

    附加上下文 (AM64x、MCU+ SDK v11)

    在我的应用中、 100µs 的每个计时器中断都  必须:

    • 如果当前的 DMA Rx 传输未完成、则中止该传输(这会起到超时的作用)。

    • 立即启动一个精确在 100µs 计时的新 Rx 事务 

    while(temp == TRUE) ‑当前的 SDK 实现、刷新循环 () 使得函数执行时间围绕 100µs、这在我的实际 2 μ s 时间环境中是不可接受的。 这种开销使我无法满足应用程序的严格时序要求。

    在修改该函数以 仅执行单个冲洗 而不是循环直到后 ETIMEOUT,我测量:

    • 新函数的执行时间:~3µs 

    • 事务之间的时间间隔: 根据计时器中断正确保持在 100µs。

    问题

    1. 在‑的 ISR 实时情况下、 如果我的测量结果显示正确的时序、是否可以用单个刷新来减少延迟?

    2. TI 建议采用什么方法来 中止 ISR 内的 DMA Rx 传输 、同时确保通道保持一致(无过时描述符或损坏)?

    3. 由于 UART DMA 驱动程序在每个传输中仅提交一个 HPD、因此在这种情况下、是否可以认为单次刷新足以保证正确的通道拆分?

    再次感谢您的支持。

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

    您好、

    “那你就回去吧。“

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    是否有关于此问题的新闻?

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

    您好、

    我们使用一个数据包描述符。 因此、在启动新的传输之前、您需要至少完成一个描述符的刷新。

    问题在于、要重置振铃、我们调用 DM 服务请求、而 while 循环仅在 DM 服务完成后退出超时状态。

    因此、我们需要等待超时完成、因为如果您不等待振铃重置、启动新事务是不安全的。

    因此、有必要等待超时。 这不是实际的超时、如果 DM 服务快速响应、while 循环会快速退出。

    有时需要更长的时间、具体取决于系统负载。

    关于您的要求:当 Rx 过程停止时、至少需要丢失一个样品才能完成拆卸过程。

    在您的新事务中、在您取消 DMA 事务后、您必须始终验证先前的拆卸过程是否已完成。

    下面是我尝试理解的内容:即使 DMA 已启动、您也需要取消 DMA RX 并开始新的转换。 为此、您需要调用 DMA 拆卸过程。

    我的问题是:

    1.你是否测试过这个场景?
    2.一旦 DMA 启动且传输未完成,您是否启动了拆卸过程?
    3.是否能够正确地执行拆卸?
    4.我们看到了 MCSPI 外设的问题,我相信你可能会遇到同样的问题。

    您能否确认:当 DMA RX 启动但传输未完成时、您是否能够执行拆卸?

    此致、
    Anil.