0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rt-thread 驱动篇(三) serialX 压力测试

出出 来源:出出 作者:出出 2022-06-22 09:22 次阅读

前言

本周笔者花了好多天的时间,计划从多个方面对串口驱动做个比较。下面就从以下几个角度做个对比测试。
1. 工作模式对照
2. close open 测试
3. poll 发送测试
4. flush 支持测试
5. 非阻塞收发测试
6. 阻塞收发测试
7. 回环测试数据丢失率

其它未测试项:stream 支持,因为 v1 v2 只有 poll 模式支持, serialX 可以全模式支持,这一项未进行对比。

测试环境

- rt-thread 4.1.0
- STM32F429-ATK-APOLLO
- 串口收发缓存均设定 128 字节

工作模式对照

版本 poll收发 阻塞/非阻塞 驱动层缓存 DMA支持 STREM 支持
v1 Y - - Y 仅poll
v2 Y * Y Y 仅poll
X Y Y Y Y 全模式

> \* v2 对阻塞概念的认识,仅认为是降低 cpu 耗用。

close & open 测试

测试过程:

1. 先用 poll 模式打开,打开失败直接返回;成功输出 "POLL modeopen opened\n" 。
2. 输出 "CLOSE & REOPEN\n" 。关闭串口设备,再用中断收发模式打开,打开失败直接返回;成功输出 "INT mode opened\n" 。
3. 最后循环关闭打开 1百万次。打开失败直接返回。
4. 测试通过,使用 poll 模式打开串口设备,并输出 "REOPEN successfull\n"。准备进入下一项测试。

版本 v1 v2 X
测试结果 通过 通过 通过

poll 发送测试

用 poll 模式打开串口,发送若干数据。

版本 v1 v2 X
测试结果 通过 通过 通过

flush 支持测试

如果没有 flush ,驱动缓存的数据可能没有完全输出到外设,这个时候 close 设备可能出现丢失部分数据。

使用 flush 的目地就是保证驱动层缓存数据完全输出到外设,之后对设备的任何操作不会影响之前的数据。

版本 v1 v2 X
测试结果 不支持 不支持 通过

> 因为 v1 不支持非阻塞发送,也没有驱动层缓存,write 总是把最后一个字节写到串口移位寄存器后才返回。所以 v1 不会出现丢失数据的现象。

> v2 在这一环节的表现和 v1 是一样的,大家可以猜猜原因是啥。

**注:本部分为了测试 flush 特性有效性,因此 X 出现 close 的时候出现丢数现象。使用版在 close 设备的时候应该强制 flush 一下的。**

非阻塞收发测试

使用中断非阻塞模式打开串口设备,发送 10k 左右数据量,同时测量一下时间。

数据量 v1 v2 X
102400 102400 / 9762ticks 102400 / 8863ticks 102400 / 8863ticks
10240 10240 / 976ticks 10240 / 876ticks 10240 / 876ticks
128 128 / 12ticks 128 / 11ticks 128 / 11ticks

这部分测试大体上符合预期,因为有缓存,v2 和 X 先把数据放到缓存中就返回了。这样可以减少发送等待时间。

阻塞收发测试

数据量 v1 v2 X
102400 102400 / 9762ticks 102400 / 8902ticks 102400 / 8866ticks
10240 10240 / 976ticks 10240 / 890ticks 10240 / 884ticks
128 128 / 12ticks 128 / 11ticks 128 / 11ticks

> v1 在非阻塞和阻塞两种模式下的表现是一样的,因为它没有阻塞概念。
>
> v2 耗时比 v1 少,这是在预料中的,但是,它还是比 X 多了几个 tick 。这也是上文中工作模式对照部分对它的阻塞/非阻塞特性加 \* 的原因。

特别测试,当每次写小于串口驱动层缓存大小的数据时,

数据量 v2 X
16 1ticks 0ticks
32 5ticks 0ticks
128 11ticks 0ticks

为什么出现了和上面表格不一样的结果,因为这次测试,每次写之前有个 1s 延时,保证串口缓存是空的。**当串口缓存大小是 N 前提下,每次 write 小于等于 N 数量的数据应该可以直接写到缓存,并立马返回!**所以,对于 X 来说耗时就是 **0**。

这个很重要,**当我们用串口调试程序,需要打印一些信息的时候,又不希望因为串口输出数据影响到其它业务的时序,或者,最大限度地降低因串口输出数据而影响其它程序执行时序**。

回环测试数据丢失率

使用阻塞模式打开串口设备。这次通过串口调试助手以 20ms 的定时间隔,发送 384 字节数据。

版本 v1 v2 X
丢失率 671144 / 556848/17.03% 1208816/1070464/11.45% 2390800/2390800/0%

> v2 在这一步表现很差,第一次,笔者应用层缓存是 512 字节,想 `rt_device_read(uart, -1, recvbuf, 512);` 发现 read 不到任何数据,read 也不阻塞了,而是总能返回,单步进去看到,但接收的数据大于驱动缓存的时候,驱动拒绝处理,直接返回0!!!v2 的缺陷之一。
>
> 鉴于以上原因,之后改成 `rt_device_read(uart, -1, recvbuf, 128);` 应用缓存和驱动缓存大小相等。
>
> 手动单次发送,一次发送 344 字节数据(多于驱动缓冲大小),接收 256 字节,再次发送,接收 384 字节,第三次发送接收还是 256 字节,第四次又变成 384字节。

