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

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

3天内不再提示

rt-thread驱动篇之serialX阻塞超时返回

冬至子 来源:出出啊 作者:出出啊 2023-08-28 15:50 次阅读

前言
尽管仍然很多痴男怨女在 v1 v2 身上跌倒、跌倒、继续跌倒,仍然阻止不了他们飞蛾扑火式的被 v1 v2 的缺陷所吸引而殉情。

它一如既往的保持着优良的特性,也有可能是很多人没发现,主要是接受它的人很少。不过,这不影响今天它带来新的特性。

阻塞超时
我们一直强调,它有与之前非同一般的两个概念“阻塞”“非阻塞”。虽然 v2 热火朝天的提出了这两个概念,但是实现的效果却不尽人意。

在之前的正式文档里,我没胆量承认一个事实,那就是,阻塞读在无数据可读的时候将永远阻塞下去。某些应用场景并不希望这样,我们希望等待某设备响应,若干时间后无响应超时,我们返回继续做其它工作,而不是被无响应的设备永久占用。

给某些论坛提问里的解答时,我提到过几次 serialX 可以通过以下技术手段应对这种场景。

方法一
使用非阻塞模式打开,超时读过程伪代码可能如下这样:

while(timeout > 0) {
read
sleep 1
timeout -= 1
}
if (timeout == 0) {
// timeout here
} else {
// no timeout
}
方法二
使用完成中断 indicate 回调函数发消息,这也是官方提供的读串口设备的“标准”方式

static void serial_thread_entry(void parameter)
{
char ch;
while (1)
{
/
从串口读取一个字节的数据,没有读取到则等待接收信号/
while (rt_device_read(serial, -1, &ch, 1) != 1)
{
/
阻塞等待接收信号量,等到信号量后再次读取数据 */
rt_sem_take(&rx_sem, timeout);
}
...
}
}
注:此段代码改编自官方文档

大多数人第一次使用 rtt 的串口设备也是用这段代码测试的。但是,serialX 不提倡大家使用 indicate 回调函数。

serialX 有它自己的特性,它有它自己的优美性,那就是尽可能不给应用层代码带来麻烦,不要写太复杂难懂的逻辑,不要给应用层引入莫名未知的后果。

我们希望在不影响不改变之前的使用的前提下,rt_device_read 能够在预定的时间内超时返回退出,并不是用于阻塞下去,同时 rt_device_read 返回 -RT_ETIMEOUT 错误码。应用层可以根据 rt_device_read 返回值

== 0 无数据
0 有数据

< 0 有错误(-RT_ETIMEOUT 超时)
分别处理不同情况。
serialX 的实现
首先,rtdef.h 添加定义,用于设备超时配置

#define RT_DEVICE_CTRL_TIMEOUT 0x30 /**< timeout for blocking */
其次,struct rt_serial_device 添加 rt_tick_t timeout_tick; 变量,设备超时时间 tick 。

然后,rt_serial_control 函数添加超时配置宏选项处理

case RT_DEVICE_CTRL_TIMEOUT:
    rt_tick_t timeout_tick = (rt_tick_t)args;
    serial- >timeout_tick = timeout_tick;
break;

最后,在 serialX.c 文件中所有涉及到阻塞的地方(包括读写,不包含 flush)修改 rt_completion_wait 第二个参数为 serial->timeout_tick。并当 rt_completion_wait 返回 -RT_ETIMEOUT 时退出当前读写操作返回应用层。

注意:特别说明,我们希望一个设备以阻塞模式打开时,默认的阻塞超时时间是“永久”,所以,每次 rt_device_open 后 serialX 设定阻塞超时时间时间是 RT_WAITING_FOREVER 。如果需要指定某超时时间需要 rt_device_control(serial_dev, RT_DEVICE_CTRL_TIMEOUT, &timeout);

