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.

[参考译文] MCU-PLUS-SDK AM263X:具有超时功能的串行端口不工作?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1377357/mcu-plus-sdk-am263x-serial-port-with-timeout-not-working

器件型号:MCU-PLUS-SDK AM263X

工具与软件:

你(们)好

我在超时 UART_READ 方面存在问题。

示例为 uart_echo:

在 DebugP_LOG 和 driverClose 之间的末尾添加了如下代码:

DebugP_LOG ("所有测试均已通过!\r\n ");

for (int i=0;i<30;i++)

trans.buf =&gUartReceiveBuffer[0U];
TRANS.COUNT = APP_UART_RECEIVE_BUFSIZE;
trans.timeout = 1000;
transferOK = UART_read (gUartHandle[CONFIG_UART_CONSOLE]、&TRANS);

DebugP_LOG ("读取%d ->确定=%d\r\n"、i、transferOK);
}


Board_driversClose ();

即~1秒的超时读取、串行在此处没有任何内容(使用简单的文本控制台发送回显示例所需的8个字符)。

控制台如下所示:

12345678
所有测试均已通过!!
读取0 ->正确=-1
读取1 ->正确= 0
读取2 ->正确= 0
读取3 ->正确= 0

基本上,我得到的是第一次尝试失败,然后我得到 SystemP_SUCCESS 无论我尝试了多少,它可以看到,只有第一次尝试等待1秒,然后它 几乎立即返回。

罪魁祸首似乎是 UART_v0.c 的这部分:

该函数的返回地址为0时、UART_LLD_readIntr 上的状态似乎为-1、该错误是正确的(必须超时)。  

我是不是做错了什么? 超时不应与阻塞/中断一同工作?

