Embedded 为什么在UART RX FIFO中提供FIFO四分之一满、半满、四分之三满中断?它们的用例是什么?

Embedded 为什么在UART RX FIFO中提供FIFO四分之一满、半满、四分之三满中断?它们的用例是什么?,embedded,microcontroller,uart,fifo,isr,Embedded,Microcontroller,Uart,Fifo,Isr,我正在实现一个协议解码器,它通过微控制器的UART接收字节。ISR从UART外围设备获取字节并将其放入环形缓冲区。主循环从环形缓冲区读取数据,并运行状态机对其进行解码 UART内部有一个32字节的接收FIFO,并在该FIFO为四分之一满、半满、四分之三满和完全满时提供中断。我应该如何确定这些中断中哪些应该触发我的ISR?所涉及的权衡是什么 注意-该协议涉及32字节(固定长度)的数据包,每10ms发送一次。给定基于数据包的协议和一个UART,当接收到多个字节时会中断,考虑如果接收到数据包的最终字节

我正在实现一个协议解码器,它通过微控制器的UART接收字节。ISR从UART外围设备获取字节并将其放入环形缓冲区。主循环从环形缓冲区读取数据,并运行状态机对其进行解码

UART内部有一个32字节的接收FIFO,并在该FIFO为四分之一满、半满、四分之三满和完全满时提供中断。我应该如何确定这些中断中哪些应该触发我的ISR?所涉及的权衡是什么


注意-该协议涉及32字节(固定长度)的数据包,每10ms发送一次。

给定基于数据包的协议和一个UART,当接收到多个字节时会中断,考虑如果接收到数据包的最终字节,但最终字节不足以填充FIFO超过阈值并触发中断,将会发生什么。您的应用程序是否只是在接收到后续数据包并且FIFO最终填充足够的数据包之前不会接收到该不完整的数据包?如果另一端正在等待响应,并且从未发送另一个数据包,该怎么办?或者您的应用程序应该轮询UART以检查UART FIFO中剩余的延迟字节吗?使用中断和轮询接收字节似乎过于复杂

使用我实现的基于数据包的协议,UART驱动程序不依赖UART FIFO,并将UART配置为在单个字节可用时中断。这样,驱动程序会收到每个字节的通知,并且数据包的最后一个字节不可能留在UART的FIFO中

UART的FIFO可以方便地用于流协议(如音频或视频数据)。当驱动程序接收到数据流时,总是会有输入的数据不断填充FIFO。驱动程序可以依靠UART的FIFO来缓冲一些数据。通过每个中断处理多个字节并降低中断率,驱动程序可以更高效


你可以考虑使用UART FIFO,因为你的包是固定长度的。但是考虑一下,如果一个字节由于噪声或其他原因而被丢弃,那么驱动程序将如何恢复。我认为对于基于数据包的协议,最好还是不要依赖FIFO,不管数据包的长度是否固定。

给定一个基于数据包的协议和一个在接收到多个字节时中断的UART,考虑如果接收到数据包的最终字节,但最终字节不足以填充FIFO超过阈值并触发中断,将会发生什么。您的应用程序是否只是在接收到后续数据包并且FIFO最终填充足够的数据包之前不会接收到该不完整的数据包?如果另一端正在等待响应,并且从未发送另一个数据包,该怎么办?或者您的应用程序应该轮询UART以检查UART FIFO中剩余的延迟字节吗?使用中断和轮询接收字节似乎过于复杂

使用我实现的基于数据包的协议,UART驱动程序不依赖UART FIFO,并将UART配置为在单个字节可用时中断。这样,驱动程序会收到每个字节的通知,并且数据包的最后一个字节不可能留在UART的FIFO中

UART的FIFO可以方便地用于流协议(如音频或视频数据)。当驱动程序接收到数据流时,总是会有输入的数据不断填充FIFO。驱动程序可以依靠UART的FIFO来缓冲一些数据。通过每个中断处理多个字节并降低中断率,驱动程序可以更高效


你可以考虑使用UART FIFO,因为你的包是固定长度的。但是考虑一下,如果一个字节由于噪声或其他原因而被丢弃,那么驱动程序将如何恢复。我认为对于基于数据包的协议,最好还是不要依赖FIFO,不管数据包的长度是否固定。

这取决于很多因素,最重要的是支持的最大波特率,以及应用程序执行其他任务所需的时间

传统的环形缓冲区是以每字节中断为基础工作的。但是减少中断的次数当然总是好的。你多久让它触发一次可能并不重要

更重要的是实现双缓冲区方案。当然,您不应该直接从单个环形缓冲区开始运行状态机解码。这将变成一场比赛条件的噩梦

您的主程序应该点击信号灯/禁用UART中断,然后复制整个缓冲区,然后允许中断。理想情况下,缓冲区复制是通过更改指针来完成的,而不是硬拷贝。需要对执行此操作的代码进行基准测试,以使其执行速度超过1/波特率*10秒。其中10为:1开始,8数据,1停止,假设UART为8-N-1


如果可用,请通过软件环形缓冲区使用DMA。

这取决于很多因素,最重要的是支持的最大波特率,以及应用程序执行其他任务所需的时间

传统的环形缓冲区是以每字节中断为基础工作的。但是减少中断的次数当然总是好的。你多久让它触发一次可能并不重要

更重要的是实现双缓冲区方案。当然,您不应该直接从单个环形缓冲区开始运行状态机解码。这将变成一场比赛条件的噩梦

您的主程序应该点击信号灯/禁用UART中断,然后复制整个缓冲区,然后允许中断。理想情况下,缓冲区复制是通过更改指针来完成的,而不是硬拷贝。需要对执行此操作的代码进行基准测试,以使其执行速度超过1/波特率*10秒