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.

[参考译文] TM4C1294NCPDT:如何过早触发ping-pong缓冲器?

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1087708/tm4c1294ncpdt-how-to-prematurely-trigger-ping-pong-buffer

零件号:TM4C1294NCPDT

您好,

我正在使用 TM4C1294微控制器上的UDMA外设将数据从UART FIFO自动移动到内存中的64字节缓冲区。 我将UDMA配置为ping-pong缓冲区,当我获得恒定的数据流时,这应该很有效,因为当主缓冲区已满,UDMA自动切换到填充备用缓冲区时,会触发中断。 但是,数据流将会停止,但其中一个缓冲区中可能会留下数据。 发生这种情况时,我想提前交换缓冲区,以便将来的传入字节进入空缓冲区。 然后我可以安全地挖掘部分已满的缓冲区,复制我需要的数据,然后快乐地工作。

我的问题是:触发这种缓冲区交换行为的最佳方式是什么? 它是否像在 DMA通道控制字中将XFERMODE设置为STOP一样简单? 如果是,如果我将某个字节设置为停止,而UDMA正在传输一个字节,那么是否有丢失该字节的危险? 或者它是否会自动交换到另一个缓冲区并继续将传入数据添加到该缓冲区?

谢谢!

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

    您好,Adevries:

    一般而言,我想你会想设立某种‘看门狗’机制。 每次反转缓冲区时,设置一个计时器清除的标志,然后,如果计时器发现该标志未设置,它可能会触发所需的数据提取。

    我不太确定如何进行此操作,因为乒乓球模式通常用于连续数据传输。 我从未真正考虑过这种特殊的用例。  

    我认为,如果您在错误的时间设置STOP,可能会有丢失数据的风险,因为ping模式没有真正配置为处理中间的中断。

    明天我会和我的同事谈谈,看看我们能想出哪些适合您的应用程序的方法。

    此致,

    Ralph Jacobi

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

    您好,Ralph,

    感谢您的回复! 是的,我很好奇您或您的同事可能有什么想法。 总的来说,我正在寻找一种有效的方法,将通过UART接收的字节移动到USB缓冲区以进行传输。 除了乒乓球模式之外,我也愿意采用其他方式来实现这一目标。

    如果它有帮助,我认为这些是我的要求,从最高优先级开始:

    1.必须以正确的顺序将所有数据从UART准确地移动到USBBuffer (即不能丢弃字节,也不能反转字节顺序)

    2.使用尽可能少的处理器周期来完成此操作。

    3.字节不需要立即从UART移动到USBBuffer。 只要满足需求1,就会有轻微延迟(50-100毫秒)。

    目前,我正在考虑仅在脉冲模式下使用UDMA (xfer = 8,ARB大小= 8)来移动大部分数据(因此,我知道每次调用中断时写入的字节数),然后每50毫秒调用一次tick函数, 如果在两个tick函数调用之间没有更多数据写入缓冲区,它将清除UART FIFO中剩余的任何字节。 但我不知道所有细节都能解决,我不确定是否能解决问题。  

    期待您的想法!

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

    您好,Adevries:

    目前402.846万目前,我正在考虑使用arb,dma=508时的数据传输率(最多称为dma) 如果在两个tick函数调用之间没有更多数据写入缓冲区,它将清除UART FIFO中剩余的任何字节。 但我不知道所有细节都能解决,我不确定是否能解决问题。  [/引述]

    这种执行可能对许多情况有效,但我认为,可能有一些角落的情况会对其产生影响。 我不知道您对外部系统的控制程度。

    我们认为可行的一个建议取决于您是否可以确保UART数据在第一次传输时附带数据包标头以指示传输大小。

    如果是这样,可能使用散点收集模式是更好的选择,因为:

    在Memory Scatter-Gather (内存散射收集)模式下,主控制结构用于从内存中的表中对备用控制结构进行编程

    因此,理论上,您可以获得一个标头,其中包含将接收的字节数,并使用该标头相应地配置备用结构。 然后,在收到所有字节后,将其设置为等待下一次传输转至主结构。

    我们认为这比依赖超时更好,因为很难确定转账是否已停止足够长时间/不会再次开始。

    此致,

    Ralph Jacobi

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

    您好,Ralph,

    不幸的是,我无法真正控制此应用程序的传入UART数据。 但下次我解决这个问题时,我会记住这一点。

    我们402.9749万我们的想法是,如果要提前/提前足够长的时间来确定传输,那么这将是一个更好的方法。

    是的,我在尝试编码我的第一个和第二个想法时遇到了同样的问题,哈哈。 目前,我所确定的解决方案使用DMA处理传出UART数据,但不使用DMA处理传入数据。 我只是使用Rx FIFO,接收中断和接收超时中断从UART获取所有数据。 到目前为止,这似乎并没有显著降低我的其余代码的速度,但我确信,如果这种情况发生变化,我一定会回来的。

    感谢您的帮助! 非常感谢!

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

    您好,Adevries:

    是的,我 经常看到,当您无法获得数据包标头时,管理UART可能很困难。 现在听起来不错,感谢您结束循环。 很高兴我提供的见解很有帮助

    此致,

    Ralph Jacobi