前言
本周笔者花了好多天的时间,计划从多个方面对串口驱动做个比较。下面就从以下几个角度做个对比测试。
工作模式对照 close open 测试 poll 发送测试 flush 支持测试 非阻塞收发测试 阻塞收发测试 回环测试数据丢失率
其它未测试项:stream 支持,因为 v1 v2 只有 poll 模式支持, serialX 可以全模式支持,这一项未进行对比。
测试环境
rt-thread 4.1.0 串口收发缓存均设定 128 字节
工作模式对照
close & open 测试
测试过程:
先用 poll 模式打开,打开失败直接返回;成功输出 "POLL modeopen openedn" 。 输出 "CLOSE & REOPENn" 。关闭串口设备,再用中断收发模式打开,打开失败直接返回;成功输出 "INT mode openedn" 。 最后循环关闭打开 1百万次。打开失败直接返回。 测试通过,使用 poll 模式打开串口设备,并输出 "REOPEN successfulln"。准备进入下一项测试。
poll 发送测试
用 poll 模式打开串口,发送若干数据。
flush 支持测试
如果没有 flush ,驱动缓存的数据可能没有完全输出到外设,这个时候 close 设备可能出现丢失部分数据。
使用 flush 的目地就是保证驱动层缓存数据完全输出到外设,之后对设备的任何操作不会影响之前的数据。
注:本部分为了测试 flush 特性有效性,因此 X 出现 close 的时候出现丢数现象。使用版在 close 设备的时候应该强制 flush 一下的。
非阻塞收发测试
使用中断非阻塞模式打开串口设备,发送 10k 左右数据量,同时测量一下时间。
这部分测试大体上符合预期,因为有缓存,v2 和 X 先把数据放到缓存中就返回了。这样可以减少发送等待时间。
阻塞收发测试
特别测试,当每次写小于串口驱动层缓存大小的数据时,
为什么出现了和上面表格不一样的结果,因为这次测试,每次写之前有个 1s 延时,保证串口缓存是空的。当串口缓存大小是 N 前提下,每次 write 小于等于 N 数量的数据应该可以直接写到缓存,并立马返回!所以,对于 X 来说耗时就是 0。
这个很重要,当我们用串口调试程序,需要打印一些信息的时候,又不希望因为串口输出数据影响到其它业务的时序,或者,最大限度地降低因串口输出数据而影响其它程序执行时序。
回环测试数据丢失率
使用阻塞模式打开串口设备。这次通过串口调试助手以 20ms 的定时间隔,发送 384 字节数据。
即便考虑到 v2 的上述缺陷,最多有 127 个字节数据被“滞留”串口驱动缓存里未及时返回。也弥补不了上述丢失率!
开启 DMA 的表现
很遗憾,v1 只支持 DMA 接收不支持 DMA 发送(估计以后也用不上 v1 了),由以上对比测试我们发现 v2 和 v1 很类似,在测试 v2 DMA 接收发送时也发现总体效果和使用中断没多少差异。
X 的表现如何呢?等待您的发现!
结束语
最后,依旧公开测试代码,本次测试使用的代码可以在 serialX 仓库找到。近期,笔者也会将 serialX 提交到 rt-thread 主仓库。
提前预告,下次我们来聊聊 serialX 在做控制台串口时遇到的问题已经解决方案(包括使用中断 DMA 收发模式打开的串口设备)。
|