串口uart中断方式和查询方式的选择以及高效实现(循环FIFO)

串口uart中断方式和查询方式的选择以及高效实现

1. 中断方式和查询方式的选择

(1) 串口中断方式相比查询方式效率要高。

串口传输速率比较慢。比如对于系统时钟为100MHz的MCU,串口波特率为115200。传输一个字节大概需要10000个时钟周期,所以系统大部分的时间都是在等着收数据或者发数据。如果用中断方式,可以在系统接收和发送数据的间隙去处理一些其他的命令。

(2) 串口中断方式相比查询方式设计要相对复杂,需要更大的堆栈空间和存储空间,例如接收和发送缓存,更大的代码量。

2. 中断方式硬件FIFO接收阈值和发送阈值的设置

(1) 发送FIFO阈值的设置。

这里的发送FIFO阈值指的是当发送FIFO中的数据量小于或者等于该阈值的时候则会产生中断,然后在中断里把需要发送的数据写进FIFO。要想使发送的效率最高,最少的发送时间就是数据的传输时间。这样可以总结出FIFO只要空的时间最少,效率将是最高的。要保证FIFO空的时间最少,阈值就不能设为0,因为当阈值为0的时候,FIFO空的时候才会触发中断,这样就会多出进中断,然后往FIFO里写数的时间。所以阈值要设置为大于0,而且硬件支持的最小值,因为串口发送一个字节的间隙足够把新的数据写进FIFO,这样发送FIFO空的时间将是最少。为什么阈值要设置为大于0硬件支持的最小值呢?因为这样一次进中断将能放进FIFO中更多的数,减少了进中断的次数,提高了效率。

(2) 接收FIFO阈值的设置。

这里接收FIFO阈值指的是当接收FIFO中的数据量达到阈值大小的时候,将会产生中断,然后在中断里把FIFO的数据读出来。当阈值设置为1的时候,每当FIFO有数据,将会触发中断,这样进中断的次数会增多,但是效率并没有降低,因为接受一个字节的数据非常慢,接受数据的间隙足够处理很多命令,总时间还是数据的传输时间。但是进中断次数增多,会不会使得功耗增加,这个有待进一步测试。如果阈值设置的大于1,则会影响接收数据的实效性,而且会增加超时中断的时间。超时中断一般是当接收FIFO中有数,但是连续几个字节传输时间没有读写FIFO,将会产生超时中断。

3. 编程中提高效率的要点

(1) 尽量在发送数据和接收数据的间隙处理其他的一切可以处理的命令。

(2) 数据能分段组包或者分段处理要分段,这样可以在发送数据或者接收数据的间隙去组包或者处理接收的数据,尽量把时间压缩到硬件传输数据的时间。

4. 一种发送接收双FIFO的串口实现模式

(1) 发送数据时把数据写进软件FIFO,并且打开发送中断,然后主程序可以进行其他的程序处理,中断中把软件FIFO的数据取出来写进硬件发送FIFO。软件FIFO为空时关闭发送中断。优点是发送数据可以连续多次发送不用等待,不会阻塞。但是需要开一个buffer占用RAM空间。

(2) 接收数据可以在启动串口的时候就一直中断接收数据到软件FIFO,需要用数据的时候可以直接从软件FIFO中读取数据,实现简单,运用灵活。

(3) FIFO实现可以参考Linux内核的高效实现方法,对于无操作系统的裸板程序,这种实现方法,也解决了读写并发的问题,不用上锁。实现代码参考文章(https://blog.csdn.net/Linux_Nan87/article/details/80671886)。

你可能感兴趣的:(驱动开发)