此致、

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

    我进行了更多的调试、但 uart_v0.c 中可能存在错误:

    红色箭头处的状态显然为-1、因此 UART_LLD_readIntr、它仍在返回 TIMEOUT (正确)、但代码将在第706行"修复"此成功案例、指出:
    /*
    *对于回调模式、立即返回成功、
    *事务完成后,回调函数
    *将返回事务状态和实际
    *读数
    */

    但是、这里的事务已更改、计数是请求的值、而不是读取的值。

    如果没有读取的字节并且退出是超时的原因、我认为在这里成功是不可行的。 或者至少需要在一定程度上将读取计数更新为0。

    否则、上层代码将不会知道故障。

    一个很好的示例是来自 SDK 的 XMODEM 1 char 接收函数-如果我们尝试执行 清除操作、这将在清除循环中永远锁定自己、因为无论是否存在真实数据、UART_READ 都将始终返回成功。

    我胡乱猜测 IF 结构结构是错误的:
    如果((SYSTEMP_SUCCESS == STATUS)&&
    (object->PRM.readMode == UART_transfer_mode_blocking))

    此情况仍处于阻塞状态(无回调):  

    还检查了 PRMs.readMode、它确实为0、即 UART_TRANSFER_MODE_BLOCKING。

    我想说、if 应该不带  SystemP_SUCCESS ==状态、并将阻塞模式和回调模式完全分开处理。

    或者在第706行区分这两种模式、而不是返回成功的阻塞?

    我缺少什么或者这确实是一个错误吗?

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

    尊敬的 Barna:

    感谢您分享您的见解。 我可以确认这是有效的错误、需要更改逻辑处理方式。

    我已经提交了错误(MCUSDK-13380)。 我很快将分享一个解决该问题的补丁。  

    此致、
    Shaunak

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

    e2e.ti.com/.../uart_5F00_v0.c

    尊敬的 Barna:

    我要附加更新后的 uart_v0.c 驱动程序文件。 该文件在 UART_READ()和 UART_WRITE () API 中有更改以处理错误情况。

    请使用我已附加的新版本替换您的 uart_v0.c 文件、并使用以下命令重新构建驱动程序库:

    #TO CLEAN EXISTING LIB
    gmake -sj -f makefile.am263x drivers_r5f.ti-arm-clang_clean
    
    #TO BUILD A RELEASE VERSION OF DRIVERS LIB
    gmake -sj -f makefile.am263x drivers_r5f.ti-arm-clang
    
    #To build/clean a DEBUG lib, pass the following flag to the above commands PROFILE=debug

    然后重新构建您的应用、以便正确链接新的 drivers.lib。

    此致、
    Shaunak

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

    修复程序起作用、更重要的是、设法将现有 SDK XMODEM 转换为在 FreeRTOS 下使用此修复程序。

    Ty 的快速修复

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

    仍然有什么问题-如果我在一段时间后开始使用此超时变体、这里会出现"in_use"错误:

    它应该是超时的、而不是闲置...在超时的情况下不会释放读取事务的位置。

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

    尊敬的 Barna Csenteri:

    我将进行深入研究、然后返回我的结果、

    此致、
    Shaunak

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

    尊敬的 Barna:

    在进行某些事务时是否收到 IN_USE 错误?

    此致、
    Shaunak

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

    你(们)好

    否-第一次读取返回超时、其余的操作则以这种方式进行。

    重现步骤:

    -采取同样的例子( UART echo FreeRTOS )

    -使用您通过重新编译的内核发送的 uart_v0,c

    -修改我的测试代码以显示事务状态:

    DebugP_LOG ("所有测试均已通过!\r\n ");

    for (int i=0;i<30;i++)

    UART_Transaction_init (&trans);
    trans.buf =&gUartReceiveBuffer[0U];
    TRANS.COUNT = APP_UART_RECEIVE_BUFSIZE;
    trans.timeout = 1000;
    transferOK = UART_read (gUartHandle[CONFIG_UART_CONSOLE]、&TRANS);
    DebugP_LOG ("读取%d ->确定=%d %d\r\n"、i、transferOK、trans.status);
    }

    Board_driversClose ();
    drivers_close();

    控制台上的结果将为:
    [Cortex_R5_0][UART] Echo example started ...
    所有测试均已通过!!
    读取0 -> ok =-1 -2
    读取1 -> ok =-1 0
    读取2 ->正确=-1 0
    读取3 ->正常=-1 0

    您只能看到第1个调用返回超时(-2)、其余调用返回0。 LLD 代码仅在第一次进入绿线(第1884行)、其余所有案例都变为黄色:

    我猜是没有为超时情况清除缓冲区:


    调用此部分代码时、内部会发生以下情况:

    剩余大小设置为0、但未释放 buf 本身(在这种情况下、不会在任何位置调用 UART_LLD_Transaction _deInit)。

    结果有点死锁- UART_LLD_readIntr 未读取、因为缓冲区未清除、 UART_readCancelNoCB 未工作、因为它检查是否(hUart->readSizeRemaining == 0U)并返回失败。

    我会说  超时情况缺少 UART_LLD_Transaction_deInit、但我不确定应该在何处以及如何添加。

    此致

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

    尊敬的 Barna:

    [报价 userid="59592" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1377357/mcu-plus-sdk-am263x-serial-port-with-timeout-not-working/5281059 #5281059"]

    我猜是没有为超时情况清除缓冲区:

    [报价]

    是的、这是一个问题。 我尝试了在超时情况下清除缓冲区并将缓冲区设置为空。

    for 循环全部30次迭代的输出为"-1 -2"。

    分享我们所做的(非常简单):

    请将以下代码片段添加到之前共享的 uart_v0.c 文件

    然后、请重建驱动程序库和应用程序并重新测试

    此致、
    Shaunak

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

    你(们)好

    我认为它可以正常工作-现在我可以接收1个字节、有超时、然后再接收。

    此修复程序会在下一个 SDK 版本中进行吗?

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

    你好、Barna

    我在办公室里呆了几天。

    是的、这将使其成为官方 MCU+SDK 10.00版本驱动程序。

    感谢您指出这些错误并帮助我们改进驱动程序。

    此致、
    Shaunak