专栏首页这里只有VxWorksUtility之Select机制

Utility之Select机制

在《Component之SIO》里提到过,从串口读取数据时,通常使用基本IO系统的read()函数。而基本IO操作都是阻塞模式的,那么同时从多个串口读取数据的话,一般就得使用多个任务,即使每个任务的操作完成一致

其实VxWorks提供了同时阻塞在多个串口上的操作:Select机制

这个默认包含的组件INCLUDE_SELECT,提供了一个函数select()

  • width - 用bit的数目表示同时阻塞的文件描述符(fd)的数量,每个bit表示一个fd,从0开始。一般赋值为FD_SETSIZE,然后系统使用时,在内部会将其自动缩小为NUM_FILES(可通过iosFdMaxFiles()获得)

因此,如果需要调整IO系统的NUM_FILES值,不要超过FD_SETSIZE(2048)

  • pReadFds - 结构体struct fd_set的成员就是一组连续的bit。某个bit的值为1,就会导致select()阻塞到相应的fd上,直到该fd指向的串口有数据可读。pReadFds如果为NULL,则忽略这个参数
  • pWriteFds - 类似于pReadFds,不过是写阻塞
  • pExcFds - 异常报告,不过目前底层的IO设备基本还不支持这个操作
  • pTimeOut - 为NULL时,select()一直阻塞到数据有效。为0时,轮询后立即返回;大于0时,用于设置超时的时长

select()返回时,会将fd_set都清零,只保留数据有效的bit。返回值-1表示出错了,0表示超时了,大于0时表示数据有效的fd数量

还需要几个宏来配合这些fd的fd_set结构体

  • FD_ZERO(p) - 初始化fd_set结构体p
  • FD_SET(n, p) - 将n表示的fd赋值到结构体p
  • FD_CLR(n, p) - 清除结构体p中的n代表的fd
  • FD_ISSET(n, p) - 判断n代表的fd是否在结构体p中

看不懂?没关系,咱们跑个例子。事实上,select机制不仅支持串口,还支持管道和Socket等IO。为了省事,直接用两个管道来验证就可以了

启动这个例子后,任务就会同时阻塞到两个管道上

给任一管道发送消息,select()都会收到

最后再试试超时机制

这次不给管道发消息了

这正是:

多个IO操作,可用Select。

等候时长可设,默认一直阻塞。

我是泰山,专注VX 14年(+11个月)!

欢迎关注VxWorks567,

一起学习,共同进步!

本文分享自微信公众号 - 这里只有VxWorks(VxWorks567),作者:泰山3721

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UGL之绘制多边形

    主要函数就是uglPolygon(),参数pData用于指明每个顶点的坐标,首尾两个点需要一致,所以其个数numPoints比多边形的实际顶点数要多一个,另外还...

    Taishan3721
  • Drv之Intel显卡DevID

    Taishan3721
  • Tool之预定义的宏

    编译器都会预定义一些宏,这些宏是不可取消的,来看看VxWorks中可能用到的这几个

    Taishan3721
  • 宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)

    早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。

    Linux阅码场
  • 好用的 Linux \ Mac 搜索命令 fd 命令用法

    版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 ...

    FungLeo
  • [038]Binder传输fd细节

    最近在研究Linux IO相关的知识,突然想起来Binder机制可以传递fd,但是没有仔细考虑过下面这个问题。

    王小二
  • python文件打开方式详解——a、a+、r+、w+区别

    第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出。w+可读写) **w+与r...

    学到老
  • TCP socket心跳包示例程序

    http://blog.csdn.net/lisonglisonglisong/article/details/51327695#comments

    bear_fish
  • select实现socket单线程多路复用

    DH镔
  • 月薪 30K Java 程序员,需要掌握哪些技术?

    30K的月薪在BAT等一线大厂实在太普遍了,一般是高级工程师和资深工程师的职位,在阿里是p6~p7左右,在百度是t5左右,腾讯是t2-3左右,在京东是t3-1,...

    帅地

扫码关注云+社区

领取腾讯云代金券