VxWorks的输出重定向, 首先推荐大家看一下这篇文章《VxWorks for X86的输入输出定向》,对VxWorks里的重定向有个初步认识

下面讲一下具体用法:

VxWorks系统里的定向主要有2种,定向输出输入全局的和任务级的。

全局的:

#ifdef INCLUDE_IO_BASIC
   
if (consoleFd != NONE)
{
        ioGlobalStdSet (STD_IN,  consoleFd);
        ioGlobalStdSet (STD_OUT, consoleFd);
        ioGlobalStdSet (STD_ERR, consoleFd);
}
#endif
顾名思义,默认的输入输出设备,全局有效,一般它可以是串口或者pcconsole,如所有的printf的输出口。
任务级的重定向:
用ioTaskStdSet() 可以改变任务的input/output的fd

ioTaskStdSet (0,STD_IN,  consoleFd);
ioTaskStdSet (0,STD_OUT, consoleFd);
ioTaskStdSet (0,STD_ERR, consoleFd);

VxWorks系统里的本身很多代码如一些dbg代码使用了这种模式,任务级重定向顾名思义, 只针对当前的任务有效。

VxWorks里任何块设备都可以mount到dosfs或者hrfs文件系统上,VxWorks本身似乎没有什么API可以获得这些卷的大小,dosfs的话可以调用dosFsShow看volume信息,但是没有显示volume大小和free大小,有没有什么方法可以得到呢?

可以用这个API写个函数来实现。


STATUS statfs  
    (
        char          *name,                  
        struct statfs *pStat                  
    )

这个函数最终会调到下面这个系统调用上:


#define FIOFSTATFSGET   46  
ioctl (fd, FIOFSTATFSGET, (int)pStat);

这个函数大概可以这样写:


STATUS volumeShow 
( 
    char *devName 
) 
{ 
    ...... 
    struct statfs fs; 
    statfs ((char*)devName, &fs) 
    printf ("%s: Total File System Size: %dKB, Free space: %dKB.\n", devName, (int)(fs.f_bsize * fs.f_blocks /1024), (int)(fs.f_bsize * fs.f_bavail /1024)); 
    ...... 
} 

e.g:


-> volumeShow "/tffs0"
/tffs0: Total File System Size: 3824KB, Free space: 3821KB.

一、官方的Program Guide

位于安装目录下:\docs\vxworks\guide\index.html

二、常用的库:


#include "taskLib.h"
#include "msgQLib.h"
#include "semLib.h"
#include "ioLib.h"
#include "wdLib.h"
#include "logLib.h"
#include "socket.h"

三、IO系统:ioLib.h

1、系统中的IO设备,包括键盘、串口、文件等,都用统一的接口访问。第一步通常先得到文件描述符,然后进行读写或者设置的工作,最后关闭该描述符。

  • creat:建立文件
  • open:得到文件或设备的描述符
  • read:读文件或设备
  • write:写文件或设备
  • ioctl:设置参数
  • close:关闭文件描述符
  • remove:删除文件

2、内存文件

  • memDrv( ) - 初始化伪内存设备
  • memDevCreate( ) - 建立伪内存设备
  • memDevCreateDir( ) - 建立一组伪内存设备
  • memDevDelete( ) - 删除伪内存设备

Init() { 
        uchar_t buffer[1024]; 
        int fd; 
        memDrv( ); 
        memDevCreate("/mem/mem1", buffer, sizeof(buffer)); 
        if ((fd = open("/mem/mem1", O_RDWR, 0644)) != ERROR) { 
                write(fd, &data, sizeof(data)); 
                ... ... 
                close(fd); 
        } 
        memDevDelete("/mem/mem1"); 
} 

3、通过Select函数实现多个IO监听:selectLib.h