1、基于Linux下载文件的功能设计与实现信息工程学院嵌入式系统设计课程设计报告题目: 基于Linux的文件下载功能的设计与实现学号:学生姓名:专业名称:计算机科学与技术班级:1. 课题研究意义和现状 - 0 -1.1 课题研究意义 - 0 -1.2 课题研究现状 - 0 -2. 系统总体方案设计及功能模块介绍 - 1 -2.1 系统概述及总体方案设计 - 1 -3. 系统软件设计与实现 - 1 -3.1 主程序设计与实现 - 1 -3.2 服务器端程序设计与实现 - 2 -3.3 客户端程序设计与实现 - 4 -4. 系统测试 - 7 -4.1 系统软件测试 - 7 -4.2 系统硬件测试 -
2、7 -5. 总结和展望 - 9 -6. 参考文献 - 9 -1. 课题研究意义和现状1.1 课题研究意义随着微机技术的不断发展,在许多工程领域单片机的应用日趋广泛,已逐渐取代了单板机。为了适应这一新形势的变化,目前许多高校及一些中等专科学校已不再开设以单板机为主的“微机原理、接口及应用”课程,而直接讲授单片机及有关技术。但是目前缺少相应的实验设备及教材。鉴于这种情况,从教学和科研两个角度出发,我们此次的毕业设计尝试设计一种单片机教学实验板,来满足有关单片机教学实验的要求。从教学实验的角度出发,该实验板可适用于电类专业和非电类专业不同层次单片机教学实验的要求,如:自动化,仪器仪表,电子技术,电子
3、测量,计算机应用,机电一体化等各专业,及机械专业。利用该板可以做各种编程实验,和一些简单的输入输出接口实验。如彩灯实验,数码管显示,音乐盒播放设计,键盘输入,模拟量的输入、输出,数模转换及电机正反转等。上述实验都不需要扩展硬件,该板上将提供全部接口和器件。同时为了强调学生的动手能力,在设计该实验板时,我们把AT89C51单片机的所有控制线、地址线和数据线经驱动后,将全部引入一排接线端子上,这就给系统的扩展提供了便利条件,我们可以在面包板上设计自己的接口电路,由单片机来控制实现。如存储器的扩充、键盘/显示接口芯片的扩展等、若连续做的话,可以使每个同学在自己占用的实验板上,设计成一个独立的应用系统
4、。这对于同学们的实际工作能力,将会有一个很大的促进和提高。1.2 课题研究现状 嵌入式系统作为一个的热门领域,涵盖了微电子技术、电子信息技术、计算机软件和硬件等多项技术领域的应用。随着后PC时代来临,嵌入式应用呈现系统复杂化,应用多样化,硬件集约化、软件平台化等特点。 行业发展现状与趋势: 目前,在上海地区,嵌入式系统开发涉及的行业众多, 水平参差不齐, 大多数停留在8位单片机开发这个层面上, 一部分单位开始采用32位机,并采用了实时操作系统。而具有能够同时进行软件设计和芯片设计的SOC系统设计的系统级高端人才几乎没有, 国际上领先的多核嵌入式系统设计, 可重构嵌入式系统设计在上海市的应用还停
5、留在少数研究单位的研究中。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、; 6.最终实现下载文件程序的运行。 3. 系统软件设计与实现3.1 主程序设计与实现 系统移植与实现1、新建/tftpboot目录,若有则不用新建2、将u-boot-fs4412.bin、uImage与exynos4412-origen.dtb拷贝到tftpboot目录下3、修改tftpboot目录权限 sudo chmod -R 777 /tftpboot4、新建/source目录,若有则不用新建5、将nfsdir压缩包拷贝到该目录下,解压sudo tar -xf nfsdir.ok.tar6、修改source目录权限 sudo chmod -R 777 /source7、检查tftp与n
7、fs服务器是否安装 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.
8、0:69 TFTP_OPTIONS=-l -c -s0 保存退出 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 若为
9、正在运行,则重启:sudo service nfs-kernel-server restart 若停止,则启动:sudo service nfs-kernel-server start9、启动开发板 设置参数: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.
10、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_unusedsaveenv3.2 服务器端程序设计与实现3.2.1服务器端主流程图(
11、如图1) 图13.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);/socketint cliFd=socket(PF_INET,SOCK_STREAM,0);if(-1=cliFd)perror(socket error!);return -1;/print
12、f(socket ok!n);/connectint ret=connect(cliFd,(struct sockaddr*)&servAddr,sizeof(servAddr);if(-1=ret) perror(connect error!); close(cliFd); return -1;printf(connect ok!n);/send/recvint fd=open(2.txt,O_RDONLY);if(-1=fd) perror(open error); return -1;char buf100;memset(buf,0,sizeof(buf);while(1)int ret
13、=read(fd,buf,sizeof(buf);if(0=ret) break;send(cliFd,buf,sizeof(buf),0);/closeclose(cliFd);return 0;3.3 客户端程序设计与实现3.3.1客户端流程图(如图2) 图23.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=
14、inet_addr(192.168.100.200);/socketint servFd=socket(PF_INET,SOCK_STREAM,0);if(-1=servFd)perror(socket error);return -1;printf(socket ok);/bindint ret=bind(servFd,(struct sockaddr*)&servAddr,sizeof(servAddr);if(-1=ret) perror(bind error!); close(servFd); return -1;printf(bind ok!n);/listenret=listen(
15、servFd,10);if(-1=ret)perror(listen error!n);close(servFd); return -1;printf(listen ok!n);/acceptint connFd=accept(servFd,NULL,NULL);if(-1=connFd) perror(accept error!); close(servFd); return -1; printf(accept ok!n);/send/recvint fd=open(2.txt,O_RDONLY);if(-1=fd) perror(open error); return -1;char bu
16、f100;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);/closeclose(servFd);close(connFd);return 0;4. 系统测试4.1 系统软件测试Server端运行结果如下图所示 图3Client端运行如下图所示 图44.2 系统硬件测试程序在虚拟机上运行结果如下所示 图5程序在开
17、发板上运行如下所示 图65. 总结和展望 在嵌入式的学习过程中,让我了解了什么是嵌入式系统。它就是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能、可靠性、成本、体积、功耗有严格要求的计算机系统。他一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、用户应用程序四个部分组成,用于实现对其他设备的控制、监视或管理功能。嵌入式系统已经应用于科学研究、工业控制、军事技术、交通通信、医疗卫生、消费娱乐等领域,人们日常使用的手机、PDA、汽车、智能家电、GPS等均是嵌入式系统的典型代表。老师在讲解过程中,首先交给我们的是一些简单的命令应用,Linux具有很丰富的命令,绝大多数命
18、令具有大量的参数。在学习命令的过程中,只要你认真的看着老师操作还有认真听着他讲,你就会发现有些命令的操作还是很简单的,不过在操作的过程中,我也有遇到有些困难,会出现你按照书上学习的例子,将命令输入终端时会出现你不想要的结果,也就是错误的结果。这是问问旁边的同学或是懂的同学就可以解决了。在对于这部分的学习中,让我知道了命令对于嵌入式的重要性。它是linux的重要内容,linux中所有的功能都是通过命令执行。在实际应用中,为了减少系统开销,经常不使用图形界面,此时,对系统的所有操作都需要以命令方式来执行。在嵌入式系统开发过程中,由于目标机的性能和配置比较低,因此,一般情况下目标机仅具有命令窗口而没有图形界面,对目标机的所有操作都通过命令来实现。6. 参考文献Linux设备驱动开发详解(第2版)华清远见嵌入式培训中心宋老师著Cortex-M3+uC/OS-IT嵌入式系统开发入门与应用华清远见嵌入式培训中心著精通Linux设备驱动程序开发华清远见嵌入式培训中心宋老师翻译Linux内核修炼之道华清远见嵌入式培训中心任桥伟老师著Linux那些事儿华清远见嵌入式培训中心任桥伟老师著
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1