VxWorks编程手册
4.2文件、设备和驱动
在VxWorks中,应用程序都是通过打开已命名的文件(files)访问I/O设备的。如: /usr/myfile /pipe/mypipe /tyCo/0 第一个表示是磁盘设备/USR上的文件myfile;第二个是因命名的PIPE;第三个是物理串口通道。但是I/O系统同样对待他们。在VxWorks中,他们都被叫做文件(files),虽然他们是不同的物理对象。被程序模块处理的设备叫驱动(drivers)。所有的I/O都被镜像到命名文件上,这有两种方式:基本的(basic)和缓存的(buffered)。
文件名和缺省设备: 文件名就是一个字符串,一个unstructured设备由设备名标示。在文件系统的设备中,设备名之后跟着文件名,如:DEV1:/file1。 当在I/O函数中指定了一个文件名,I/O系统首先查找设备,其名字与文件名的首部字符串匹配。然后I/O函数被引导到这个设备。如果没有找到匹配的设备名,那么I/O系统就被引导到缺省设备上。缺省设备可以是系统中的任何设备,包括根本没有设备。 非阻塞设备在他们被加入到I/O系统时命名,这通常发生在系统初始化时;而阻塞设备在使用指定的文件系统时进行初始化和命名。 对于设备和文件,这有一些命名规则,通常设备名以“/”开头(除了non-NFS网络设备和VxWorks DOS设备dosFs),如:/usr。Non-NFS网络设备命名采用远端机器名+:,如:host:,剩下的部分是远端文件夹。 使用dosFs的文件系统命名是大写字母+/(或数字)+:,如:DEV1:。
4.3基本I/O
基本I/O是VxWorks中I/O的最底层,其接口与标准C库是兼容的,下面是7个基本I/O函数:
函数 creat( ) remove( ) open( ) close( ) read( ) write( ) ioctl( ) 描述 Create a file. Remove a file. Open a file. (Optionally, create a file.) Close a file. Read a previously created or opened file. Write a previously created or opened file. Perform special control functions on files or devices.
文件描述符: 在基本I/O层,通过文件描述符(file descriptor或fd)来表示一个文件,fd是函数open( )或creat( )返回的一个整数,其它的函数调用都是根据参数得到fd,以指明对应的文件。当文件被打开时,分配fd并返回;当文件被关闭时,fd被释放。在VxWorks中,fd的数量是有限的,它在i/o系统初始化时指定。 文件和资源回收:
第 26 页 共 35 页
VxWorks编程手册
文件描述符和其他对象一样,也需要回收,即当文件描述符的拥有者被删除时,需要关闭文件,删除相关的内核对象。
标准输入、输出和错误: 下面的三个文件描述符被系统保留: 0 = standard input
1 = standard output
2 = standard error output 他们可以被间接映射到任何文件或设备。 全局重定向: 当VxWorks系统初始化时,这三个文件描述符缺省的映射到系统控制台(console),在任务被创建时,他们没有分配任务自己的文件描述符,任务就使用全局描述符。 函数ioGlobalStdSet( )用来实现全局重定向,其参数是被重定向的全局描述符和目的文文件描述符。例子:将全局标准输出(fd=1)映射到描述符为fileFd的文件(需要首先被打开): ioGlobalStdSet (1, fileFd); 指定任务的重定向: ioTaskStdSet( )函数用来实现指定任务的描述符的映射。其参数包括:目的任务的id,将被映射的标准描述符,和目的描述符,例子:一个任务将标准输出映射到任务自己的文件描述符fileFd: ioTaskStdSet (0, 1, fileFd);
打开和关闭: 在I/O能够对设备进行操作之前,fd必须要先打开。函数open( )有如下参数:文件名、访问类型和模式: fd = open (\name\flags, mode); 访问类型入下表所示: Flag O_RDONLY O_WRONLY O_RDWR O_CREAT O_TRUNC Hex Value 0 1 2 200 400 Description Open for reading only. Open for writing only. Open for reading and writing. Create a new file. Truncate the file. 模式参数的一些特殊用法: 1、通常,你只能用函数open()打开一个已经存在的设备或文件。对于NFS网络和dosFs设备,你可以使用O_CREAT访问类型创建一个文件,在NFS设备中,需要指定模式参数:
fd = open (\name\ 2、对于NFS网络和dosFs设备,你可以使用访问类型O_CREAT和模式FSTAT_DIR来创建子目录。 函数open()执行成功,返回文件描述符fd,fd是全局的,一个任务打开他,其他任务可以使用它,直到调用close()函数。当一个任务退出或被删除,被此任务打开的文件描述不会自动关闭。
创建和删除:
第 27 页 共 35 页
VxWorks编程手册
ceate()函数映射到一个面向文件的设备上,创建一个新的文件,返回文件描述符,其参数与open()类似,但文件名是新创建的而不是已经存在的: fd = creat (\name\flag); remove()函数删除一个文件,但是当一个文件正在打开时,不要删除: remove (\name\ 对于非文件系统的设备,create()与open()一样,但remove()无效。
读和写: 当文件被打开后,任务可以对文件进行读、写操作。Read()函数的参数是:文件描述符、接受缓存地址、要读取的最大字节数: nBytes = read (fd, &buffer, maxBytes); 此函数返回实际读到的字节树。
函数write()的参数是:文件描述符、需要输出的缓存地址、要写的最大字节数: actualBytes = write (fd, &buffer, nBytes); 此函数返回实际写的字节数。如果返回的字节数与请求的字节数不等,就返回错误。 文件截断(Truncation): 在一个文件打开后,可以使用函数ftruncate( )将文件截取指定的长度,其参数是文件描述符和希望的文件长度:
status = ftruncate (fd, length); 如果成功,返回OK;如果指定的文件长度比实际长度大,或文件不能被截取,返回ERROR,同时设置errno为EINVAL。
I/O控制: 函数ioctl( ) 对于执行任何I/O函数都是open-ended机制,包括:决定当前可用的字节数,设置设备选项,获得文件系统的信息,指定访问位置等。其参数为:fd,控制函数的地址,和一个与函数相关的可选参数:
result = ioctl (fd, function, arg); 例如,使用下面的函数设置tty设备的波特率为9600: status = ioctl (fd, FIOBAUDRATE, 9600);
多文件描述符的处理——SELECT功能: 库提供了任务层的支持,即允许任务等待多个设备就绪;同时,也支持设备驱动层,即驱动有能力探测任务正在等待设备的I/O。为了使用这个功能,头文件selectLib.h必须包含在程序中。 任务级的支持不仅允许任务同时等待多个任务的I/O,它也允许任务指明最大的等待时间。
4.4 Buffered I/O—Stdio
在VxWorks中,可以配置INCLUDE_ANSI_STDIO组件以提供buffered I/O的支持。 使用Stdio: 为了使VxWorks的I/O更有效,stdio实现了缓存方案,即可以读写和缓存大块数据,而不是一个字节一个字节的读写。 fp = fopen (\ 此函数返回一个文件指针(或fp),指向对应的FILE类型的数据结构。
第 28 页 共 35 页
VxWorks编程手册
通过调用fdopen( )函数,一个已经打开的fd可以关联到一个FILE缓存中: fp = fdopen (fd, \ 之后,可以通过fread()函数读数据,如果一次读一字节;用函数getc( ),通过fwrite()函数写数据,如果一次写一字节;用函数putc( )。 注意:多个任务不能同时对同一个stdioFILE指针进行I/O操作。 当调用fclose()函数时,FILE缓存被删除。
标准输入、输出和错误: 当任务使用标准的文件描述符时,系统会自动创建对应的三个stdio FILE缓存。每个任务在使用标准描述符时都有他自己的stdio FILE缓存。
4.5其他各式的I/O
printf( ) ,sprintf( ) 和sscanf( ): 此三个函数通常被认为是stdio包的一部分,而在VxWorks中,虽然功能相同,但是却不使用stdio包。实际上,它使用fioLib库中的自包含的、格式化的、非缓存的接口。 printErr( )和fdprintf( ): fioLib库提供了附加的格式化的但没有缓存的输出函数,函数printErr( )与printf( )函数类似,但将格式化字符串输出到标准错误描述符2。函数 fdprintf( ) 将格式化字符串输出到指定的文件描述符。
消息日志: logLib库对格式化的消息提供日志功能,而不需要当前任务执行i/o操作。消息格式和参数被发送到日志任务的队列中。
4.6异步输入、输出(AIO)
异步输入输出可以在一般的内部进程间并行的执行输入、输出操作,其优点是大大提高处理效率:因为当资源可用,它就可以执行I/O操作,可以消除不必要的任务阻塞,因而不必在内部进程和输入输出之间争夺资源。 POSIX AIO函数: AioPxLib库提供了POSIX AIO函数。为了异步的访问文件,首先需要调用函数open()打开文件,然后根据返回的文件描述符调用其他函数。下表为POSIX AIO函数: aioPxLibInit( ) ——Initialize the AIO library (non-POSIX).
aioShow( ) ——Display the outstanding AIO requests (non-POSIX).* aio_read( ) ——Initiate an asynchronous read operation. aio_write( ) ——Initiate an asynchronous write operation.
aio_listio( ) ——Initiate a list of up to LIO_MAX asynchronous I/O requests. aio_error( ) ——Retrieve the error status of an AIO operation.
aio_return( ) ——Retrieve the return status of a completed AIO operation. aio_cancel( ) ——Cancel a previously submitted AIO operation.
aio_suspend( ) ——Wait until an AIO operation is done, interrupted, or timed out.
AIO 控制块:
第 29 页 共 35 页
VxWorks编程手册
每个AIO的调用者都把AIO控制块作为描述AIO操作的依据,调用程序为控制块分配空间。两个同时发生的AIO操作不能使用同一个控制块。在你请求AIO操作之后,调用
aio_return( )函数之前,千万不要修改相应的AIO控制块。aio_return( )函数释放AIO控制块。 AIOcb数据结构被定义在aio.h文件中。 使用AIO: 函数aio_read( ), aio_write( ), or lio_listio( )触发AIO操作。lio_listio( )函数允许你一次执行多个异步请求(读或写),通常,在执行AIO请求之后,实际的I/O操作不一定立即发生,因此,函数的返回值也不会影响实际I/O操作的结果,唯一的影响是:请求是否成功,即AIO函数是否已经把操作加到执行队列中了。I/O操作执行之后,也有返回值。有两个函数可以得到I/O操作是否成功或失败的信息:aio_error( ) 和aio_return( )。aio_error( )函数得到AIO操作的状态(成功,失败或在进行中),aio_return( )函数或的单个I/O操作的返回值。在AIO操作完成之前,它的错误状态是EINPROGRESS。为了取消AIO操作,调用函数aio_cancel( )。 可以使用aio_error( )函数检查读或写AIO操作是否完成。 检查AIO请求是否完成可以使用如下方式:
1、 周期的检查aio_error( )函数的结果,直到AIO请求状态不是EINPROGRESS为止; 2、 aio_suspend()函数将任务悬挂起来,直到AIO请求完成; 3、 当AIO完成时采用信号通知
4.7 VxWorks中的设备
所有的VxWorks设备驱动都遵循上面描述的基本规定,但有各自不同,本章详细说明。
Module ttyDrv ptyDrv pipeDrv memDrv nfsDrv netDrv ramDrv scsiLib -
4.7.1串口I/O设备(终端和伪终端设备)
VxWorks提供了终端和伪终端设备驱动(tty和pty),tty驱动是针对实际终端,pty驱动是针对仿真终端。VxWorks串口I/O设备是缓存的连续字节流,每个设备都有一个环形缓存区,用于输入和输出,在系统初始化时,创建设备时,指定环形缓存区的大小。 Tty选项: Tty设备有一套选项,以影响设备的行为。可以调用ioctl( )函数,通过设置位设置这些选项。例子:status = ioctl (fd, FIOSETOPTIONS, OPT_TERMINAL & ~OPT_MON_TRAP); 下面是选项的总结:
OPT_LINE—— Select line mode. (See Raw Mode and Line Mode, p.176.) OPT_ECHO ——Echo input characters to the output of the same channel.
Driver Description Terminal driver Pseudo-terminal driver Pipe driver Pseudo memory device driver NFS client driver Network driver for remote file access RAM driver for creating a RAM disk SCSI interface library Other hardware-specific drivers 第 30 页 共 35 页
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VX编程手册(6)在线全文阅读。
相关推荐: