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.

[参考译文] AM2432:AM2432:UART 寄存器访问时间

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1464774/am2432-am2432-uart-register-access-time

器件型号:AM2432

工具与软件:

我们在内核 R5_1_0上的其中一个 ISR 中包含以下代码、该代码的执行时间很长:

AM2432在800MHz 上计时、代码从 MSRAM 运行。

观察到的变量 tt 的最小值为224、这意味着从 FIFO 寄存器中读取一个字节并将其存储在缓冲器中需要大约280ns (加上缓冲器索引增量和时间测量)。

顺便提一下、在串行线的另一端、我们有一个时钟频率为100MHz 的 F280021。 我们得到同样的习语:

FIFO_READ_TIME = 8、即80ns。

这意味着、就时钟周期而言、AM2432比 F280021慢28倍、甚至就实时而言、两者之间也有3.5倍。

这让我觉得 AM2432有问题。

对于如何加快读取 AM2432上接收到的 UART 数据的过程、我非常感谢提供任何提示。

此致

Johannes

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

    您好  Johannes:

    该主题专家目前在本周不在办公室。 请预计响应会延迟。 感谢您的耐心。

    此致、

    Anil。

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

    尊敬的 Anil:

    是否有关于此问题的任何更新?

    此致

    Johannes

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

    您好、Johannes:

    我们在内核 R5_1_0上的其中一个 ISR 中有以下代码执行需要相当长的时间:

    ISR 中还运行着其他哪些内容? ISR 的优先级是什么? 当您尝试读取该字符时、FIFO 是否为空?

    如何将数据发送到 UART?

    在 F280021上运行的代码也会在 ISR 上下文中执行?

    此致、

    Tushar

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

    在从 RX FIFO 进行读取之前、我们要将8个字节写入 TX FIFO 寄存器 T_HR。  从 RX FIFO 读取数据后、有一些控制代码我不知道它如何与我的问题所涉及的寄存器读取计时相关。

    ISR 的优先级是什么?

    它是 ePWM 启动的、优先级为5的 FIQ。 当引用的代码被另一个 ISR 中断时、我看到时间>2000*1.25ns。

    尝试阅读该字符时 FIFO 是否为空?

    所引用代码实际上是循环的一部分、在循环中、我们通常从 FIFO 中读取12个字节(只要 FIFO 根据寄存器 LSR 位 FIFO_E 不为空)。

    如何将数据发送到 UART?

    你这么说是什么意思?

    在 F280021上运行的代码也是从 ISR 上下文执行的?

    有。

    此致

    Johannes

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

    您好、Johannes:

    当引用的代码被另一个 ISR 中断时、我看到时间>2000*1.25ns。

    很抱歉、我不明白上述说法。 您能详细说明一下吗?

    代码当前位于 ISR 中、还是另一个 ISR 优先于它?

    您的意思是什么?

    我一直在问、数据是如何发送到 UART 终端/端口的?

    此致、

    Tushar

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

    您好、Johannes:

    此外、您能否确认在版本配置文件中生成项目时是否观察到上述结果?

    如果不是、请为发布配置文件构建该配置文件并分享结果?

    此致、

    Tushar

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

    e2e.ti.com/.../Example_5F00_demonstrating_5F00_long_5F00_UART_5F00_register_5F00_access_5F00_times.zip

    我已经从 mcu-plus-sdk 修改了 uart_echo_polling_lld_am243x-evm_r5fss0-0_nortos_ti-arm-clang 示例、以演示该问题。

    它基本上具有以下功能:

    1. 等待用户输入8个字符(它会等待它们到达 UART RX FIFO)。
    2. 使用 API 函数 UART_LLD_READ ()读取数据并测量所需时间。
    3. 要求用户再输入8个字符并等待它们到达 UART RX FIFO。
    4. 直接从 UART FIFO 寄存器 RHR 读取数据并测量所需时间。

    这是我得到的输出:

    这是 UART 回波测试轮询模式
    接收2 x 8个字符、然后回显。 请输入8个字符..
    12345678
    使用 UART_LLD_READ ()读取8个字符的时间:readTime=17221 1.25ns 周期。
    输入另外8个字符!
    12345678
    直接从 UART FIFO 寄存器读取8个字符的时间 RHR:readTime=2152 1.25ns 周期!

    API 函数读取8个字符所需的17221个周期非常长!

    但直接从 FIFO 寄存器读取8个字节需要2152个周期(2.69 µs)。 这比我们预期的要长得多!

    请告诉我们如何更快获取数据。 我们真诚地希望、这只是因为我们方面的配置有误。

    此致

    Johannes

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

    尊敬的 Tushar:

    您是否能够重现我描述的问题?

    此致

    Johannes

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

    您好!

    我将继续处理这一问题。

    请允许我用您发送的测试代码在几天内重现此问题。

    此致、

    Vaibhav

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

    您好 Johannes

    您能否确认在调试编译或版本编译中捕获了上述结果?

    如果您在调试编译中捕获了结果、请尝试在版本编译中捕获相同的结果?

    此致、

    Anil。

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

    Anil、您好!

    我用约翰内斯的项目复制了结果。 时间测量为:

    调试:

    使用 UART_LLD_READ ()读取8个字符的时间:readTime=21942 1.25ns 周期。<\r\n>
    直接从 UART FIFO 寄存器读取8个字符的时间 RHR:readTime=2221 1.25ns 周期!<\r\n>

    发布:

    使用 UART_LLD_READ ()读取8个字符的时间:readTime=17215 1.25ns 周期。<\r\n>
    直接从 UART FIFO 寄存器读取8个字符的时间 RHR:readTime=2139 1.25ns 周期!<\r\n>

    您会获得哪些测量值?

    在我看来、编译器设置在这里的影响很小。 尤其是在我们访问 UART_RHR 裸机时。

    我们需要有关 AM243x SOC 的内部访问时间以及如何修改这些时间的信息。  

    BR
    Alexander

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

    您好!

    我已经能够在 TI EVM 上的设置中重现此问题。

    我已经在 AM64x-SK 上运行该示例、而不是在 AM243x-EVM 上运行该示例、因为 UART 的驱动程序基本相同。 我也获得了类似的结果。

    请允许我有时分析这个问题。

    此致、

    Vaibhav

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

    您好、Vaibhav、

    我认为我们不能进一步调试这个问题、因为 R5F 内核在使用 TI API 的发布模式下、几乎需要~21 USC 才能从 FIFO 读取8个字节。

    UART ICLK 以125MHz 运行、与125MHz 相比、UART I CLK 的增加最多。

    我们需要与内部团队核实、以便进一步讨论测试结果。

    此致、

    Anil。

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

    您好 Johannes/Alexander、

     您能不能    在 TCM 而不是 MSRAM 上保留 FIFO 读取代码和读取缓冲区、并了解在发布版本构建中可以改进多少时间?

    此致、

    Anil。

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

    Anil、您好!

    仍然没有太多的改进:

    发布构建、映射文件:

    00000041 UART_ECHO_POLLING_LLD   
    00000740 gUartReceiveBuffer   

    结果为:

    使用 UART_LLD_READ ()读取8个字符的时间:readTime=17191 1.25ns 周期。<\r\n>
    直接从 UART FIFO 寄存器读取8个字符的时间 RHR:readTime=2159个1.25ns 周期!

    BR
    Alexander

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

    你好亚历山大/未来的读者,

    上述结果是、FIFO 模式  向 RHR 寄存器读取数据8次、SOC 花费了大约2.6us 来完成操作。

    这是可以接受的、超过此值、时间不能进一步减少。

    SOC 读取一个32位数据几乎需要200ns - 400ns。

    此处、在上面的示例中、用户将向8个字节的数据读取数据、大约需要8 * 0.2usec 或8 * 0.4usec = 1.6usec 或3.2usec。

    如果用户希望加快 UART 的处理速度、则用户应使用 DMA、当用户使用 DMA 时、如果 UART 数据较少、如8或12字节、 那么使用 DMA 也没有好处、因为启动 DMA、SOC 需要控制 DMA 起始寄存器(这是64位的)才能完成此操作。要完成此操作、SOC 可能需要大约0.4us 的时间到0.8us 的时间、与此一起、用户应对缓存操作的写入和读取周期造成损失。 所以、使用较低的字节时、DMA 并没有得到太大的改善。

    此致、

    Anil。