在大多数单片机系统中都可能存在有串行通信(USART, I2C, SPI等), 串行通信的最显著的优点应该是它可以用较少的线路传输数据, 但因为其串行传输的方式, 必然伴随有传输效率速度慢的特点, 这也就生产了传输管理占用资源的问题.
在没有应用DMA的时候, 串行通信的管理大体两种方式, 轮询方式和中断方式.
轮询方式就是在发送或接收一字节时, 先要不断地循环查询前一待发送字节是否已经发送完成, 或待接收字节是否已经接收到, 直到前一字节已发送完成或已接收到一字节为止, 这种方式是耗费资源最高的方式, 因为通常在传送或接收完一个字节的过程中要进行产生多次无效的查询, 还要在成功发送或一个字节前或接收到一个字节后运行一次字节数据的转移程序--将数据从发送缓冲区送到发送寄存器或接收寄存器.
中断方式就是在接收或发送完一个字节时,产程中断,相应的中断服务处理程序中进行下一步的处理, 这样就没有了轮询方式中的无效查询过程. 这种方式下系统只要处理一字节只要运行一次字节数据转移程序及进出中断的处理程序, 总体而言, 一次进出中断的消耗的时间会大大小于多次查询所消耗的时间, 所以中断方式相对轮询方式消耗的时间应该要少.
在传输数据量不大且系统工作量不繁重的情况下, 上面的两种方式有时可以很好的工作, 但在统工作量大的时候, 这个问题就比较突出了. 相对而言, 之所以在系统中选用STM32, 有相当一部分就是为了应用它的高效率, 在这时, 串行通信的效率问题很可能成为系统软件算法的一个瓶颈, 而STM32是DMA功能恰恰可以解决这个问题. 在合理应用DMA后, 串行通信的处理可就做到每帧只运行一次处理程序, 这样每一帧数据只要运行一次启动DMA传送程序即可
1楼
0
0
回复
在没有应用DMA的时候, 串行通信的管理大体两种方式, 轮询方式和中断方式.
轮询方式就是在发送或接收一字节时, 先要不断地循环查询前一待发送字节是否已经发送完成, 或待接收字节是否已经接收到, 直到前一字节已发送完成或已接收到一字节为止, 这种方式是耗费资源最高的方式, 因为通常在传送或接收完一个字节的过程中要进行产生多次无效的查询, 还要在成功发送或一个字节前或接收到一个字节后运行一次字节数据的转移程序--将数据从发送缓冲区送到发送寄存器或接收寄存器.
中断方式就是在接收或发送完一个字节时,产程中断,相应的中断服务处理程序中进行下一步的处理, 这样就没有了轮询方式中的无效查询过程. 这种方式下系统只要处理一字节只要运行一次字节数据转移程序及进出中断的处理程序, 总体而言, 一次进出中断的消耗的时间会大大小于多次查询所消耗的时间, 所以中断方式相对轮询方式消耗的时间应该要少.
在传输数据量不大且系统工作量不繁重的情况下, 上面的两种方式有时可以很好的工作, 但在统工作量大的时候, 这个问题就比较突出了. 相对而言, 之所以在系统中选用STM32, 有相当一部分就是为了应用它的高效率, 在这时, 串行通信的效率问题很可能成为系统软件算法的一个瓶颈, 而STM32是DMA功能恰恰可以解决这个问题. 在合理应用DMA后, 串行通信的处理可就做到每帧只运行一次处理程序, 这样每一帧数据只要运行一次启动DMA传送程序即可