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.

[参考译文] PROCESSOR-SDK-AM64X:UART 轮询读取中存在错误

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1511158/processor-sdk-am64x-bug-in-uart-polling-read

器件型号:PROCESSOR-SDK-AM64X

工具/软件:

大家好!

我使用在轮询模式下配置的 UART 实例从终端读取输入。 我使用 HTerm 作为终端、而不是 CCS 的集成终端。
我有一个简单的应用程序、我使用 DebugP_readline (指向缓冲区的指针、100u)读取输入、可以观察到 UART_readPolling 处于其读取循环中。

现在、我  通过 HTerm 发送带有回车字符的"foo"。 我可以看到缓冲区中填充了我的输入、但应用程序在轮询读取循环中将永远挂起。

该问题是由函数 uart_fifoRead 中的 uart_V0_LLD.c (来自 MCU+ SDK v10.00.00.20)中的错误引起的:

1.循环检查0 != readSizeRemaining
2.  readSizeRemaining 从不在循环内更新,只有 tempReadSizeRemaining 是。 因此、在这种情况下环路永远不会断开

因为我读取输入 DebugP_readline、 readSizeRemaining 将为1、因为它想要按字符读取输入字符:

1. uart_fifoRead 返回(大小- tempReadSizeRemaning)
2.因为 HTerm 总共发送了4个字符的输入字符串、返回值已下溢
3. 尽管已成功读取所有内容、但 UART_readPolling 从不返回。

我想 CCS 终端在每次击键后都会发送输入、这与 HTerm 不同、因为它从不会显示此错误。

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

    您好、

    请允许我在我的设置中检查此项。 我将检查轮询读取和更新您的行为。

    此致、

    Vaibhav

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

    尊敬的 Simon:

    我发现这确实是一个 bug 作为变量  

    已检查 readSizeRemaining、但要检查变量  
    应检查 tempReadSizeRemaining。
    我还注意到、最新的 SDK 版本修复了该问题。
    static uint32_t UART_fifoRead(UARTLLD_Handle hUart, uint8_t *buffer,
                                  uint32_t readSizeRemaining)
    {
        uint32_t tempReadSizeRemaining = readSizeRemaining;
        uint32_t size    = tempReadSizeRemaining;
        Bool isRxReady = FALSE;
        uint8_t *tempBuffer = buffer;
    
        isRxReady = UART_statusIsDataReady(hUart);
    
        while (((Bool)TRUE == isRxReady) && (0U != readSizeRemaining))
        {
            /* once the H/w is ready  reading from the H/w                        */
            *tempBuffer = (UInt8) UART_readByte(hUart);
            tempBuffer++;
            --tempReadSizeRemaining;
    
            isRxReady = UART_statusIsDataReady(hUart);
        }
    
        return (size - tempReadSizeRemaining);
    }
    标记螺纹已关闭。
    此致、
    Vaibhav