串口驱动的3种实现方式

串口驱动的实现有三种方式:轮询、中断、DMA(直接存储器访问)。这三种方式和使用裸机或哪种操作系统无关,主要看串口设备硬件支持和业务需求。下面简单介绍这三种方式的特点:

轮询方式

轮询方式主要是每隔一段时间对各种设备进行轮询,查询设备有无处理要求,若有处理要求则进行相应处理。由此可见,若设备无处理要求,则 CPU 仍然会查询设备状态。而轮询的过程将会占据 CPU 的一部分处理时间,因此,程序轮询是一种效率较低的处理方式。

串口的轮询实现就是通过不停的轮询状态寄存器的状态判断是否有数据需要接收或发送。发送时先向数据寄存器或发送FIFO写入数据,然后不断检查状态寄存器,查看发送是否完成。发送完成才能发送下一字节或退出发送状态。对于接收则要先创建一个循环定时器或线程死循环,不断的轮询状态寄存器,检查是否有数据收到,有数据收到则读取数据,然后调用接收回调,将数据传递给上层应用。

轮询模式下,发送CPU耗时略大于数据在串口线上传输的时间,要知道串口的波特率相对于CPU主频来讲要慢百万倍以上。而接收时,轮询频率越高则无用的CPU耗时越多,轮询频率越低则接收响应时间越长,两者不能得兼。

中断方式

中断方式是采用当数据到来或要发送数据时,通过中断的方式通知 CPU 去处理接收或发送的数据,并完成数据的收发操作。

接收时,不需要有一个任务专门用来检测是否有数据收到,收到数据会触发接收中断,在中断中收取数据并传递给上层应用。
发送时,只需要发送第一个字节即可让出CPU,之后每发送完成一字节都会触发发送完成中断,在中断中将后面需要发送的数据发送出去或者退出发送模式。

相比于轮询模式,中断模式只需对每字节耗费一次中断响应时间即可,极大的节省了CPU执行时间,同时接收响应也是极快的。

DMA 方式

DMA 方式是指数据在内存和设备之间能够直接进行数据的传输,只需要CPU执行一下开始和完成操作即可,不需处理每一字节的收发,是一种比中断模式效率更高的方式。

发送时需要把数据先拷贝到连续的无cache的内存区,然后配置DMA源地址、目标地址、数据长度等参数并启动DMA传输。这时就可以让出CPU了。当传输完成,会触发一个完成中断,通知应用层传输完成。
接收时,要提前准备好连续的无cache的内存区供给DMA自动接收。设置DMA各个接收参数并启动。当有数据收到后会触发中断,中断通知上层应用去处理。

在大量数据需要传输的情况下,DMA模式能极大的解放CPU占用,也能大幅减少收发中断次数,但话说回来,串口本身不同于以太网,不适合大数据传输。DMA模式虽然比中断模式效率高一些,但却高的幅度不大。想要实现DMA方式需要SOC内有DMA硬件模块,并具备相应驱动才行。除去编写DMA方式驱动比较复杂外,该方式对应用特性上也有诸多限制或不合适。

总结

串口驱动具体使用轮询,中断,DMA哪种方式实现,要依据硬件特性和系统需求而定。总的来讲,轮询实现最简单,但效率很低,非常占用CPU时间,接收响应也不及时。DMA模式的传输效率最高,但必须有硬件和驱动支持才行,而且实现起来比较复杂,局限性也很多。对于大部分硬件平台,都建议使用中断模式,传输效率,响应时间,资源耗费及编程复杂度都居中,且足够适应绝大部分应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ScilogyHunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值