VxWorks提供了一个完全支持ANSI C的标准I/O包(stdio.h),因此与Unix和Windows的标准I/O包兼容。

1. VxWorks配置标准I/O

对于VxWorks内核,主要的传统标准I/O函数由一个VxWorks组件提供,少数的函数由其他组件提供。这种模块化的方法使系统仅包含常用的函数功能组件,从而降低对系统内存的占用。

如下组件提供了标准的I/O函数:

  1. INCLUDE_ANSI_STDIO:提供ANSI标准I/O函数。
  2. INCLUDE_FORMATTED_IO:提供fioLib库(非缓冲的),包括了非ANSI标准的I/O函数,如oprintf()和fdprintf()。

fioLib中的函数不适用由标准I/O库ansiStdio所提供的缓冲I/O机制。所以就算VxWorks中没有包括ansiStdio库,也可以使用fioLib中的函数。

2. 关于标准I/O和缓冲

当应用程序执行很多小数据量的读写操作时,使用由标准I/O提供的带缓冲的I/O函数将比基础的不具备缓冲的I/O函数有更好的性能。

尽管VxWorks I/O系统是高效的,但是对于每个低层次调用(基础I/O)还是存在一些问题。首先,I/O系统从设备独立的用户调用(read()、write())需要转换到与该调用对应的设备相关函数上。其次,当一个设备驱动同时被多个用户调用时,驱动需要执行互斥或队列操作。

因为VxWorks原语执行非常快,所以这些问题影响较小。然而,如果应用程序每次只从文件中读取一个字符,那么还是会放大这些问题所带来的影响。例如按照如下方式调用read:


n=read(fd,&char,1);

为了使这种类型的I/O更加高效、灵活,标准I/O机制实现了一个缓冲方案,允许数据按照大块进行读写,并按照私有的方式进行缓冲。这种缓冲对应用而言是透明度;该过程由标准I/O函数和宏自动处理。

当使用标准I/O函数创建和打开一个文件时,通常会与该文件流相关联。可以使用fopen()打开一个文件,语法如下:


fp=fopen("/path/file","r");

fopen()函数返回一个FILE对象的指针(由FILE*声明),即一个文件指针。FILE对象中包含了供标准I/O库管理文件流所使用的各种信息,包括I/O真正使用的文件描述符,供文件流使用的缓冲区信息,等等。

注意:RTP最多仅允许使用fopen()打开20个文件描述符。

已经打开的文件描述符可以通过调用fdopen()与一个FILE缓冲区相关联。语法如下:


fp=fdopen(fd,"r");

当时用fopen()打开文件后,可以使用fread()函数进行读取,或使用getc()函数一次读一个字符。同样可以调用fwrite()和putc()。FILE缓冲区将在调用fclose()之后释放。

用于从文件读取或写入数据的函数和宏是非常高效的。他们直接使用指针的方式对数据的读写进行操作。仅当读缓冲区为空或写缓冲区为满的时候才会调用底层的读或写函数。

注意:对于一个特定的任务,标准I/O缓冲区和指针都是私有的。它们不会使用信号量或任何其他互斥机制进行互锁,因为这样将降低私有缓冲器方案的效率。所以,多个任务不应该在同一时间操作同一个stdio FILE指针。