一、实验目的和要求
1、掌握基本的文件I/O函数的使用。
2、编写代码,实现将文件A中的内容拷贝到文件B中,并在屏幕上输出文件A的长度,在文件B的结尾写入自己的学号。
3、将编译生成的文件传输到开发板上执行测试。
二、实验主要仪器和设备
1、装有ubuntu10.04系统及配置了tftp、交叉编译环境的win7电脑一台。
2、Cortex-A9多核开源嵌入式试验箱一台。
3、串口线及网线各一条。
三、实验原理
与windows不同,Linux操作系统都是基于文件概念的,文件是以字符序列构成的信息载体。根据这一点,可以把I/O设备当做文件来处理。因此,与磁盘上的普通文件进行交互所用的同一系统调用可以直接用于I/O设备。这样大大简化了系统对不同设备的处理,提高了效率。本次实验所用到的五个函数为open()、read()、write()、lseek()、close()。这些函数的特点是不带缓存,直接对文件(包括设备)进行读写操作。
实现思路:
- 打开文件A、文件B;
- 将数据写入文件A;
- 将文件A指针置于开头位置;
- 从文件A中读数据到缓冲区;
- 获取文件A的长度;
- 将缓冲区中内容写入文件B;
- 将姓名学号添加到文件B末尾;
- 关闭文件A、文件B。
四、实验方法与步骤
1.编写源代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int fd1, fd2, ret, count;
char buf[128];
char data[] = "abcdefghigklmnopqrstuvwxyz\n";
char std[] = "zhangyu 214300126\nhewenjing 214070304\nhexinyi 214070303\nliurui 214070310\n"; //输入自己的姓名拼音学号
if((fd1 = open("A.txt", O_RDWR | O_CREAT, 644)) == -1)
{perror("open");exit(-1);}
if((fd2 = open("B.txt", O_RDWR | O_CREAT, 644)) == -1)
{perror("open");exit(-1);}
if((write(fd1, data, sizeof(data))) == -1) //将数据写入文件A
{perror("write");exit(-1);}
lseek(fd1,0,SEEK_SET); //将文件A指针置于开头
if((count = (read(fd1, buf, sizeof(buf)))) == -1)//文件A内容读到缓冲区
{perror("read");exit(-1);}
ret = lseek(fd1, 0, SEEK_END); //获取文件A长度
printf("Length of file A:%d\n", ret);
if(write(fd2, buf, count) == -1) //缓冲区内容写入文件B
{perror("write");exit(-1);}
if((write(fd2, std, sizeof(std))) == -1) //姓名学号写入文件B
{perror("write");exit(-1);}
close(fd1);
close(fd2);
return 0;
}
- 交叉编译源代码
- 使用TFTP服务将交叉编译的可执行文件下载到fileio目录
- 在实验箱端为fileio2提权并执行
- 执行ls显示fileio目录下文件
- 执行cat A.txt,打印文件A内容
- 执行cat B.txt,打印文件B内容
五、实验总结
1.文件读写操作:
在实验中,我学习了如何在嵌入式Linux系统上进行文件读取和写入操作。通过使用标准的文件I/O函数如open、read和write,我能够实现对文件的读写操作。
2.文件权限和路径:
了解文件权限和路径对于文件I/O操作至关重要。在实验中,我学会了如何设置文件权限以及正确处理文件路径,确保能够顺利读取和写入文件。
3.错误处理:
在进行文件I/O操作时,我遇到了一些常见的错误,如文件不存在、权限不足等。通过实验,我学会了如何正确处理这些错误情况,以避免程序崩溃或数据丢失。
4.文件操作性能:
了解文件I/O操作的性能对于优化系统性能至关重要。通过实验,我学习了如何评估文件读写的性能,并尝试了一些优化方法,如减少磁盘访问次数和合并写操作。
5.实验心得:
通过文件I/O实验,我深刻体会到了文件操作在嵌入式系统中的重要性。正确地进行文件读写操作不仅能够存储和获取数据,还可以实现配置文件的读取和日志信息的记录。
6.持续学习:
在嵌入式系统开发中,不断学习和提升文件I/O操作的技能是至关重要的。深入了解文件系统和文件操作的原理,可以帮助我们更好地利用文件I/O功能。
7.遇到的问题及解决方法:
- 虚拟网连接时以及在虚拟机下载安装gcc编译器时虚拟机的网络适配器为NAT模式联网环境。
- 利用TFTP服务实现试验箱与虚拟机之间的文件传输时,虚拟机的网络设置改为桥接模式,且要给虚拟机添加串口,此事确保虚拟机是在关机的状态,不然无法设置。
- 需在我的电脑→属性→设备管理器→下拉“端口”查看电脑的串口号,每个人的电脑串口号不同
- 串口拒绝访问时检查开发板串口线是否正确接在“RS2332 2#”端口,也可能是由于虚拟机正在占用串口,尝试关闭虚拟机之后再点击reconnect。
- 如果ping不通,解决方法如下:
检查主机与实验板网线是否正确连接。
检查虚拟机网络是否设置为桥接模式。
检查双方分配的IP是否还有效,若无效则重新指定。实验箱通常需要执行两次ifconfig才能成功设置IP地址,确保虚拟机和试验箱使用ifconfig检查之后均可以显示正确配置的IP地址后,再互相ping。
- 双方ping通后若出现传输文件超时的问题,有可能是虚拟机重启后TFTP服务未成功开启。则需执行重启TFTP服务的步骤,这一步的前提是虚拟机IP地址已配置好。
- 若无法运行文件,则需提升权限。
通过这次文件I/O实验,我积累了宝贵的经验和知识,对文件读写操作在嵌入式Linux系统中的应用有了更深入的理解。