关于RTT串口DMA接收,有一个新的问题,疑问很久,未能明白,还望得到朋友们的解答。
1.问题描述:
关于DMA接收方式,用户读取数据的时机有2个:
(1)串口空闲中断;通知应用线程读取数据;
(2)DMA接收完成中断(取决于DMA设置的传输长度),DMA传输达到设定的字节后,在中断中通知应用线程,该读取数据了。
问题在这里的(2):对于这种情况,存在应用线程和DMA同时操作fifo的问题,可能会对系统造成影响。
2.问题分析
DMA接收完成中断,DMA中断虽然发生了,但是由于DMA设置为循环模式,DMA中断发生后会发生两件事情:
(1)DMA将重载设置的传输字节长度值
(2)将当前地址寄存器为设定的源地址、目标地址
假设串口接收数据没有停止,接着,将继续开始传输
也就是说,应用线程在因为DMA接收完成中断发送信号被唤醒,然后从驱动框架层fifo读数据的时候,DMA同时也在向fifo放数据,这样用户从fifo接收到的数据有可能这次刚放进去的。
不知道我理解是否有错误,是否有表达清楚,还望各位指教,谢谢!!!
FIFO是先进先出的,FIFO访问应是互斥的,临时关闭中断。参考之前一个串口DMA收发,1.5Mbs波特率不丢数据。https://acuity.blog.csdn.net/article/details/108367512
谢谢@Acuity 的解答
fifo顾名思义,应该是先进先出的,访问也应该是互斥的,这个赞同
介绍的这篇文章很好,分析透彻,逻辑严密。
至于临时关闭中断,这里这种情况,关中断,阻止不了DMA访问fifo啊,因为DMA搬运数据不需要CPU的参与。
所以说,如果应用线程处理效率低于DMA的效率,还是会出现数据覆盖的情况,对吗?
谢谢@Acuity
你好,@Acuity
@RongLiu STM32 F1、F0系列DMA不支持双buf,但引入“半满中断”,利用这个原理可以实现双buf;高系列支持双buf。