本书介绍了嵌入式实时多任务操作系统VxWorks及其主机环境Tornado,并实践性地描述了其上的程序开发过程。书中详细介绍了VxWoks各个重要的组件,包括多任务环境、内存管理、IO系统(包括字符设备)、文件系统和网络通信等。并在每一章的最后都有常见问题解答(FAQ),帮助读者及时地解决开发过程中遇到的问题。
本书主要面向有一定VxWorks经验或嵌入式经验的软件开发人员,但是部分章节对初学者也非常有帮助,如一些基本概念和一般开发过程。本书能够帮助VxWorks软件开发人员更好地使用平台,并理解其内部工作机制,扩展平台功能。
异步输入输出允许在执行输入输出操作的同时并发地执行原始任务。在任务与I/O操作在逻辑上是相互独立的情况下,可以使用AIO将I/O操作从任务中分离出来。VxWorks的AIO实现符合POSIX1003.1标准。
AIO的可以带来更高的处理效率:它允许在资源可用时进行I/O操作,而不用等待相关事件完成。AIO避免了 同步I/O中的一些不必要的任务阻塞,从而减少了I/O与内部处理之间对资源的竞争,同时也提高了吞吐量。
为了使用AIO,需要添加INCLUDE_POSIX_AIO和INCLUDE_POSIX_AIO_SYSDRV组件。第二个组件使能了辅助AIO系统驱动,当前所有的VxWorks设备都需要这个驱动以进行AIO操作。
VxWorks的aioPxLib库提供了POSIX AIO函数。为了异步访问一个文件,可以使用open()函数打开该文件。然后使用open()返回的文件描述符调用AIO函数。POSIX AIO函数(包括两个非POSIX函数)如下表所示:
当VxWorks配置了INCLUDE_POSIX_AIO之后,内核初始化代码将自动条用aioPxLibInit()函数。aioPxInit()函数使用MAX_LIO_CALLS作为其唯一参数。当MAX_LIO_CALLS配置参数被设置为0(默认为0),将会使用AIO_CLUST_MAX宏,该宏的值在privateaioPxLibP.h中定义为100。
VxWorks提供了一个完全支持ANSI C的标准I/O包(stdio.h),因此与Unix和Windows的标准I/O包兼容。
对于VxWorks内核,主要的传统标准I/O函数由一个VxWorks组件提供,少数的函数由其他组件提供。这种模块化的方法使系统仅包含常用的函数功能组件,从而降低对系统内存的占用。
如下组件提供了标准的I/O函数:
fioLib中的函数不适用由标准I/O库ansiStdio所提供的缓冲I/O机制。所以就算VxWorks中没有包括ansiStdio库,也可以使用fioLib中的函数。
当应用程序执行很多小数据量的读写操作时,使用由标准I/O提供的带缓冲的I/O函数将比基础的不具备缓冲的I/O函数有更好的性能。
尽管VxWorks I/O系统是高效的,但是对于每个低层次调用(基础I/O)还是存在一些问题。首先,I/O系统从设备独立的用户调用(read()、write())需要转换到与该调用对应的设备相关函数上。其次,当一个设备驱动同时被多个用户调用时,驱动需要执行互斥或队列操作。
因为VxWorks原语执行非常快,所以这些问题影响较小。然而,如果应用程序每次只从文件中读取一个字符,那么还是会放大这些问题所带来的影响。例如按照如下方式调用read:
VxWorks还提供了其他内核格式化I/O功能。
kprintf()按照printf()相同的方式进行格式化输出,区别在于kprintf()是按照轮询的方式向目标串口输出字符。该函数主要用于系统调试,可以在系统启动过程中(中断使能或I/O系统初始化之前)或在ISR中使用,这些都是printf()无法实现的。该函数由INCLUDE_DEBUG_KPRINTF组件提供。
kputs()提供了类似的功能,只是不能格式化输出。该函数由INCLUDE_DEBUG_KPUTS组件提供。
可选的组件INCLUDE_DEBUG_KWRITE_USER可用于实现输出到存储介质中。
内核函数kprintf()和kputs()可以用于向用户自定义的存储介质中写入数据(如FLASH)。
下面的函数展示了如何向用户预留的内存中写入数据。
执行如下步骤以使用该函数:
(1) 将代码添加到一个C文件中;
(2) 使用合适的BSP创建一个VIP项目;
(3) 将这个C文件添加到VIP中;
(4) 为项目添加如下组件:
在VxWorks中,基础I/O是最底层的I/O。基础I/O的接口同标准C库中的I/O原语是源码级兼容的。最基础的I/O调用有7个,如下图所示。
在基础I/O层级,文件通过文件描述符引用。一个文件描述符是一个由open()或creat()函数返回的整数。其他I/O调用使用一个文件描述符作为参数,以操作某个特定的文件。
文件描述符不是全局的。内核与RTP均有其独有的文件描述符集合。内核中的任务或某个任务中的子任务将共享文件描述符。例如:
当文件打开时,将分配并返回一个文件描述符;当文件关闭时,文件描述符将被释放。
内核中可用的文件描述符数量由宏NUM_FILES定义。这个数量也定义了文件描述符表的大小,该表控制了同时可以使用多少个文件描述符。默认大小是50,但是可以根据系统需要进行修改。
为了避免用尽文件描述符,导致创建文件时出现错误,应用程序应该在不再使用一个文件描述符时将其关闭。
© 2025 VxWorks Club