概述:
这在某种程度上是基于 上一个线程的结果的延续,重点是TM4C上的特定UART用例。
使用案例:
在此TI-RTOS应用程序中,将有一个主要的高优先级任务。 其 唯一 目的是 通过UART @ 11.52万 8-N-1接收32字节有效负载,每隔10毫秒。
在此有效负载中,有一个2字节的标头和2字节的脚注,它们是固定值,不会更改。
标题 | 正文 | 页脚 |
字节[0:1] | 字节[2:29] | 字节:[30:31] |
TM4C将运行其他优先级较低的任务,但除了看门狗之外,此UART RX任务在优先级方面将排在下一。
选项:
正如我所看到的,我有三个主要选项来有效接收和处理此数据。 我已将每个 选项作为概念验证实施,但基于这些实施, 其中两个选项有 一个通用错误路径,这就是发布此帖子的原因。 以下选项按性能顺序列出,其中#1是性能最低的解决方案。
- 创建一个任务,为通过UART接收的每个字符触发Hwi。 根据字符序列,检测页眉,数据,页脚并相应地进行解析。 这种办法的主要缺点是需要改变背景。 由于这些中断将以Hwi的形式触发,并且Hwi在RTOS中具有最高优先级,因此您将在接收数据时不断中断其他任务。
- 创建一个利用具有UART的DMA的任务, 类似于 TI提供的现有UART Echo示例。 在这种情况下,您需要手动设置读取和休眠(非阻塞),直到UART_INT_DMARX Hwi触发器。 触发后,您可以拉出32个字节并根据需要进行解析。
- 创建一个与上面第2个任务非常相似的任务,但 通过使用 UDMA_MODE_Pingpong进行了优化。 基本上,当一个缓冲区被填满(B)时,您可以处理以前收集的缓冲区(A),反之亦然。
结果:
在选项2和选项3中,在"快乐之路"情景中,他们表现良好。 但是,它们都存在相同的问题;如果您未收到完整的32字节有效负载,该怎么办? 由于我们使用DMA来促进UART RX,因此只有当DMA缓冲区已满(每32字节)时,Hwi才会触发。 如果您只收到32个字节中的10个字节,然后又收到一个新帧,那么从分析角度来看,您将不同步。
我尝试使用中断掩码,如 UART_INT_RT和 UART_INT_be,我想,也许通过启用这些位, 如果FIFO不是空的,并且在(n)个周期后没有收到数据,则会触发HWi。 但是,我想,由于我使用DMA, 从FIFO到目标地址的传输几乎会立即发生,这意味着FIFO永远不会真正处于剩余数据的状态(我这么说是否正确? 对该项不是太自信)
问题:
所以我想这是一个很长的问题,当将DMA与UART一起使用时,有没有办法知道预期的有效负载何时不完整。例如,您希望读取32字节,但只收到8字节? 我的第一个想法是简单地使用计时器来跟踪接收到的字节之间的增量,但再次强调,由于我使用的是DMA,我只能在收到所有32个字节时获得Hwi,而我要尝试捕获它们不是的用例。
我觉得这个问题以前已经解决了,所以我想我会在尝试重新发明车轮之前提出这个问题。
谢谢!