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.

[参考译文] TM4C1230H6PM:有关正在接收的数据大小可变的 UART RX DMA 的问题

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

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1434987/tm4c1230h6pm-question-about-uart-rx-dma-with-variable-size-of-data-being-received

器件型号:TM4C1230H6PM

工具与软件:

大家好、我使用 TM4C1230H6PM 来接收 UART 数据(以及其他用途)。  在我的用例中、我可能会在几秒钟内随机接收到几个字节的数据。  在其他情况下、我可以 一次性发送超过500字节的数据。

我所遇到 的问题 、与我去年提出的 国强的回答类似。  但是、它略有不同、这次我可以控制 发送器侧和接收器。

在 Tiva 端(接收器)、乒乓模式似乎是我用例中最好的 DMA 模式、我遇到的问题是我要 为 DMA 缓冲器选择的大小。

如果我选择了更小的大小、比如64字节、如果在我接收到500字节数据时正在处理一个更高优先级的中断、  那么在我能够处理 DMA 中断之前、可能会先填充我的主缓冲区和备用缓冲区。

如果我选择了更大的缓冲区、例如512字节、每次我想尽快处理3字节数据时、我都必须发送完整的512字节。  这似乎是一个巨大的浪费,使发件人发送512字节时,它实际上只需要发送 3字节。

我缺少什么吗?  是否有一种我没有想到的更好的方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价用户 id="467243" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1434987/tm4c1230h6pm-question-about-uart-rx-dma-with-variable-size-of-data-being-received "]

    如果我选择了更小的大小、比如64字节、如果在我接收到500字节数据时正在处理一个更高优先级的中断、  那么在我能够处理 DMA 中断之前、可能会先填充我的主缓冲区和备用缓冲区。

    如果我选择了更大的缓冲区、例如512字节、每次我想尽快处理3字节数据时、我都必须发送完整的512字节。  这似乎是一个巨大的浪费,使发件人发送512字节时,它实际上只需要发送 3字节。

    [报价]

    您好、Terence、

     由于 UDMA 在优先级方面对您最重要、因此、您为什么不只简单地提高 UDMA 中断的优先级而不是其他中断的优先级。 中断优先级是可编程的。 请参阅以下 API 和示例。 增加您的 UDMA 优先级将确保它不会被其他中断优先。  

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

    你好查尔斯,谢谢你的答复。  提高中断优先级肯定是可行的、我愿意尝试这样做。  

     这样做有几个问题:

    1. 我使用 SysTick 中断来跟踪系统正常运行时间、并且不希望延迟该时间。
    2. 此外、通过许多不想被中断的外设、我还经常进行 I2C 通信。  不过、我可以解决该问题。

    大多数情况下、我的问题的重点是、我只想确保没有错过在我的案例中比乒乓模式效果更好的 UDMA 功能。   您是否同意 我还不能使用更好的模式或 uDMA 技术?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最主要的是、我的问题是、我只是想确保我没有错过一个在我的情况下比乒乓模式效果更好的 uDMA 功能。   您是否同意 我还不能使用更好的模式或 UDMA 技术?

    您好、Terence、

     正如我在上一篇文章中提到的、除了一些指示传输完成的状态寄存器外、不存在 UDMA 的内部工作可见性。 请记住、uDMA 不知道传入数据的长度可以是可变的。 当可编程传输计数传输完成时、它只会中断完成。 根据具体情况、 我还建议您 在有效负载中设计一个协议方案、用于指示预期的传输次数。 例如、您始终可以添加一个指示传输长度的标头字节。  例如、假设您要接收500字节的数据。 当您在传输64个字节后收到 uDMA 中断时、您将知道仍有500-64=436字节。 为了使其余字节不被 I2C 或其他中断中断中断、您可以为其他字节禁用中断、直到您接收并处理这500个字节。 这只是一个想法、我希望你能有更好的计划。  

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

    再次感谢、Charles。  始终提供高质量的答案。  是的、 正如您所建议的、我一直在尝试一些有关更智能的通信协议的想法。  我认为、正如您所建议的那样、我应该能够在这与增加中断优先级之间找到 一个合理的解决方案。

    一如既往、非常感谢您的帮助。