rt_tick_t timeout = 50;
if (rt_device_open(scpi_uart_dev, RT_DEVICE_OFLAG_RDWR
                           | RT_DEVICE_FLAG_INT_RX
                           | RT_DEVICE_FLAG_INT_TX
                           | RT_DEVICE_OFLAG_BLOCKING) != RT_EOK)
{
    rt_kprintf("Open device: %s failedn", UART_DEV_NAME);
    return;
}
rt_device_control(serial_dev, RT_DEVICE_CTRL_TIMEOUT, &timeout);
rt_ssize_t ret = rt_device_read(serial_dev, -1, &recvbuf[0], 128);
if (ret == -RT_ETIMEOUT) {
    rt_device_close(serial_dev);
    return;
} else {
}

这就是今天我们要讲的第三种方法,相比前两种,这种方法更优雅些,代码逻辑也清晰。

总结
欢迎大家入坑 serialX。

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

    关注

    68

    文章

    19181

    浏览量

    229214
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11543
  • 串口中断
    +关注

    关注

    0

    文章

    64

    浏览量

    13862
  • RT-Thread
    +关注

    关注

    31

    文章

    1275

    浏览量

    39944
  • serialX
    +关注

    关注

    0

    文章

    7

    浏览量

    803
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(一、版本开发环境及配合CubeMX)

    RT-Thread 学习记录的第一文章,RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及
    的头像 发表于 06-20 00:28 5159次阅读
    <b class='flag-5'>RT-Thread</b>记录(一、版本开发环境及配合CubeMX)

    rt-thread 驱动(六)serialX弊端及解决方法

    serialX 作为一个非阻塞串口驱动框架,在遇到一些异常时,需要做一些特殊处理,今天,笔者带大家来扒一扒 serialX 使用过程中需要注意哪些问题。
    的头像 发表于 06-20 11:43 3450次阅读

    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驱动资料下载

    前提下,用 32 位无符号整型 timer_cnt,最大可以处理时间仅有 4294.967295s。精度 PK2、rt-thread驱动serialX全网公测STM32 中断模式测试
    发表于 03-24 15:37

    RT-Thread系统的信号如何进行管理和使用呢

    进入就绪状态去处理对应的信号处于运行状态,系统会创建新的栈空间去处理对应的信号管理信号在 RT-Thread 中,对信号的操作包括以下几种:安装信号、阻塞信号、解除阻塞、信号发送、信号等待。1.安装
    发表于 03-31 14:01

    rt-thread驱动serial v1 v2 和 X测试

    测试回环测试数据丢失率其它未测试项:stream 支持,因为 v1 v2 只有 poll 模式支持, serialX 可以全模式支持,这一项未进行对比。测试环境rt-thread
    发表于 04-14 14:36

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

    软件包)NO2 专栏作者 :出出简介:rt-thread 研究。1. rt-thread 驱动rt-thread
    发表于 07-26 14:56

    测试serialX的posix支持详解

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

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南
    发表于 11-26 16:06 0次下载

    RT-Thread Studio驱动SD卡

    RT-Thread Studio驱动SD卡前言一、创建基本工程1、创建Bootloader2、创建项目工程二、配置RT-Thread Settings三、代码分析1.引入库2.读入数据四、效果验证
    发表于 12-27 19:13 20次下载
    <b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>驱动</b>SD卡

    rt-thread 驱动(五)serialX 小试牛刀

    终于来到了 serialX 的实践,期待很久了。
    的头像 发表于 06-16 11:29 4488次阅读
    <b class='flag-5'>rt-thread</b> <b class='flag-5'>驱动</b><b class='flag-5'>篇</b>(五)<b class='flag-5'>serialX</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 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread设备驱动开发指南》基础--以先楫bsp的hwtimer设备为例

    一、概述(一)RT-Thread设备驱动RT-Thread设备驱动开发指南》书籍是RT-thread官方出品撰写,系统讲解
    的头像 发表于 02-24 08:16 1475次阅读
    《<b class='flag-5'>RT-Thread</b>设备<b class='flag-5'>驱动</b>开发指南》基础<b class='flag-5'>篇</b>--以先楫bsp的hwtimer设备为例

    【S32K146 RT-Thread 使用SFUD组件驱动spi flash

    【S32K146 RT-Thread 使用SFUD组件驱动spi flash
    的头像 发表于 11-21 01:05 142次阅读
    【S32K146 <b class='flag-5'>RT-Thread</b>】<b class='flag-5'>之</b> 使用SFUD组件<b class='flag-5'>驱动</b>spi flash