嵌入式开发课程设计报告.docx
- 文档编号:6353235
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:21
- 大小:263.72KB
嵌入式开发课程设计报告.docx
《嵌入式开发课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式开发课程设计报告.docx(21页珍藏版)》请在冰豆网上搜索。
嵌入式开发课程设计报告
通信与信息工程学院
嵌入式开发技术
课程设计报告
班级:
姓名:
学号:
指导教师:
设计时间:
2016年1月11日—2016年1月14日
成绩:
评语:
通信与信息工程学院
二〇一六年
目录
嵌入式课程设计1
1设计要求1
1.1基本题型1
1.2综合题型2
2开发环境、开发工具2
3设计过程及结果5
3.1实现交叉编译环境5
3.2第几小组成员步骤5
3.3实现Linux系统下的简易聊天室7
4设计总结20
参考文献22
嵌入式课程设计
1设计要求
1.1基本题型
(1)嵌入式开发环境配置
①采用vmware+linux配置开发主机系统,要求构建linux系统,配置nfs,samba;
②掌握minicom、samba及NFS使用,能利用其实现windows、linux开发主机与嵌入式实验系统间的通信;
③利用NFS服务实现主机与实验系统间文件共享;
④利用提供的工具构建交叉编译环境;
要求:
在下图时间上面一行显示小组成员姓名
Armv4l-unknown-linux-gcc是否在/opt/host/armv4l/bin/,如果不是这个路径,请使用vi修改/root/.bash_profile文件中。
ATH变量为PATH=$PATH:
$HOME/bin:
/opt/host/armv4l/bin/,存盘后执行:
source/root/.bash_profile
(2)熟悉VI、GCC、GDB及MAKE文件使用;
(3)在开发系统中编写一个程序,实现打印“通信工程13级第3小组嵌入式开发技术课程设计基础内容”功能,编写makefile文件,并通过NFS下载到实验箱中,验证交叉编译环境配置。
1.2综合题型
基于socket编程的简单聊天室程序设计:
(1)掌握linux下socket编程方法;
(2)基于C语言设计一个简单的聊天室程序,PC运行客户端程序,嵌入式系统运行服务器端程序,服务器随时侦听客户端请求并将其接入,要求至少实现2个客户端接入服务器并进行通信的功能;
(3)编写Makefile文件;
(4)利用NFS将程序下载到实验箱中,编译执行。
(5)课程设计报告中应包含服务器端socket创建、绑定、监听、允许接入及接收数据等关键代码及其说明,客户端请求及数据发送等关键代码及说明;
2开发环境、开发工具
(1)安装VWware软件
①开始安装加载文件.双击该文件的图标,进入加载安装文件的界面。
②设置安装类型。
安装文件加载完毕后进入开始安装界面。
单击next按钮后,进入安装类型选择界面,选择tyical选项。
③执行软件包的安装选项,依据所做的选择,把对应的软件组件安装到系统中,输入正确的序列号。
(2)配置VMware
①打开桌面上VMware图形,双击打开
②再打开原来的文件夹,把汉化包打开
③执行软件的安装选项,依据所做的选择,确认安装。
确认完后,即配置完成。
④点击打开虚拟机,选择标准,下一步,执行软件的安装选项。
接下是密钥,填写老师所给的密码。
安装完成。
(3)安装驱动
点击安装包,根据软件的安装选项,点击next按钮,即可安装完成。
注:
在电脑上安装好虚拟机之后配置相关参数
①配置NFS:
点击菜单运行系统设置->点击服务器设置->NFS服务器,点击增加,在目录中选择共享目录的路径,在主机(host)中填入主机IP地址(192.168.1.12),并选择客户对共享目录的操作位读写(Read/write);在常规选项中选择允许来自高于1024的端口的连接,点击确定后即可配置好NFS。
配置完成后,可以简单测试一下NFS是否配置好了:
在虚拟机上自己mount自己,看是否成功就可以判断NFS是否配好了。
mount192.168.1.12:
/arm2410cl/host
之后ls命令查看arm2410cl之下的文件目录,如果文件目录在,那么说明NFS配置成功。
②端口配置
用串口线连接好笔记本电脑和2410经典版平台。
计算机,属性,设备管理器,端口
高级设置下端口号COM1
进入虚拟机设置,串行端口
3设计过程及结果
3.1实现交叉编译环境
结果:
3.2第几小组成员步骤
(1)创建工作目录
【root@vm-dev~】#mkdirwinter
【root@vm-devwinter】#cdwinter
(2)编写winter.c文件
【root@vm-dev~】#viwinter.c
(3)编写Makefile文件
CC=armv4l-unknown-linux-gcc
EXEC=clientserver
OBJS=client.oserver.o
CFLAGS+=
LDFLAGS+=-static
all:
$(EXEC)
$(EXEC):
$(OBJS)
$(CC)$(LDFLAGS)–o$@$(OBJS)
clean:
-rm–f*.elf*.gdb*.o
其中,
CC指明编译器
EXEC表示编译后生成的执行文件名称
OBJS目标文件列表
CFLAGS编译参数
LDFLAGS连接参数
all:
编译主入口
clean:
清除编译结果
(4)运行make编译程序
【root@vm-dev~】#makeclean
【root@vm-devwinter】#make
(5)源程序
#include
intmain(void)
{
printf(“通信工程13级第三小组嵌入式开发技术课程设计基础内容“);
}
6)结果
由于电脑与开发板不匹配,结果没有办法出来
3.3实现Linux系统下的简易聊天室
(1)程序流程图
(2)程序工作过程
服务端处于监听状态,客户端发送请求,连接成功并通信。
首先服务端调用socket()函数创建一个套接字,然后把协议,端口号,ip信息通过bind()进行绑定。
以上操作完后服务端就开始监听客户端的请求,并设置监听的最大数目。
当客户端发送链接请求时,服务端就调用accept()函数接受客户端的请求。
然后对于客户端来说,也是要先调用socket()函数创建客户端的套接字,这里是用的TCP协议,所以可以不用bind()函数。
接着调用connect()函数与服务端建立连接。
当服务端和客户端建立连接时,可以通过彼此之间的套接字描述符来进行数据传输。
其中一方通过send函数把数据写入数据缓冲区,另一方通过recv()函数从缓冲区内读出数据,这样就完成了服务端与客户端之间的数据传输。
当双方数据传输完成后,函数close()关闭各自的套接字,使客户端和服务端通信中断。
(3)socket编程方案
①设计一个简单的聊天室程序,PC运行客户端程序,嵌入式系统运行服务器端程序,服务器随时侦听客户端请求并将其接入,要求至少实现2个客户端接入服务器并进行通信的功能;
②Makefile文件
③NFS将程序下载到实验箱中,编译执行。
注:
程序里的函数解释
(1)Socket()
作用:
socket函数为客户机或服务器创建一个sokcet
格式:
intsocket(intfamily,inttype,intprotocol);
参数说明:
Family:
表示地址族,可以去AF_UNLX和AF_INT。
其中,AF_UNLX只能够用于单一的UNIX系统进程间通信;AF_INT是针对Internet的,因而可以允许在远程主机之间通信,实验中使用AF_INT。
Type:
网络程序所采用的通信协议,可以取SOCK_STREAM或SOCK_DGRAM。
其中,SOCK_STREAM表明使用的是TCP协议,这样提供按顺序的、可靠的、双向、面向连接的比特流;SOCKE_DGRAM表明使用的是UDP协议,这样只会提供定长、不可靠、无连接的通信。
(2)bind()
格式:
intbind(intsockfd,structsockaddr*addr,intaddrlen);
参数说明:
Sockfd:
socket的文件描述符号。
Sockaddr:
表示名字所用的一个数据结构,用来保存地址(包括IP地址和端口)
Addrlen:
设置结构大小长度。
(3)listen()
格式:
intlisten(intsockfd,intbacklog);
作用:
监听连接信号,和accepted函数合同。
参数说明:
Sockfd:
表示socket调用返回的文件描述符。
Backlog:
表示接入队列允许的连接数目,大多数系统允许20个,也可以子定义5~10个。
(4)accept()
格式:
Intaccept(intsockfd,void*addr,int*addrlen);
作用:
与listen函数合用,监听信息、接收客户端请求。
参数说明:
Sockfd:
表示socket的文件描述符。
Addr:
表示指向局部的数据结构structsockaddr-in的指针。
Addrlen:
表示地址的长度。
(5)connect()
格式:
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);
作用:
在面向连接的系统中客户及连接服务器时使用,connect必须在bind后使用。
参数作用:
Sockfd:
表示socket的文件描述符。
Serv-addr:
表示村访目的端口和ip地址(套接字)的数据结构。
(6)send()和recv()
格式1:
Intsend(intsockfd,constvod*msg,intlen,intflags);
功能:
发送信息。
格式2:
Intrecv(intsockfd,void*buf,intlen,usignedintflags);
作用:
用于流式socket、数据报socket内部之间的通信。
(7)close()和shutdown()
格式:
Close(intsockfd)
或
Intshutdown(intsockfd,intf);
参数说明:
f的值为下面一种:
0----不允许继续接收;
1----不允许继续发送;
2---不允许继续发送和接收。
(8)有关线程的系统调用函数pthread_create()、pthread_join()
实验过程说明(使用TCP/IP)
(1)监听连接
利用socket、bind、listen建立连接,步骤是:
1)先用socket函数初始化socket,创建新的sockfd。
Sockfd=socket(AF_INT,SOCK_STREAM,0)
2)此步骤涉及到IP地址及其处理过程。
参数说明:
inet_addr函数INADDR_ANY
该函数把由小数点分开的十进制IP地址转为unsingedlong类型,而在实验中所使用的为INADDR_ANY,使用利用自已的IP地址自动填充。
a)利用bind函数绑定端口和IP地址。
My_addr.sin_family=AF_INET;/*将地址族类型设定好*/
My_addr.sin_port=htons(MYPORT;/*将端口给其赋值*/
My_addr.sin_addr.s_addr=INADDR_ANY;/*用连接地址自动填充ip*/
Bind(sockfd,(stuctsockaddr*)&my_addr,sizeof(stuctsockaddr));
/*sockfd是分配的socket名字,my-addr则便是分配好的端口与IP,用bind绑定*/
b)利用listen监听请求
(2)发送请求
1)利用gethostbyname获取主机信息。
2)初始化socket端口。
3)利用connect函数将自己的IP地址等信息发送到主机,等待主机调用accept函数来接受请求。
(3)主机接收请求,进行数据通信
1)主机利用accept接收请求。
2)创建子进程,显示欢迎信息;
3)接收返回信息,显示连接成功,并推出连接;
4)关闭客户端口socket;
5)关闭服务端socket,结束子线程。
(4)实现步骤
①建立工作目录
【root@vm-dev~】#mkdirserver
【root@vm-devserver】#cdserver
【root@vm-devserver】#viserver.c
【root@vm-dev~】#mkdirclient
【root@vm-devclient】#cdclient
【root@vm-devclient】#viclient.c
②编写程序源代码
程序附后
③编译实现过程
ⅰ.在编写完TCP服务端程序server.c后,用armv4l-unknown-
linux-gcc–lpthread–oserver.cserver生成程序server。
ⅱ.在编写完TCP客户端程序client.c后,用armv4l-unknown-linux-gcc–oclient.cclient生成程序client
ⅲ.在嵌入式系统上运行server。
在主机上打开一个窗口,运行client,输入服务器的IP地址,并检查器结果的正确性。
ⅳ.输入:
#./server
#./client192.168.1.12(192.168.1.12为本机的ip地址)
ⅴ.输出:
#server:
gotconnectionfrom192.168.1.12
ⅵ.客户端发送信息服务器端接收信息。
客户端通过键盘输入消息内容平回车,以发送消息给服务器端;
ⅶ.结果:
服务端:
客户端:
注:
源程序
客户端代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSERVER_PORT8887/*客户机连接远程主机的端口*/
#defineMAXDATASIZE100/*每次可以接收的最大字节*/
#defineSERVER_IP"192.168.1.13"/*服务器的IP地址*/
//#defineWELCOME“******WELCOMETOTHECHATROOM*****”
intmain()
{
intsockfd,numbytes;
charbuf[MAXDATASIZE];
structsockaddr_inserver_addr;
printf("\n======================clientinitialization======================\n");
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit
(1);
}
//结构体的定义与初始化
server_addr.sin_family=AF_INET;//使用IPv4的协议
server_addr.sin_port=htons(SERVER_PORT);//端口号,htons()把16位值从主机字节序转换成网络字节序
server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);ip地址
bzero(&(server_addr.sin_zero),sizeof(server_addr.sin_zero));
//将第一个参数所指的内存区域前sizeof(第二个参数)个字符清零
if(connect(sockfd,(structsockaddr*)&server_addr,sizeof(structsockaddr_in))==-1)//)&server_addr服务器端地址
{
perror("connect");
exit
(1);
}
//循环输入文字
while
(1)
{
bzero(buf,MAXDATASIZE);
printf("\nBeginreceive...\n");
if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
//buf接收数据缓冲区,numbytes接收的字节数
{
perror("recv");
exit
(1);
}
elseif(numbytes>0)
{
intlen,bytes_sent;
buf[numbytes]='\0';
printf("Received:
%s\n",buf);
printf("Send:
");
charmsg[MAXDATASIZE];
scanf("%s",msg);
len=strlen(msg);
//发送至服务器
if(send(sockfd,msg,len,0)==-1)
//msg要发送的数据指针
{
perror("senderror");
}
}
else
{
//numbytes=0,表示socket已断开
printf("soketend!
\n");
}
}
close(sockfd);
return0;
}
服务器端代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineMYPORT8887
#defineMYKEY12345
#defineSIZE10240
intmain()
{
charbuf[100];
memset(buf,0,100);
intserver_sockfd,client_sockfd;
socklen_tserver_len,client_len;//?
structsockaddr_inserver_sockaddr,client_sockaddr;
printf("\n======================serverinitialization======================\n");
server_sockfd=socket(AF_INET,SOCK_STREAM,0);//定义套接字类型
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(MYPORT);
server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
server_len=sizeof(server_sockaddr);
//允许重复使用本地地址和套接字绑定
inton=1;
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定端口
if(bind(server_sockfd,(structsockaddr*)&server_sockaddr,server_len)==-1)
{
perror("bind");
exit
(1);
}
//监听端口
if(listen(server_sockfd,5)==-1)
{
perror("listen");
exit
(1);
}
client_len=sizeof(client_sockaddr);
pid_tppid,pid;
while
(1)
{
if((client_sockfd=accept(server_sockfd,(structsockaddr*)&client_sockaddr,&client_len))==-1)
{
perror("accepterror");
exit
(1);
}
else
{
send(client_sockfd,"YouhaveconnectServer!
",strlen("YouhaveconnectServer!
"),0);
}
printf("\n%s:
%dLoginserver!
\n\n",inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port));
//,inet_ntoa将32位二进制形式的IP地址转换为数字点形式的IP地址
ppid=fork();//创建子进程
if(ppid==-1)
{
printf("fork1failed:
");
}
elseif(ppid==0)//子进程用于接收客户端信息并发送
{
intrecvbytes;
pid=fork();//再次创建子进程
if(pid==-1)
{
printf("fork2failed:
");
exit
(1);
}
elseif(pid==0)//子进程的子进程用于接收消息
{
while
(1)
{
bzero(buf,100);
if((recvbytes=recv(client_sockfd,buf,100,0))==-1)
{
perror("readclient_sockfdfailed:
");
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 开发 课程设计 报告