资源描述
信息工程学院
嵌入式系统设计课程设计报告
题目
:
基于Linux的文件下载功能的设计与实现
学号
:
学生姓名
:
专业名称
:
计算机科学与技术
班级
:
目录
1。 课题研究意义和现状- 1 —
1。1课题研究意义- 1 -
1。2课题研究现状— 1 —
2。 系统总体方案设计及功能模块介绍— 2 —
2。1 系统概述及总体方案设计- 2 —
3。 系统软件设计与实现— 2 —
3。1 主程序设计与实现- 2 -
3.2 服务器端程序设计与实现- 3 —
3。3 客户端程序设计与实现— 5 -
4。 系统测试- 8 —
4。1 系统软件测试— 8 —
4。2 系统硬件测试— 8 -
5. 总结和展望- 9 —
6。参考文献- 10 —
信息工程学院嵌入式系统设计课程设计
1。 课题研究意义和现状
1。1课题研究意义
随着微机技术的不断发展,在许多工程领域单片机的应用日趋广泛,已逐渐取代了单板机。为了适应这一新形势的变化,目前许多高校及一些中等专科学校已不再开设以单板机为主的“微机原理、接口及应用”课程,而直接讲授单片机及有关技术。但是目前缺少相应的实验设备及教材。鉴于这种情况,从教学和科研两个角度出发,我们此次的毕业设计尝试设计一种单片机教学实验板,来满足有关单片机教学实验的要求。从教学实验的角度出发,该实验板可适用于电类专业和非电类专业不同层次单片机教学实验的要求,如:自动化,仪器仪表,电子技术,电子测量,计算机应用,机电一体化等各专业,及机械专业。利用该板可以做各种编程实验,和一些简单的输入输出接口实验.如彩灯实验,数码管显示,音乐盒播放设计,键盘输入,模拟量的输入、输出,数模转换及电机正反转等.上述实验都不需要扩展硬件,该板上将提供全部接口和器件.同时为了强调学生的动手能力,在设计该实验板时,我们把AT89C51单片机的所有控制线、地址线和数据线经驱动后,将全部引入一排接线端子上,这就给系统的扩展提供了便利条件,我们可以在面包板上设计自己的接口电路,由单片机来控制实现.如存储器的扩充、键盘/显示接口芯片的扩展等、若连续做的话,可以使每个同学在自己占用的实验板上,设计成一个独立的应用系统。这对于同学们的实际工作能力,将会有一个很大的促进和提高.
1.2课题研究现状
嵌入式系统作为一个的热门领域,涵盖了微电子技术、电子信息技术、计算机软件和硬件等多项技术领域的应用。随着后PC时代来临,嵌入式应用呈现系统复杂化,应用多样化,硬件集约化、软件平台化等特点。行业发展现状与趋势: 目前,在上海地区,嵌入式系统开发涉及的行业众多, 水平参差不齐, 大多数停留在8位单片机开发这个层面上, 一部分单位开始采用32位机,并采用了实时操作系统。而具有能够同时进行软件设计和芯片设计的SOC系统设计的系统级高端人才几乎没有, 国际上领先的多核嵌入式系统设计, 可重构嵌入式系统设计在上海市的应用还停留在少数研究单位的研究中。
2。 系统总体方案设计及功能模块介绍
2。1 系统概述及总体方案设计
2.1.1系统概述
通过u-boot,内核,根文件系统的移植实现文件的下载。
2。1.2 总体方案设计
1。通过SD启动开发板;
2。将u—boot下载到开发板的内存中,并将u-boot烧写到开发板的EMMC上;
3。重新启动开发板,(从EMMC启动);
4.将内核下载到开发板的内存中;
网络传输(tftp服务器和客户端,tftp为文件传输协议);
5。将虚拟机中的一个叫做nfsdir的目录挂载到开发板的根目录;
挂载:nfsdir这个目录下的内容,虚拟机可以和开发板实现共享;
挂载:通过nfs服务器实现;
6.最终实现下载文件程序的运行。
3。 系统软件设计与实现
3。1 主程序设计与实现
系统移植与实现
1、新建/tftpboot目录,若有则不用新建
2、将u—boot-fs4412.bin、uImage与exynos4412—origen.dtb拷贝到tftpboot目录下
3、修改tftpboot目录权限
sudo chmod —R 777 /tftpboot
4、新建/source目录,若有则不用新建
5、将nfsdir压缩包拷贝到该目录下,解压sudo tar —xf nfsdir。ok。tar
6、修改source目录权限
sudo chmod -R 777 /source
7、检查tftp与nfs服务器是否安装
apt-cache policy tftpd—hpa
apt-cache policy nfs—kernel-server
如果没有安装,则在终端输入sudo apt—get install tftpd—hpa
sudo apt-get install nfs-kernel—server进行安装
8、修改配置文档:
tftp服务器:
1、 sudo vim /etc/default/tftpd—hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME=”tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS=”0.0。0。0:69”
TFTP_OPTIONS=”—l —c —s”0
保存退出
2、查看tftp服务器状态
sudo service tftpd—hpa status
若为正在运行,则重启:sudo service tftpd-hpa restart
若停止,则启动:sudo service tftpd-hpa start
nfs服务器:
1、sudo vim /etc/exports
/source/nfsdir *(rw,sync,no_subtree_check,no_root_squash)
2、查看nfs服务器状态
sudo service nfs—kernel-service status
若为正在运行,则重启:sudo service nfs—kernel—server restart
若停止,则启动:sudo service nfs-kernel-server start
9、启动开发板
设置参数:setenv ipaddr 192。168。100。200
setenv serverip 192。168.100.2
saveenv
tftp 41000000 u—boot—fs4412.bin
movi write u—boot 41000000
重启开发板,重新设置参数:
setenv ipaddr 192。168。100。200
setenv serverip 192.168.100。2
setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412—origen.dtb\;bootm 41000000 — 42000000
set bootargs noinitrd root=/dev/nfs nfsroot=192。168.100.2:/source/nfsdir rw rootwait console=ttySAC2,115200n8 init=/linuxrc ip=192.168。100。200 clk_ignore_unused
saveenv
3。2 服务器端程序设计与实现
开始
3。2。1服务器端主流程图(如图1)
socket
connect
recv/send
close
结束
图1
3。2.2服务器端主代码
int main()
{
struct sockaddr_in servAddr;
memset(&servAddr,0,sizeof(servAddr));
servAddr。sin_family=PF_INET;
servAddr。sin_port=htons(8888);
servAddr.sin_addr。s_addr=inet_addr(”192。168.100。200”);
//socket
int cliFd=socket(PF_INET,SOCK_STREAM,0);
if(-1==cliFd)
{
perror("socket error!");
return —1;
}
//printf(”socket ok!\n”);
//connect
int ret=connect(cliFd,(struct sockaddr*)&servAddr,sizeof(servAddr));
if(-1==ret)
{
perror(”connect error!”);
close(cliFd);
return —1;
}
printf(”connect ok!\n”);
//send/recv
int fd=open(”2.txt”,O_RDONLY);
if(—1==fd)
{
perror(”open error”);
return -1;
}
char buf[100];
memset(buf,0,sizeof(buf));
while(1)
{
int ret=read(fd,buf,sizeof(buf));
if(0==ret)
{
break;
}
send(cliFd,buf,sizeof(buf),0);
}
//close
close(cliFd);
return 0;
}
3。3 客户端程序设计与实现
3。3。1客户端流程图(如图2)
开始
socket
bind
listen
accept
结束
图2
3.3.2客户端主代码
int main()
{
struct sockaddr_in servAddr;
memset(&servAddr,0,sizeof(servAddr));
servAddr。sin_family=PF_INET;
servAddr.sin_port=htons(8888);
servAddr.sin_addr.s_addr=inet_addr(”192。168。100。200”);
//socket
int servFd=socket(PF_INET,SOCK_STREAM,0);
if(-1==servFd)
{
perror(”socket error”);
return —1;
}
printf(”socket ok”);
//bind
int ret=bind(servFd,(struct sockaddr*)&servAddr,sizeof(servAddr));
if(—1==ret)
{
perror(”bind error!");
close(servFd);
return —1;
}
printf(”bind ok!\n");
//listen
ret=listen(servFd,10);
if(—1==ret)
{
perror("listen error!\n");
close(servFd);
return -1;
}
printf(”listen ok!\n");
//accept
int connFd=accept(servFd,NULL,NULL);
if(—1==connFd)
{
perror(”accept error!");
close(servFd);
return —1;
}
printf("accept ok!\n");
//send/recv
int fd=open(”2。txt”,O_RDONLY);
if(-1==fd)
{
perror(”open error");
return —1;
}
char buf[100];
memset(buf,0,sizeof(buf));
while(1)
{
int sevc=recv(connFd,buf,sizeof(buf),0);
if(0==sevc)
{
break;
}
write(fd,buf,sizeof(buf));
puts(buf);
printf(”recv from server %s success!\n",buf);
}
//close
close(servFd);
close(connFd);
return 0;
}
4。系统测试
4.1 系统软件测试
Server端运行结果如下图所示
图3
Client端运行如下图所示
图4
4。2 系统硬件测试
程序在虚拟机上运行结果如下所示
图5
程序在开发板上运行如下所示
图6
5. 总结和展望
在嵌入式的学习过程中,让我了解了什么是嵌入式系统.它就是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能、可靠性、成本、体积、功耗有严格要求的计算机系统。他一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、用户应用程序四个部分组成,用于实现对其他设备的控制、监视或管理功能。嵌入式系统已经应用于科学研究、工业控制、军事技术、交通通信、医疗卫生、消费娱乐等领域,人们日常使用的手机、PDA、汽车、智能家电、GPS等均是嵌入式系统的典型代表.
老师在讲解过程中,首先交给我们的是一些简单的命令应用,Linux具有很丰富的命令,绝大多数命令具有大量的参数。在学习命令的过程中,只要你认真的看着老师操作还有认真听着他讲,你就会发现有些命令的操作还是很简单的,不过在操作的过程中,我也有遇到有些困难,会出现你按照书上学习的例子,将命令输入终端时会出现你不想要的结果,也就是错误的结果。这是问问旁边的同学或是懂的同学就可以解决了。在对于这部分的学习中,让我知道了命令对于嵌入式的重要性.它是linux的重要内容,linux中所有的功能都是通过命令执行。在实际应用中,为了减少系统开销,经常不使用图形界面,此时,对系统的所有操作都需要以命令方式来执行。在嵌入式系统开发过程中,由于目标机的性能和配置比较低,因此,一般情况下目标机仅具有命令窗口而没有图形界面,对目标机的所有操作都通过命令来实现。
6。参考文献
《Linux设备驱动开发详解(第2版)》——华清远见嵌入式培训中心宋老师著
《Cortex—M3+uC/OS—IT嵌入式系统开发入门与应用》—-华清远见嵌入式培训中心著
《精通Linux设备驱动程序开发》-—华清远见嵌入式培训中心宋老师翻译
《Linux内核修炼之道》——华清远见嵌入式培训中心任桥伟老师著
《Linux那些事儿》—-华清远见嵌入式培训中心任桥伟老师著
- 7 -
展开阅读全文