即便考虑到 v2 的上述缺陷,最多有 127 个字节数据被“滞留”串口驱动缓存里未及时返回。也弥补不了上述丢失率!

开启 DMA 的表现

很遗憾,v1 只支持 DMA 接收不支持 DMA 发送(估计以后也用不上 v1 了),由以上对比测试我们发现 v2 和 v1 很类似,在测试 v2 DMA 接收发送时也发现总体效果和使用中断没多少差异。

X 的表现如何呢?等待您的发现!

> 遗憾的是,笔者对 STM32 的 HAL 极其不熟悉,又极其不想用 HAL 。花了很长时间想自己通过寄存器配置实现,最终没成功,还是放弃了。
>
> HAL 有一个好处,那就是几乎可以适配 STM32 所有系列芯片。但是,HAL 不是为 OS 而生的 `#error "USE_RTOS should be 0 in the current HAL release"`,在 OS 上用终究有可能遇到失锁的问题。
>
> 使用 HAL 还有个小小的瑕疵,那就是 `is_dma_txing` 判断变得不友好,无奈之下,笔者在 `struct stm32_uart` 中添加了个 `rt_bool_t dmaTxing;` 变量 —— ”HAL 中 gState 和 RxState 已经够多了“ 。算是目前的一个小遗憾吧。

结束语

最后,依旧公开测试代码,本次测试使用的代码可以在 [serialX]( https://gitee.com/thewon/serialX ) 仓库找到。近期,笔者也会将 serialX 提交到 rt-thread 主仓库。

提前预告,下次我们来聊聊 serialX 在做控制台串口时遇到的问题已经解决方案(包括使用中断 DMA 收发模式打开的串口设备)。

相关文章:

rt-thread 驱动篇(一) serialX 框架理论

rt-thread 驱动篇(二) serialX 理论实现

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 测试
    +关注

    关注

    8

    文章

    4439

    浏览量

    125119
  • 串口驱动
    +关注

    关注

    2

    文章

    78

    浏览量

    18349
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38865
  • serialX
    +关注

    关注

    0

    文章

    7

    浏览量

    786
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4401次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驱动,但是它是 LVGL 和 rt-thread 的接口。LVGL 在 rt-thread 上运行的基石。
    发表于 07-08 09:37 1280次阅读

    RT-Thread ssd1306驱动

    RT-Thread 驱动ssd1306
    的头像 发表于 04-21 10:08 26.4w次阅读
    <b class='flag-5'>RT-Thread</b> ssd1306<b class='flag-5'>驱动</b>

    【原创精选】RT-Thread征文精选技术文章合集

    serialX 理论实现rt-thread 驱动serialX
    发表于 07-26 14:56

    测试serialX的posix支持详解

    Terminal I/O “其它项可以取消选择。测试我们继续使用 rt-thread 驱动serialX 全网公测 提供的
    发表于 02-14 11:29

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物联网开发套
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    RT-Thread开源作品秀】基于RT-Thread的星务平台研究

    本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,...
    发表于 01-25 18:26 5次下载
    【<b class='flag-5'>RT-Thread</b>开源作品秀】基于<b class='flag-5'>RT-Thread</b>的星务平台研究

    RT-Thread全球技术大会:RT-Thread上的单元测试框架与运行测试用例

    RT-Thread全球技术大会:RT-Thread上的单元测试框架与运行测试用例                 审核编辑:彭静
    的头像 发表于 05-27 16:21 1264次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>上的单元<b class='flag-5'>测试</b>框架与运行<b class='flag-5'>测试</b>用例

    RT-Thread全球技术大会:在RT-Thread上编写测试用例

    RT-Thread全球技术大会:在RT-Thread上编写测试用例           审核编辑:彭静
    的头像 发表于 05-27 16:28 1209次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:在<b class='flag-5'>RT-Thread</b>上编写<b class='flag-5'>测试</b>用例

    RT-Thread大会:RT-Thread 自动化测试

    为了保证RT-Thread相关仓库的代码质量,我们基于utest框架搭建了一套简易的自动化测试环境。
    的头像 发表于 05-27 16:26 1517次阅读
    <b class='flag-5'>RT-Thread</b>大会:<b class='flag-5'>RT-Thread</b> 自动化<b class='flag-5'>测试</b>

    RT-Thread全球技术大会:RT-Thread测试用例集合案例

    RT-Thread全球技术大会:RT-Thread测试用例集合案例           审核编辑:彭静
    的头像 发表于 05-27 16:34 1777次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b><b class='flag-5'>测试</b>用例集合案例

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread文档_utest 测试框架

    RT-Thread文档_utest 测试框架
    发表于 02-22 18:43 2次下载
    <b class='flag-5'>RT-Thread</b>文档_utest <b class='flag-5'>测试</b>框架

    送《RT-Thread设备驱动开发指南》,手慢无!

    过程中的第一选择!本书 也是RT-Thread第8本相关书籍了,本期我们将抽奖送给大家! 抽奖请移步文末↓↓↓ 随着RT-Thread被更广泛地应用于行业中,开发者对嵌入式驱动开发的需求越来越强烈,他们
    的头像 发表于 03-19 23:00 1038次阅读