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/OMAPL138B-EP:OMAP-L138的 UART2:在中断 EDMA 模式或仅中断模式下接收器通道上丢失字符

Guru**** 2606725 points
Other Parts Discussed in Thread: OMAP-L138, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584933/rtos-omapl138b-ep-uart2-of-the-omap-l138-lost-characters-on-receiver-channel-in-interrupt-edma-mode-or-in-interrupt-only-mode

器件型号:OMAPL138B-EP
主题中讨论的其他器件:OMAP-L138SYSBIOSOMAPL138

工具/软件:TI-RTOS

你好!

 

我在 OMAP-L138 SOC 的 C674xDSP 上有一个项目。 该项目使用 OMAP-L138 SOC 的片上 UART2。 在中断 EDMA 模式或仅中断模式下、接收器通道上的字符丢失存在一些问题。

 

SOC 的 GPP 正在运行 QNX、但 GPP 未触摸 UART2。

DSP 项目使用以下软件包:

 DSPBIOS 5.41.03.17

 PSP 驱动程序01.30.01

 OMAP-L138 DSP 封装1.00.00.08

 EDMA3lld 封装01.11.00.03

UART 以115200波特或(在大多数情况下) 230400波特运行。 要发送和接收的数据流在字符之间仅持续存在一段小间隔(< 1毫秒)。 在大多数情况下、字符之间没有任何间隙。 但只有很少有较长的间隙(>100毫秒)。 为了减少 CPU 负载、字符以64个字符的块读取、而不是读取"按字符"。 为了确保立即(在2毫秒内)处理所有接收到的字符、将从读取数据

超时为1毫秒的 RX 迷你驱动器。

 

在间隔时间较长(>100毫秒)的情况下、接收到的字符数很少、超过缓冲区的大小、并且会发生超时。 在超时中止 GIO_Submit ()/GIO_Read()调用之前,我还没有找到获取接收到多少个字符的信息的方法。 如果 GIO_Submit ()/GIO_Read()调用返回 IOM_Completed、则函数会根据给定的限制接收到字符数。 在这种情况下,GIO_SUBMIT ()/GIO_READ()函数的 length-parameter 被设置为给定的最大字符数,一切都正常。 但是、如果是 GIO_SUBMIT ()/GIO_READ()函数、则返回 IMO_ETIMEOUT 或 IMO_ETIMEOUTUNTEC 的 length-parameter

由 DSP-BIOS 的 GIO_SUBMIT ()函数始终设置为0 -尽管收到一些字符(小于允许的长度参数),但这些字符仍存储在缓冲区中。

返回值 IOM_ETIMEOUTUNTEC 是由 DSP-BIOS 的 GIO_SUBMIT ()函数引起的。 在 GIO_SUBMIT ()函数对 GIO->SEMPEND()函数的调用超时的情况下,GIO_SUBMIT ()函数始终将 length-parameter 设置为零。 之后,GIO_SUBMIT ()函数使用命令 ID IOM _CHAN_timedout 调用迷你驱动程序的 mdControlChan 函数 uartMdControlChan ()。 这是 PSP 的 UART 迷你驱动程序的问题、因为该迷你驱动程序不知道此命令 ID。 因此迷你驱动程序的 uartMdControlChan ()函数返回 IOM_ENOTIMPL。 这将导致 DSP/BIOS 的 GIO_SUBMIT ()函数返回 IOM_ETIMEOUTUNCES... 这不是很好、但我可以处理这种行为。 另一件事是 DMA 和 UART 保持活动状态、并且不会执行任何操作来停止进行中的 IO。 我的应用层在 IOM_ETIMEOUTUNTEC 情况下的变通方法是使用命令 ID UART_IOCTL_CANCEL_CURRENT 来调用 GIO_CONTRARINL ()。

但是、无论如何、我的问题是、我必须处理所有接收到的字符-在超时的情况下也是如此。 尽管在缓冲区中接收到字符、但将 legth/paramther 设置为零。

由于波特率高达230400、因此将接收缓冲区大小限制为仅一个字符的方法很糟糕、因此 CPU 负载会增加。 因此、我更喜欢 UART 驱动程序的 DMA 中断模式或至少具有活动 FIFO 的中断模式。 但是、如何获取信息、在超时发生之前、接收到多少个字节?

我刚刚尝试修改了 UART 驱动程序的源代码。 我已经将命令 ID IOM_CHAN_timedout 添加到驱动程序的函数 uartMdControlChan()中。 如果解析了此命令 ID、则如果发生缓冲区已满事件、则通过根据该命令运行序列来停止当前 IO。 在这里、我可以访问以前接收的字符数、但从小型驱动程序的角度来看、无法将此信息提供给 DSP_BIOS 的 GIO_SUBMIT ()函数、也无法提供给应用层。 当然、最好的方法是使 UART 驱动程序保持"原样"、并通过另一种方式获取应用程序接收到的字符数...

 

希望有人能帮我、

此致、

Uwe

 

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

    我已通知 RTOS 团队。 他们的反馈将在此处发布。

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

    您使用的软件非常旧(2010年以来没有发布)、不再受支持。 您能否将软件更新为基于 SYSBIOS 的 MCSDK 1.1。

    请告诉我们这是否是一个使用此基准软件的旧项目、我可以检查我们是否可以获得有关此问题的帮助。 由于您使用的是增强型器件产品版本、您能否指定此问题是否与温度相关?

    通常、当字符丢失时、这可能意味着 EDMA 能够传输数据之前 FIFO 已过流。 您是否尝试将传输的字符数减少到32、16或8、以查看问题是否仍然存在。 低速115.2Kbps 时是否也会出现此问题。

    我们在处理器 SDK 中提供的更新的 TI RTOS 驱动程序可解决当数据小于 FIFO 大小时占用 FIFO 的问题。 我们计划很快在 OMAPL138上支持此驱动程序、但这些更新不会再移植到 DSP BIOS 驱动程序中。 我为您提供一个指针以供参考。
    git.ti.com/.../v0

    此致、

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

    您好、Rahul、

    抱歉、我无法更新到更高的 DSP-BIOS/ SYSBIOS 版本。 这是一个旧项目、我们公司的活动在欧洲、亚洲和澳大利亚的许多国家/地区的铁路系统的安全关键领域。 DSP 的操作系统是"所有基础的基础",而对另一基础的更改将意味着每个国家/地区的主管部门都要进行新的认证,软件测试,... 我的老板不能接受这笔钱、人的力量和时间的成本。

    我想这不是 OMAP-L138芯片版本的问题。 我在一个电路板上进行了测试、该电路板由我们公司于2010年夏季生产、也在今年1月生产的另一个电路板上进行了测试。 两个电路板都出现问题。

    温度依赖性也不是导致此行为的原因。 在我的实验室中、我有大约20摄氏度的温度。 我们的产品在挪威基律纳和阿拉伯半岛运行。 在过去的几年中、我从未听说过有关 CPU 温度问题的任何信息。 因此、我想所有其他 OMAP 片上器件的 UART 都有温度问题的可能性非常低...

    Rx 数据块的大小(GPIO_READ()函数的长度参数)也不是问题。 如果我从任何位置(我使用 TeraTerm 终端)传输的数据小于此长度、我可以将此长度设置为大于1的任意大小、并等待超时数据出现在我的缓冲区中、 但是 length 变量始终由 GPIO_READ()函数设置为零。 这种行为在波特率低得多的情况下也是一样的。 我尝试了115200、57600、19200。

     

    Uwe