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

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

3天内不再提示

serialX的posix接口测试

冬至子 来源:出出啊 作者:出出啊 2023-10-13 10:30 次阅读

测试环境

开发板: NK-980IOT V1.0 的开发板
rt-thread 版本:4.1.1
IDE:keil + env

启用 posix

首先,启用 DFS:”RT-Thread Components” -> “DFS: device virtual file system” 。进入子菜单,选择

“Using posix-like functions, open/read/write/close”
“ Using devfs for device objects”

其它项可以取消选择。

然后进入 “RT-Thread Components” -> “C/C++ and POSIX layer” -> “POSIX (Portable Operating System Interface) layer” 子菜单项,选择

“Enable POSIX file system and I/O”
“Enable I/O Multiplexing select() “
“Enable Terminal I/O “

其它项可以取消选择。

测试

我们继续使用 rt-thread 驱动篇 之 serialX 全网公测 提供的测试方案,但是把里面的读写 API 改一改,rt_device_open 改成 open,rt_device_read 改成 read,rt_device_write 改成 write,rt_device_close 改成 close。

我们知道, open/read/write/close 分别对应调用 dfs_file_(open/read/write/close) 进而调用 struct dfs_file_ops 结构体中定义的 open/read/write/close 接口。在串口驱动框架里就是 serial_fops_(open/read/write/close) 等几个函数。

serial_fops_open

需要说明的是,我们只能选择“中断”或者“DMA”中的一种模式了。另外,除了 O_RDONLY O_WRONLY O_RDWR 三种读写标志,还可以支持 O_NONBLOCK ,它等于 RT_DEVICE_OFLAG_NONBLOCKING。

serial_fops_read

原来的实现有如下一个 while 循环,这个循环的本意是:非阻塞模式下,如果没有 read 到数据返回 -EAGAIN 错误值,告知应用层无数据并可以再次读;阻塞模式下,如果没有 read 到数据将等待工作队列而挂起线程。

do
{
    size = rt_device_read(device, -1, buf, count);
    if (size <= 0)
    {
        if (fd- >flags & O_NONBLOCK)
        {
            size = -EAGAIN;
            break;
        }
        rt_wqueue_wait(&(device- >wait_queue), 0, RT_WAITING_FOREVER);
    }
}while (size <= 0);

这和原来 serialX 的阻塞模式概念是一致的,如此一来,我们发现阻塞模式时 rt_device_read 先阻塞了,并不会走到 if 条件语句块内。

flush 概念

大家一定知道,flush 支持是 serialX 独有的,v1 v2 没有这个。当我们开启 posix 之后,发现 dfs 实现了一个函数 fsync ,同时还有一个 dfs_file_flush 函数,以及 struct dfs_file_ops 也定义了 flush 接口。只是在之前的版本里这个都没有实现。于是,我们对 “serialX.c” 做如下修改

找到 const static struct dfs_file_ops _serial_fops = 变量定义代码行,将 RT_NULL, /* flush / 修改为 serial_fops_flush, / flush */ 。然后在上面添加 serial_fops_flush 函数实现:

static int serial_fops_flush(struct dfs_fd *fd)
{
rt_device_t device;
device = (rt_device_t)fd->data;
return rt_device_flush(device);
}

瞧,serialX 的 flush 和 dfs 的 flush 以及 posix 的 fsync 衔接起来了。

select io 复用

之前设计的测试方案里,只有回环测试改动比较大。这里我们使用 select 这个高级的用法,监听是否有数据。

用这种方式,我们可以同时监听多个串口设备了。或者说,一个线程“同时”读多个串口设备。

termios

开启了 posix ,串口设备修改波特率、数据位等需要使用 termios。这部分的问题留待下一篇 libmodbus 部分详说。

总结

启用了 posix 后我们发现,posix 是在原来的设备驱动框架基础上套的一层壳。增加了函数调用跳转次数。如果没有必要的理由,还是不启用 posix 了。

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

    关注

    0

    文章

    147

    浏览量

    6956
  • Posix
    +关注

    关注

    0

    文章

    36

    浏览量

    9480
  • RT-Thread
    +关注

    关注

    31

    文章

    1266

    浏览量

    39868
  • DFS
    DFS
    +关注

    关注

    0

    文章

    26

    浏览量

    9147
  • FreeModbus
    +关注

    关注

    0

    文章

    16

    浏览量

    4443
