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.

[参考译文] TMDSEMU110-U:DMA 模式 UART 延迟修复

Guru**** 2526700 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1346271/tmdsemu110-u-dma-mode-uart-latency-fix

器件型号:TMDSEMU110-U
主题中讨论的其他器件:UNIFLASH

正如之前在 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1087696/tmdsemu110-u-xds110-usb-uart-is-bursty-at-high-baud-rates/4035123#4035123中讨论的 、在 DMA 模式下的 XDS110 USB UART 处理中存在一种尴尬的行为、在这种情况下、频率小的数据突发导致固件在通过 USB 发送数据之前等待整个 DMA 缓冲区填满。 在高波特率下、这会为短 UART 消息突发造成数百毫秒(在极端情况下甚至超过一秒)的延迟。 我调试了 XDS110固件以确定此问题的确切原因、并在我链接的早期主题中详细描述了原因。 但是、这一点当时没有解决、因为需要一些工程时间才能设计出解决方案、并且这不是 TI 的优先考虑事项。

这种高延迟使 XDS110 USB UART 无法用于我的应用、因此我之前改用外部 USB-UART 适配器、但这样很不方便。 我稍后修补了 XDS110固件、以更改切换到基于 DMA 的 UART 操作时的波特率、从230400波特改为0x200000 (2097152)波特。 XDS110 CPU 的速度非常快、足以处理2M 波特的非 DMA UART。 回到2022年、使用 XDS110固件3.0.0.19 (随 Uniflash 7.1.0提供)在高波特率下存在单独/不相关的间歇数据丢失错误、UART 写入大小不是4的倍数、但这似乎在最新的 XDS110固件3.0.0.28 (随 Uniflash 8.6.0提供)上已修复。

我修补了 XDS110固件3.0.0.28、从而通过将 firmware_3.0.0.28.bin 中偏移0x0A14处的字节从61 3F 更改为00 1F、提高了 DMA 模式 UART 切换波特率。 通过这一改变、我获得了可靠的低延迟 USB UART、以及采用2M 波特的 XDS110、非常适合我。 但是、如果我不必在每次发布新固件版本时都重新修补 XDS110固件(并确定版本的正确补丁偏移量)、那会更好。 如果您做了这个简单的小改动、将 UART 到 DMA 操作的切换波特率提高到大约2M 波特以上、那么这将解决我的问题、并让您的所有其他客户也可以更好地体验 XDS110 UART。 或者、您也可以尝试通过频繁的小数据突发来解决基于 DMA 操作的延迟问题、但这需要更多的工程时间/精力。

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

    您好!

    如果您刚刚简单地做了这项简单而又省力的更改,将 UART 到 DMA 操作的切换波特率提高到2M 波特以上,这将解决我的问题,并使 XDS110 UART 体验更好地为所有其他客户服务。

    我将需要与工程部门讨论这一点。 感谢您的详细分析和建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我需要与工程部门讨论此问题。 感谢您的详细分析和建议。

    他们正在调查。 已为此提交了一个 TT。 跟踪链接: https://sir.ext.ti.com/jira/browse/EXT_EP-11735

    谢谢

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

    谢谢 Ki。

    让工程师参考一下、延迟问题的根本原因是在基于 DMA 的 UART 模式下、XDS110固件会等待 DMA 缓冲区填满数据、然后再发送出去。 有一个每5ms 触发一次的定时器(IIRC)、它检查在过去的15ms 内、DMA 缓冲器中的数据量是否没有变化、在这种情况下、即使没有满数据、它也会刷新缓冲器。 但是、如果在过去15ms 内出现少量数据、也不会刷新此 DMA 缓冲区。 因此、当 UART 数据跳跃的发生频率超过15ms 时、这种刷新逻辑永远不会被激活、这会导致填充 DMA 缓冲区的高延迟有问题。

    在中断驱动的 UART 模式下(当前由低于230400波特的 XDS110固件使用)、不会等待缓冲区填满、延迟非常小。 在我的测试(修改 XDS110固件二进制文件)中、XDS110上基于中断的 UART/USB 桥接在2M 波特(由我的应用使用)等高波特率下也能正常工作。 我还没有尝试过任何高于该值的波特率。 由于延迟要低得多、我建议将固件更改为使用中断驱动的 UART、即使在高波特率下(例如2M 波特)也是如此。

    即使波特率比我使用的更高、保持基于 DMA 的 UART 也可能有价值。 为了避免在基于 DMA 的 UART 中频繁进行小数据突发带来这种不良延迟、需要更改 XDS110固件的逻辑、从而定期刷新 UART DMA 缓冲区、即使最近传入了更多数据也是如此。