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.

[参考译文] SysConfig-AM243X:uart_echo_DMA_LLD 问题:MCU-PLUS-SDK 在使用两个 UART 时出现问题

Guru**** 2455560 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1473656/mcu-plus-sdk-am243x-uart_echo_dma_lld-problem-sysconfig-problem-when-using-two-uarts

器件型号:MCU-PLUS-SDK AM243X
主题中讨论的其他器件:SysConfig

工具与软件:

您好、专家。

我正在使用 motor_control_sdk_am243x_09_02_00_09、CCS 12.6、SysConfig 1.21.1。

我使用 uart_echo_dma_Lld_am243x-evm_r5fss0-0_nortos_ti-arm-clang 示例、我只需在 DMA 模式下添加另一个 UART。 结果是自动生成的 SysConfig 代码中存在编译器错误:

e2e.ti.com/.../1602.example.syscfg.zip
构建文件:"syscfg/ti_drivers_open_close.c"

[...]

SYSCFG/ti_drivers_open_close.c:136:19:错误:重新定义"gUartDmaChCfg"
UART_UdmaChConfig gUartDmaChCfg[CONFIG_UART_NUM_DMA_LLD_EVENTS]=
^μ A
SYSCFG/ti_drivers_open_close.c:100:19:注意:上一个定义在这里
UART_UdmaChConfig gUartDmaChCfg[CONFIG_UART_NUM_DMA_LLD_EVENTS]=
^μ A
生成1个错误。
gmake:***[syscfg/ti_drivers_open_close.o]错误1.

 

当我删除第二个 UART 并再次插入时、问题就消失了、这次是在轮询模式下。

代码生成似乎存在问题。 有权变措施吗?

BR

Alexander

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

    您好!

    我能够重现此问题。

    由于 SysConfig 驱动程序文件在大多数 Sitara SoC 之间共享、因此我也能够在 AM64x TI EVM 上重现此文件。

    请注意、我导入了 UART 回显 DMA LLD 应用、然后继续操作、再添加了一个 UART 端口、将传输模式设置为 DMA、然后将 SDK 基础架构设置为 LLD。

    发布此帖子时、我具有相同的构建错误。

    请允许我有时调查这是否是预期的、否则我将提出一个内部错误以修复这一问题。

    此致、

    Vaibhav

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

    您好、 Alexander、

    我认为传输 DMA 12字节数据对您的要求没有太大的 DMA 益处。

    我的建议是、请尝试衡量 DMA 完成其操作所需的时间。

    在 DMA 启动之前启动计时器( udma_ringQueueRaw )并在 DMA 中断发行版构建中的回调后停止。

    这个时间可以提供一些见解,真正满足测量时间是可以接受的,你的要求或不.

    稍后我们可以讨论 DMA 分离功能。

    此致、

    Anil。

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

    您好!

    我进一步调试了 SysConfig 生成的文件、很明显、当我们添加两个特定外设的实例时、预期的呈现文件应如下所示。 以下是 I2C 两个实例的示例。

    但是对于 UART、我们看到它与 UART DMA LLD 加法的情况不同。 以下代码片段在 ti_drivers_open_close.c 文件中生成两次。

    相反、它应该更像这样:

    我提出了一个内部错误来解决此问题。

    此致、

    Vaibhav

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

    尊敬的 Anil:

    我设法分离了 DMA 初始化、正如 您建议的那样。

    从调用 udma_ringQueueRaw 到回调的时间大约为2200个周期= 2.75us。 这是一个不错的结果、但 我认为没有意义:12字节@ 115200波特的纯 UART 传输时间应约为1ms (12 * 10 / 115200 = 0.001s)。 这表明可能回调并不是真正的传输结束、正如 本线程中所讨论的那样

    我们在代码中重新触发 DMA (从 调用 udma_ringQueueRaw 到其返回后)所花费的时间是 关于0.5 µs、这对我们来说是一个很好的解决方案。

    我仍然缺少一个可以摆脱回调函数的方法。 您能否提供一个简短的示例、说明如何轮询"DMA 就绪"而不是使用回调进行轮询?

    BR
    Alexander

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

    您好、 Alexander、

    真的很棒的是、根据我们的建议、DMA UART 功能可以分为 init 和 dma start 两种、使它们 能够正常工作。

    我会在轮询模式下使用 DMA、大家可能会在下周之内得到回复。

    此致、

    Anil。

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

    您好、 Alexander、

    我会在版本构建中自行测量。 请检查我的结果。

    在我的测试用例中、我使用了 GTC 计时器来测量结果。

    我按照下面的步骤操作。

    在 DMA 启动前启动计时器  

    回叫后停止计时器  

    取它们的差值、这将提供时间。

    在我的示例中、我使用的是94字节的传输、波特率为115200。

    如果我计算的理论时间完成数据传输与 UART DMA 是8.15毫秒,在我的测试中也, 我得到相同的结果8.15ms。

    我觉得您的衡量方式不正确。

    您能确认您是如何测量的吗? 您使用的计时器是什么? 您使用的是 FreeRTOS 还是 NORTOS 应用程序?

    结果变量值为8151 usec。

    此致、

    Anil。