主题中讨论的其他器件:OMAP-L138、 SYSBIOS、 OMAPL138
工具/软件: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