1.VxWorks I/O系统

VxWorks I/O系统可以为任何类型的设备提供简单、统一、与设备独立的管理接口。这些设备包括:

  1. 字符设备:如终端或通信线路;
  2. 随机访问块设备:如磁盘;
  3. 虚拟设备:如任务间的管道pipes和sockets;
  4. 监控设备:如数字和模拟I/O设备;
  5. 网络设备:如可进行远程访问的设备;

VxWorks I/O系统为基础I/O与带缓冲的I/O均提供了标准的C库。基础I/O库与Unix兼容;带缓冲的I/O库与ANSI兼容。

内核I/O

因其独特的设计,使得VxWorks I/O系统比大多数的其他I/O系统更快、更灵活。这对实时系统是一个很重要的属性。

下图展示了VxWorks内核I/O系统中不同元素之间的关系。除了文件系统函数与网络元素之外,其余元素具有进行描述。

VxWorks 7 System IO

I/O系统与RTP应用程序

下图展示了可供RTP使用的VxWorks I/O系统元素之间的关系。后续将对这些元素进行描述。

VxWorks 7 System IO

VxWorks I/O与主机系统I/O之间的区别

VxWorks I/O系统的使用与Unix和Windows的I/O系统使用是相同的,在源码上基本是兼容的。但是仍然存在如下的区别:

  1. 文件描述符;
  2. I/O控制;
  3. 设备配置;
  4. 设备驱动函数;

类似于Unix和Windows,VxWorks中的文件描述符对于内核与每个进程而言也是独有的。内核与每个进程具备其独有的文件描述符集合。当进程创建后,它的文件描述符集合通过复制创建它的进程的文件描述符而得到(如果创建者是一个内核任务,仅能复制标准I/O描述符0,1,2)。之后,所有打开、关闭和复制操作仅能影响进程的文件描述符集合。对于内核和每个进程,文件描述符都是全局可见的。然而在内核中,标准输入、标准输出和标准错误可以被设置为任务特有的。

在Unix与VxWorks中向ioct()函数传递的参数可能不同。

在VxWorks内核中,设备驱动可以动态的加载或卸载,但仅限于内核空间。

在Unix中,不能抢占执行在系统模式下的设备驱动。在VxWorks中,因为设备驱动执行在触发它们的任务上下文中,所以驱动函数可以被强占。

2.VxWorks I/O功能配置

VxWorks提供了多种I/O功能,操作系统可以按需引入或移除。

VxWorks 7 System IO

附加组件

INCLUDE_IO_SYSTEM组件提供了向后兼容。其中包括了上表中的所有组件。

3. I/O设备、命名文件与文件系统

VxWorks应用程序通过打开的命名文件访问I/O设备。

一个命名文件可以参考如下:

  1. 在一个包含文件系统,且具备结构化、可随机访问特点的设备中的逻辑文件;
  2. 一个无结构的原始设备,如串行通信通道或任务间管道;

可以通过上述方式实现I/O。在VxWorks中,这些都被称为文件,尽管他们对应的是不同的物理对象。

设备命名

非块设备在加入I/O系统时被命名,通常是在系统初始化时进行。块设备则是在用于一个特定文件系统中开始初始化时才进行命名。VxWorks I/O系统对设备的命名没有限制。除了在查找或匹配设备或文件名的过程中,否则I/O系统不会以任何方式对设备或文件名进行处理。

设备由设备驱动负责操作。通常使用I/O系统不需要对设备和驱动的实现有更深层次的理解。

文件名与设备名

一个文件名由一个字符串指定。一个无结构的设备由设备名定义。对于有文件系统的结构化的设备,设备名后将跟着一个文件名。例如:


/pipe/mypipe:用于一个命名管道。通常,管道名的开头是/pipe
/tyCo/0:用于一个串口通道
/usr/myfile:用于一个名为myfile的文件,位于磁盘设备/usr中
/ata0:0/file1:用于在/ata0:0磁盘设备上的文件file1

针对文件的默认I/O设备

当在一个I/O调用中指定了一个文件名,I/O系统将根据文件名查找对应的设备,至少需要匹配文件名的初始的子字符串。之后I/O函数将定位到相应的设备。

例如,如果文件名是mars:/usr/xeno/foo/myfile,I/O函数将定位到名为mars的远程主机。如果不能定位到指定名称的设备,那么I/O函数将定向到一个默认的设备。

可以将默认设备设置为系统中任意的设备,也可以不设置(结果将导致设备匹配失败,并返回错误)。为了获取当前的默认路径,可以使用getcwd()函数。可以使用chdir()函数设置默认的路径。

文件I/O

尽管所有的I/O可以定位到一个命名文件,但是还是可以按照两个层次进行操作:基础的I/O和带缓冲的I/O。两者的不同在于数据的缓冲方式以及可调用的函数类型。

4. VxWorks远程文件系统访问

根据连接协议的不同,从VxWorks访问远程文件系统需要特殊的考虑。

从VxWorks访问NFS文件系统

通常,基于NFS的网络设备在挂载时,其名字前都有一个斜杠/。为了从VxWorks中访问目录和文件,需要使用从挂载点开始的路径。

在VxWorks中,如果/usr/xeno/foo的挂载点是/foo,那么就可以按/foo/myfile访问/usr/xeno/foo/myFile。例如:

使用FTP或RSH从VxWorks访问非NFS网络文件系统

为使用FTP或RSH从网络访问非NFS文件系统,必须在文件的系统路径之前添加远程主机名称,中间用冒号隔开。

如果主机系统是Linux则例外,其不需要主机名和冒号。

需要注意的是,为了能够使用RSH或FTP访问远程主机的文件,必须在远程主机与本地之间建立权限与用户验证链接。

如果Linux主机mars上的文件名为/usr/xeno/foo/myfile,Windows主机jupiter上的文件名为C:\bar\myotherfile,那么这两个文件将标识如下:


mars:/usr/xeno/foo/myfile
jupiter:c:\bar\myotherfile

之后可以如下使用路径:


fd=open("mars:/usr/xeno/foo/myfile", O_CREAT | O_RDWR, 0);
fd=open("jupiter:C:\bar\myotherfile", O_CREAT | O_RDWR, 0);

因为mars为Linux主机,所以如下方式也可以正常工作:


fd=open("/usr/xeno/foo/myfile", O_CREAT | O_RDWR, 0);

远程系统名定义

对于主机系统,其名称由主机名的启动参数定义(默认为host)。对于其他远程主机,一个网络设备必须首先通过调用内核函数netDevCreate()进行创建。