最近做VxWorks的开发,为实现开发板访问主机文件耽搁了几天的时间,现在终于实现了,现在我把遇到的问题与实现方式总结一下,为以后上路者提供一点资料,也为自己做点小结。
方式一:非NFS网络文件系统设备(netDrv),即通过netDrv创建网络设备进行访问
netDrv具有如下特点:
1. 使用主机文件的本地复制,因此很需要内存空间,至少要主机文件大小;
2. 创建文件时,将初始化一个空的本地缓冲区,打开文件时的整个内容都下载到本地,以后的读写和I/O控制都在本地复制上进行,文件关闭时,如果以可写方式打开,本地复制写入远程主机;
3. 远程主机文件通过FTP或者RSH下载。
操作如下:
首先打开主机FTP服务器,设置FTP目录;
VxWorks下:hostAdd ("ftp","192.168.20.115");
VxWorks下:netDevCreate ("ftp0:","tfp",1); (第三个参数:0=RSH 1=FTP)
接着可以查看设备目录:devs
成功后可以访问ftp0:目录下的文件:ftp0:1.txt
方式二:NFS设备
操作方式:
在Linux系统上开启NFS服务器,设置文件目录(ip:192.168.20.111, dir:/home/bao)
VxWorks下:hostAdd ("Linux","192.168.20.111");
VxWorks下:nfsMount ("Linux","/home/bao","bao:");
接着可以查看设备目录:devs
成功后可以访问ftp0:目录下的文件:bao:1.txt
将位于192.168.20.111上的/home/bao作为本地文件系统bao:挂装,nfsMount相当于创建了本地文件系统bao:,随后程序可以像访问本地其他文件系统一样访问bao:;
nfsDrv支持下列I/O控制命令:
status = ioctl(fd,FIOGETNAME,&nameBuf);
取得文件fd从当前位置到文件结束剩下的字节数:
result = ioctl(fd,FIONREAD,&bytesleft);
定位fd的文件指针到newposi处,如果newposi超出了文件长度,则调用增加文件长度(补0)到newposi:
status = ioctl(fd,FIOSEEK,newposi);
刷新驱动程序缓冲区数据到所在的远程NFS文件:
status = ioctl(fd,FIOSYNC,NULL);
返回fd的文件指针的当前位置:
where = ioctl(fd,FIOWHERE,NULL);
取得文件状态信息填入参数st中:
status = ioctl(fd,FIOFSTATGET,&st);
取得文件系统参数信息填入stfs:
status = ioctl(fd,FIOFSTATFSGET,&stfs);
读取文件目录fd的内容:
status = ioctl(fd,FIOREADDIR,&d);
注意*:使用NFS方式,读文件不会把整个文件读到内存,此方式可以读写大文件
阅读(6387) | 评论(0) | 转发(0) |