收藏 人收藏

    评论

    相关推荐

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

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

    请问rtthread的外设驱动为什么不实现posix接口

    外设驱动想支持posix接口,如select\\poll、read、write、ioctl,希望能支持异步通知、轮询、batch设置功能。但是rtthread在通过
    发表于 07-15 06:34

    在RT-Thread中使用POSIX Threads接口

    POSIX Threads简称Pthreads,POSIX是"Portable Operating System Interface"(可移植操作系统接口) 的缩写,POSIX
    发表于 08-12 15:02

    尝试一下在freemodbus里使用serialX

    接口中的每一个函数的功能。完全按照每一个函数功能定义去做,后面的事情就是水到渠成的。花了小半天的时间从 drv_uart.c 改成 drv_uartX.c 。然后使用 serialX 中提供的 测试
    发表于 02-13 15:09

    测试serialXposix支持详解

    看看有什么问题,然后发现困难重重,于是退而求其次,先测试 serialXposix 接口测试环境开发板: NK-980IOT V1.
    发表于 02-14 11:29

    浅析基于serialX串口驱动移植libmodbus

    详细比对,libmodbus 打开串口设备后使用 termios 配置串口设备的波特率数据位等。而笔者上次在测试 posix 接口时使用的默认配置,并没有修改波特率。为了验证并跟踪问题位置,笔者在
    发表于 02-15 11:07

    嵌入式软件使用POSIX接口的优缺点

    POSIX既然是可移植操作系统接口,那基于该接口的应用程序可移植性自然是很高的。基于POSIX接口设计的应用程序可以在不做修改或仅做极少量的
    发表于 11-14 08:45 5583次阅读

    posix是什么

    POSIX表示可移植操作系统接口POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为
    发表于 11-14 15:09 1.1w次阅读
    <b class='flag-5'>posix</b>是什么

    Linux信号量(2):POSIX 信号量

    存储)置于可选部分中。在 SUSv4 之前,POSIX 信号量接口已经被包含在信号量选项中。在 SUSv4 中,这些接口被移至了基本规范,而消息队列和共享存储接口依然是可选的。
    的头像 发表于 10-29 17:34 685次阅读

    RT-Thread 4.1.0中POSIX渊源介绍

    可移植操作系统接口POSIX 标准定义了操作系统(很多时候针对的是类 Unix 操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性,如今主流的 Linux 系统都做
    的头像 发表于 04-27 10:22 1758次阅读

    RT-Thread 大会:POSIX简介和使用

    可移植操作系统接口POSIX标准定义了操作系统(很多时候针对的是类Unix操作系统)应该为应用程序提供的接口标准,从而保证了应用程序在源码层次的可移植性。如今主流的Linux系统都做到了兼容
    的头像 发表于 05-27 16:27 1848次阅读
    RT-Thread 大会:<b class='flag-5'>POSIX</b>简介和使用

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

    终于来到了 serialX 的实践篇,期待很久了。
    的头像 发表于 06-16 11:29 4438次阅读
    rt-thread 驱动篇(五)<b class='flag-5'>serialX</b> 小试牛刀

    基于serialX串口驱动移植libmodbus的步骤

    之前,笔者介绍 serialX 的时候,曾详细的讲解过 struct rt_uart_ops 接口中的每一个函数的功能。完全按照每一个函数功能定义去做,后面的事情就是水到渠成的。
    发表于 08-10 15:25 639次阅读

    基于serialX串口驱动移植freemodbus

    之前,笔者写过多篇 serialX 的文章,已经把它的原理和理念完完全全明明白白讲了,包括它的优势以及使用它需要注意的方面和可能遇到的问题。
    的头像 发表于 10-13 14:54 772次阅读

    POSIX适合对象存储吗?

    最近,留意到 MinIO 官方博客的一篇题为“在对象存储上实现 POSIX 访问接口是坏主意[1]”的文章,作者以 S3FS-FUSE 为例分享了通过 POSIX 方式访问 MinIO 中的数据时碰到了性能方面的困难,性能远不如
    的头像 发表于 10-29 10:19 609次阅读
    <b class='flag-5'>POSIX</b>适合对象存储吗?