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.

[参考译文] RTOS/PROCESSOR-SDK-AM437X:UART 驱动程序问题

Guru**** 2601915 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640721/rtos-processor-sdk-am437x-uart-driver-issue

器件型号:PROCESSOR-SDK-AM437X

工具/软件:TI-RTOS

你(们)好

我在使用 UART 驱动程序时遇到问题、在每次回调时、似乎我丢失了一个字节。

如果我看一下 c:\ti\pdk_am437X_1_0_8\packages/ti\drv\uart\src\v1\uart_v1.c、它会在 while 循环结束时读取一个字节、但如果大小为0、则该字节会被丢弃!

2.在 UART 驱动程序层(CSL)中,UARTCharGetNonBlocking (HwAttrs->baseAddr)在没有数据时返回-1。 这在 INT8_t 中返回、因此无法接收任何为0xFF????的二进制数据
不过,在 starterware 中,UARTCharGetNonBlocking()返回一个 int (32位)。  那么 UART 驱动程序使用哪个函数?

同样的问题也适用于 INT8_t UARTCharGet (uint32_t baseAddr)。
这是 CSL 中的一个错误、应予以修复。

/*
 * ==== UART_v1_ReadData ===
 * 从 UART 读取和处理数据。
 *
静态内联 Int32_t UART_v1_ReadData (UART_Handle handle、int32_t size);  //针对 Misra 警告*/
静态内联 Int32_t UART_v1_ReadData (UART_Handle handle、int32_t size)

   int32_t            readin;
   UART_V1_Object    *对象;
   UART_HwAttrs const *hwAttrs;

   对象=(UART_V1_Object*) handle ->对象;
   hwAttrs =(UART_HwAttrs*) handle->hwAttrs;
   readin =(int32_t) UARTCharGetNonBlocking (hwAttrs->baseAddr);

   /*接收字符,直到为空或完成。 *
   while ((size!= 0)&&(readin!=(int32_t)(-1)))
   {
       /*如果数据模式设置为文本替换返回,则使用换行符。 *
       if (object->params.readDataMode = UART_DATA_TEXT)
       {
           if ((uint8_t) readin ==((uint8_t)('\r\n')))
           {
               /*回显字符(如果已启用)。 *
               if (object->params.readEcho)
               {
                   UARTCharPut (hwAttrs->baseAddr、((uint8_t)('\r\n'));
               }
               readin =(int32_t)'\n';
           }
       }

       UART_drv_log2 ("UART:(0x%x)读取字符0x%x"、
                     hwAttrs->baseAddr、(uint8_t) readin);

       *(uint8_t *) object->readBuf =(uint8_t) readin;
       object->readBuf =(uint8_t *) object->readBuf + 1;
       object->ReadCount++;
       大小--;

       /*回显字符(如果已启用)。 *
       if (object->params.readEcho)
       {
           UARTCharPut (hwAttrs->baseAddr、(uint8_t) readin);
       }

       /*如果读返回模式为换行,则在接收到换行时完成。 *
       if ((object->params.readReturnMode = UART_return_NEWLINE)&&
           ((uint8_t) readin ==((uint8_t)('\n')))
       {
           UART_drv_log1 ("UART:(0x%x)接收到换行字符、"、
                  hwAttrs->baseAddr);
           大小= 0;
           中断;
       }
       readin =(int32_t) UARTCharGetNonBlocking (hwAttrs->baseAddr);  //这将从 RX FIFO 读取额外的字符-如果存在! 如果大小为0、必须跳过此操作!
   }

   返回值(大小);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尚未回复?

    除上述错误外、我还发现 UART 驱动器在较高负载下非常不稳定。 我有一个230kbaud 的二进制数据传入流、接收每秒~10000字节、同时还发送(远小于~600字节/秒)。 我使用的是 EDMA 以及读写回调函数。

    我在调试驱动程序上花费了太多的时间、并且最终刚刚编写了自己的(基于 UART_v1.c)以便仅使用中断(EDMA 将在稍后提供)并使其立即工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误你的时间。 我已上报请求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉耽误你的时间! 有用于测试 UART 的 UART_BasicExample_evmAM437x_armTestProject、包括回调模式下的 UART 非 DMA 读取写入测试。

    在这种模式下、我输入了精确的16个字符、接收到 UART 并打印到控制台、我没有看到任何缺失的一个字符。 您能解释一下您是如何找到它的吗?  UARTCharGetNonBlocking 使用 CSL 函数。 我将对其进行研究。

    此致、Eric

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

    只需读取代码(我在第一个帖子中添加了该代码-查看突出显示的内容)、就可以很容易地看到 UART 驱动程序中存在错误。

    当在 UART 驱动程序中调用函数 UART_v1_ReadData (UART_Handle handle、int32_t size)时、size 会给出要读取的数据量。

    如果驱动程序(UART_v1_ReadData())读取的数据小于 UART RX FIFO 中的数据,则始终会丢弃一个字节。 当您只是输入字符或设置了所发送字符的确切数量(如测试示例中所示)时、这种情况可能永远不会发生。

    TI 应改进 UART 驱动程序的测试、因为这也会显示其他问题。 在当前状态下、它几乎没有用处(除了简单的 printf 和键盘输入)。 应在更高负载下以异步方式发送和接收来完成测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对此进行了任何更新?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我们仍在查看它。

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

    是的、当 FIFO 为空时、来自 CSL 代码的 UARTCharGetNonBlocking ()返回-1 (0xFF)。 使用 int32_t 转换并将其分配给 readin、它仍然是0xFF、而不是0xFFF_FFFF。 while ()为 true,如果是字节,则读取其他"size",这是一个问题。

    此外、这是在 while 循环之前进行的读取、因此读取的总大小为+1字节。 这也是一个问题。 我们将纠正这种情况。

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

    Hej Eric

    谢谢。

    您还应该知道 UART 驱动程序中的中断处理有问题。 我已经看到驱动程序锁定并看到其他问题。 但在发送数据时、接收到更高的数据负载、这会受到影响。 这就是我编写自己的驱动程序(基于 TI)的原因、该驱动程序稳定且更适合我们使用。