VxWorks里怎样load一个文件到内存? 这个文件可以是在SD、USB、ATA这类的存储设备,也可以通过ftp网络下载;

下面是相关的实现代码,分享给大家:

STATUS ldToMem
    (
    char * fileName
    )
    {
        UINT8 * pData;
        FILE *  fp;
        UINT32  FileSize;

        if (NULL == (fp = fopen(fileName,"rb")))
        {
            printf("open file failure\n");
            return ERROR;
        }

#if FALSE
        pfile = fopen("/sd0:0/fileName","rb");
#endif

        fseek (fp, 0, SEEK_END);
        FileSize = (UINT32) ftell (fp);
        fseek (fp, 0, SEEK_SET);

        if ((pData = malloc(FileSize)) == NULL)
        {
            printf("malloc failure\n");
            return ERROR;
        }

        if (fread (pData, 1, FileSize, fp) != FileSize)
        {
            printf("malloc failure\n");
            free(pData);
            return ERROR;
        }

        printf("ldToMem OK pointer @ 0xx FileSize %d\n",pData, FileSize);
}

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代码使用了这种模式,任务级重定向顾名思义, 只针对当前的任务有效。

一、官方的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

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.