嵌入式linux课程设计报告_第1页
嵌入式linux课程设计报告_第2页
嵌入式linux课程设计报告_第3页
嵌入式linux课程设计报告_第4页
嵌入式linux课程设计报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆科技学院课程设计成果院〔系〕:_电气与信息工程学院_班级:计科普0802学生姓名:庄桐泉学号:2023441067设计地点〔单位〕____I315_________________设计题目:_____聊天程序设计__________________________完成日期:2011年指导教师评语:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________成绩(五级记分制):________________教师签名:_________________________摘要嵌入式linux在电子行业的应用很广泛,学习嵌入式linux显得非常重要。这次课程设计的主要目的是检验上学期学习linux后的效果。通过根底题的代码编写,熟悉linuxC语言编程技巧。通过完成聊天程序的设计,熟悉linux底层编程。利用QT设计界面,缩短开发时间。关键字:嵌入式linux;根底题;聊天程序;QT目录课程设计任务书-4-题目一根底题-6-1设计内容及要求-6-1.1二小题-6-1.2三小题-6-1.3四小题-7-1.3五小题-9-1.4六小题-11-1.5七小题-11-1.6八小题-13-题目二聊天程序设计-15-1.设计内容及要求-15-1.1聊天程序的根本要求-15-1.2需实现的主要功能-15-2.需求分析-15-2.1QT设计-15-2.2效劳器端和客户端的数据传输方式-16-2.3效劳器端功能设计-16-2.4客户端功能设计-17-3.总体设计-17-3.1总体功能-17-4.详细设计-17-4.1功能分析和描述-17-4.2客户端功能模块-17-4.3效劳器功能模块-19-5.代码实现-20-5.1客户端代码-20-5.2效劳器端代码-22-6.功能实现-23-7.总结-23-8.致谢-23-9.参考文献-23-课程设计任务书设计题目:根底题目学生姓名庄桐泉课程名称嵌入式linux课程设计计科普2023地点I315起止时间2011-8-29至设计内容及要求GCC编译器的使用,LINUX系统C程序设计编译、调试方法编写程序将数组内容倒置a[]=〞123456789”利用指针将数据A的内容复制到数据B。创立两线程,通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并发执行的。创立两线程,A线程通过消息队列发消息,B线程收到后在屏幕打印输出,要求两线程个打印出线程号和消息内容。创立两线程,A线程循环打印数组a[100],B线程循环将数组成员+1,要求利用互斥锁,使每次输出a[0]==a[99].创立两线程,A线程每2秒打印一次字母A,B线程每秒打印一次字母B,要求利用同步信号量,使输出字母B总是在A之后。8、通过Makefile,将project中的一个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生成和调用,运行结果正确。设计参数进度要求第一周之内完成参考资料1、嵌入式Linux应用程序开发标准教程.人民邮电出版社。华清远见嵌入式培训中心。2023.72、ZLGARMMAGIC2410实验指导、资料。其它设计题目:聊天程序设计学生姓名庄桐泉课程名称嵌入式linux课程设计计科普2023地点I315起止时间2011-8-29至设计内容及要求1、在QT〔或miniGUI〕编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天2、QT〔或miniGUI〕界面设计至少包括“发送〞,“重置〞两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。选作:发送文件。设计参数进度要求做完根底题目之后开始做此题目。参考资料1、嵌入式Linux应用程序开发标准教程.人民邮电出版社。华清远见嵌入式培训中心。2023.72、ZLGARMMAGIC2410实验指导、资料。其它说明1.本表应在每次实施前一周由负责教师填写二份,学院审批后交学院教务办备案,一份由负责教师留用。2.假设填写内容较多可另纸附后。3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。系主任:指导教师:2023题目一根底题1设计内容及要求1.1二小题编写程序将数组内容倒置a[]=〞123456789”程序代码实现如下:chara[]="0123456789";①chartmp;inti=0,j=0;for(i=0,j=strlen(a)-1;i<=strlen(a)/2-1;i++,j--)②{tmp=a[i];a[i]=a[j];a[j]=tmp;}for(i=0;i<strlen(a);i++)③printf("%c",a[i]);printf("\n");(3)程序分析:①定义数组②数组内容倒置③输出倒置后数组内容〔4〕程序执行效果如下:1.2三小题〔1〕利用指针将数据A的内容复制到数据B。〔2〕程序代码实现如下:charA[]="abcd";charB[]="1234";①inti=0;char*tmp;②tmp=A;③for(i=0;i<strlen(A);i++)④B[i]=*tmp++;for(i=0;i<strlen(A);i++)⑤printf("%c",B[i]);printf("\n");〔3〕程序分析:①定义数组②定义指针③指针指向数组A④移动指针拷贝数字到B中⑤显示拷贝后的数组〔4〕程序执行效果如下:1.3四小题〔1〕创立两线程,通过打印输出各自线程号和打印次序,要求从打印结果看出两个线程是并发执行的。〔2〕程序代码如下:#defineTHREAD_NUMBER 2#defineREPEAT_NUMBER 5#defineDELAY_TIME_LEVELS 10.0void*thrd_func(void*arg)①{ intthrd_num=(int)arg; intdelay_time=0; intcount=0; printf("Thread%disstarting\n",thrd_num); for(count=0;count<REPEAT_NUMBER;count++) { delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1; sleep(delay_time);②printf("\tThread%d:job%ddelay=%d\n",thrd_num,count,delay_time); } printf("Thread%dfinished\n",thrd_num); pthread_exit(NULL);③}intmain(void){ pthread_tthread[THREAD_NUMBER]; intno=0,res; void*thrd_ret; for(no=0;no<THREAD_NUMBER;no++)④ { res=pthread_create(&thread[no],NULL,thrd_func,(void*)no); } for(no=0;no<THREAD_NUMBER;no++) { res=pthread_join(thread[no],&thrd_ret); } return0;}〔3〕程序分析:程序中创立2个线程,为了更加方便地描述线程之间的并行执行,让2个线程重用一个执行函数。每个线程都有5次循环,每次循环之间会随机等待1-10s的时间,意义在于模拟每个任务的到达时间是随机的,更加形象看出线程之间的并行执行。创立线程执行函数,程序中2个线程重用一个执行函数。让线程延时,延时时间随机产生。线程退出。创立2个线程。〔4〕程序执行效果如下:1.3五小题〔1〕创立两线程,A线程通过消息队列发消息,B线程收到后在屏幕打印输出,要求两线程个打印出线程号和消息内容。〔2〕程序代码如下:#defineBUFSZ 512#defineTHREAD_NUMBER 2structmessage①{ longmsg_type; charmsg_text[BUFSZ];};structmessagemsg;intqid;/*Createqueue*/void*thrd_func0(void*arg)②{ intthrd_num=(int)arg;intlen=0; printf("Thread%disstarting\n",thrd_num);sprintf(msg.msg_text,"%s","sendthemsg"); msg.msg_type=getpid(); len=strlen(msg.msg_text); /*添加消息到消息队列*/msgsnd(qid,&msg,len,0);③printf("sendthemessageis:%s\n",(&msg)->msg_text); pthread_exit(NULL);④}void*thrd_func1(void*arg)⑤{ intthrd_num=(int)arg; printf("Thread%disstarting\n",thrd_num); /*读取消息队列*/ msgrcv(qid,&msg,BUFSZ,getpid(),0);⑥printf("recvthemessageis:%s\n",(&msg)->msg_text); pthread_exit(NULL);}void*(*constfunc[THREAD_NUMBER])(void*)={thrd_func0,thrd_func1};intmain(void){ pthread_tthread[THREAD_NUMBER]; intno=0,res; void*thrd_ret; key_tkey; intlen;key=ftok(".",'a');⑦ qid=msgget(key,IPC_CREAT|0666);⑧ for(no=0;no<THREAD_NUMBER;no++) { res=pthread_create(&thread[no],NULL,func[no],(void*)no); } for(no=0;no<THREAD_NUMBER;no++)⑨ { res=pthread_join(thread[no],&thrd_ret); } (msgctl(qid,IPC_RMID,NULL);⑩ return0;}代码分析如下:该程序实现了使用消息队列进行线程之间的通信,包括消息队列的创立、消息发送和读取、消息队列的撤销和删除等操作。定义消息队列消息结构体创立线程0,用于消息队列发送消息添加消息到消息队列退出线程创立线程1,用于消息队列读取消息读取消息队列根据不同的路径和关键表示产生标准的key创立消息队列等待线程从系统内核中移走消息队列〔4〕程序执行效果如下:1.4六小题〔1〕创立两线程,A线程循环打印数组a[100],B线程循环将数组成员+1,要求利用互斥锁,使每次输出a[0]==a[99].〔2〕程序源代码如下:〔3〕程序分析如下:1.5七小题〔1〕创立两线程,A线程每2秒打印一次字母A,B线程每秒打印一次字母B,要求利用同步信号量,使输出字母B总是在A之后。〔2〕程序代码如下:#defineTHREAD_NUMBER 2sem_tsem[THREAD_NUMBER];void*thrd_func0(void*arg)//A①{ arg=arg; while(1){printf("A\n");②sem_post(&sem[1]);③sleep(2); ④ } pthread_exit(NULL);⑤}void*thrd_func1(void*arg)//B⑥{ arg=arg; while(1){sem_wait(&sem[1]);⑦printf("B\n");⑧sleep(1);⑨ } pthread_exit(NULL);}void*(*constfunc[THREAD_NUMBER])(void*)={thrd_func0,thrd_func1};intmain(void){ pthread_tthread[THREAD_NUMBER]; intno=0,res; void*thrd_ret; for(no=0;no<THREAD_NUMBER;no++)⑩ { res=pthread_create(&thread[no],NULL,func[no],(void*)no); } printf("Createthreadsuccess\nWaitingforthreadstofinish...\n"); for(no=0;no<THREAD_NUMBER;no++) { sem_destroy(&sem[no]); } return0;}〔3〕程序分析如下:程序创立两线程,实现A线程每2秒打印一次字母A,B线程每秒打印一次字母B,利用同步信号量,使输出字母B总是在A之后。创立线程0执行函数,用于打印字符’A’打印字符’A’对信号量1进行V操作延时2s退出线程创立线程1执行函数,用于打印字符’B’对信号量1进行P操作打印字符’B’延时1s创立线程〔4〕程序执行效果如下:1.6八小题〔1〕通过Makefile将project中的一个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生成和调用,运行结果正确。〔2〕编写静态库程序thread.c如下:#include<stdio.h>voidpf1(void){printf("********\n");return;}voidpf2(void){printf("#########\n");return;}该程序定义两个函数,分别打印不同的内容,该程序将被编译成.a静态库编写调用程序call.c如下:externvoidpf1(void);externvoidpf2(void);intmain(void){pf1();pf2();return0;}该程序对静态库进行调用,调用静态库中的两个函数pf1和pf2。编写Makefile如下:CC=gccCPPFLAGS=-cOBJS=thread.oSOURCE=thread.cCALL_SOURCE=call.cLIB=libthread.aEXEC=callAR=arthread:${OBJS} ${CC}-c${SOURCE}-o${OBJS} ${AR}rcsv$(LIB)thread.o ${CC}-o${EXEC}${CALL_SOURCE}-L.-lthread.PHONY:cleanclean: -rm-f${OBJS}${EXEC}${LIB}Makefile文件实现对静态库程序编译成.a静态库,并且编译调用静态库的程序call.c为可执行文件call〔4〕程序执行效果如下:题目二聊天程序设计1.设计内容及要求1.1聊天程序的根本要求1、在QT〔或miniGUI〕编写聊天程序,交叉编译后下载到目标机,可实现两台目标机可发送文本聊天。2、QT〔或miniGUI〕界面设计至少包括“发送〞,“重置〞两个按钮,要求必须把目标机的硬件键盘映射到QT设计的软件界面中,实现软件按钮的功能。1.2需实现的主要功能(1)客户端输入效劳器IP和端口号。(2)效劳器必须成功启动。(3)每一个客户端可以寻找效劳器,并且与效劳器建立连接。(4)客户端和效劳器可以实现通信。(5)通信的内容可以显示在面板上。(6)利用QT设计界面,并下载到MagicARM2410上面。2.需求分析2.1QT设计QT设计编写和调试阶段使用周立功MagicARM2410箱子提供的QTforPC编译器,运行测试阶段使用QTforARM编译器。使用QTforPC阶段编译程序的步骤如下〔以编译hello.cpp程序为例〕:〔1〕进入/x86-qtopia目录,运行set-env脚本,设置环境变量。$.set-env〔2〕进入hello目录,然后用progen工具生成工程文件。$cdhello$vihello.cpp$progen–tapp.t–o〔3〕使用tmake工具,生成hello工程的Makefile文件。$tmake-oMakefile〔4〕修改Makefile文件,在LIBS变量中增加需要用到的库,然后输入make命令编译。LIBS=$(SUBLIBS)-L$(QTDIR)/lib-lqte-lm-lstdc++$make〔5〕启动虚拟控制台,运行hello程序〔主机须启动帧缓冲,必须能够访问/dev/fb0〕。$cd/zylinux/x86-qtopia$.set-env$cdhello$./hello–qws如果要将Hello程序发布到MagicARM2410上运行,还需进行以下工作:〔6〕进入/zylinux/arm-qtopia目录,并将hello工程复制到当前目录下。$cd/zylinux/arm-qtopia$cp–av/zylinux/x86-qtopia/hello〔7〕运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。$.set-env$cdhello$tmake-oMakefile〔8〕按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。〔9〕插入USB鼠标和USB键盘,启动MagicARM2410。启动Qtopia的终端,运行hello程序。利用同样的编译方法,客户端QT程序进行编译和调试。客户端QT界面设计客户端QT需要以下根本组件:〔1〕两个QEditLine,一个用于输入效劳器IP地址〔可读可写〕,另一个用于输入效劳器端口号〔可读可写〕。〔2〕三个按钮,一个用于连接效劳器,另一个用于发送消息,最后一个用于清空发送区域数据。〔3〕四个标签,用于显示不用组件的内容。〔4〕两个MultiLineedit,一个用于显示通信内容〔只读〕,一个作为发送区域〔可读可写〕。2.2效劳器端和客户端的数据传输方式效劳器端和客户端的数据是用TCP套接字来传输的。IP地址表示Internet上的计算机,端口号标识正在计算机运行的进程。端口号与IP地址的组合得出一个网络套接字。客户端使用linuxC函数socket建立到效劳器的套接字连接。当套接字连接socket建立后,可以利用linuxC语言中的send函数和recv函数来实现简单的发送和接收消息。2.3效劳器端功能设计由于时间有限,效劳器并没有用QT来编写界面,只是实现一个简单的控制程序。效劳器主要实现有:〔1〕创立套接字〔2〕对套接字、IP地址和端口号进行绑定〔3〕进行监听〔4〕等待客户端的连接〔5〕对客户端接收和发送数据2.4客户端功能设计客户端使用QT设计界面,客户端实现的功能如下:〔1〕创立套接字〔2〕连接效劳器〔3〕与效劳器通信3.总体设计3.1总体功能根据对需求所做的分析,聊天程序需要实现的根本功能应包括以下几个方面:(1)客户端输入效劳器IP和端口号。(2)效劳器必须成功启动。(3)每一个客户端可以寻找效劳器,并且与效劳器建立连接。(4)客户端和效劳器可以实现通信。(5)通信的内容可以方便查看。使用QT设计的界面简洁,大方,操作简单,方便,容易上手,用户可以快速掌握操作流程。4.详细设计4.1功能分析和描述聊天工具包括两大功能模块:客户端和效劳器端。具体实现的功能创立套接字、连接通信、接收数据显示和发送数据。4.2客户端功能模块连接效劳器连接效劳器之前需要解析效劳器地址、创立套接字、设置sockaddr_in结构体中相关参数。4.2.2发送消息功能连接功能是开始聊天前必须进行的步骤,连接成功之后,就可以进行发送消息了。发送消息功能流程图如图2-5所示:图2-5发送消息功能流程图4.2.3接收消息模块连接成功后,就可以接收效劳器发送过来的数据。4.3效劳器功能模块效劳器的设计并没有使用QT编写界面,效劳器端实现的功能有:图2-8效劳器模块流程图5.代码实现5.1客户端代码5.1.1EditDemo::EditDemo(QWidget*parent,constchar*name):QWidget(parent,name){ QGridLayout*grid=newQGridLayout(this,6,3,0,0); //IPaddr QLabel*label1=newQLabel("IPAddr:",this); grid->addWidget(label1,0,0); edit_ip=newQLineEdit(this);edit_ip->setText(""); grid->addWidget(edit_ip,0,1); //ServerPort QLabel*label2=newQLabel("Server grid->addWidget(label2,1,0); edit_port=newQLineEdit(this);edit_port->setText("4321"); grid->addWidget(edit_port,1,1); QPushButton*btn=newQPushButton("Connect",this); /*addtheconnectbutton*/grid->addWidget(btn,2,1); /*addthebutton*/ connect(btn,SIGNAL(clicked()),this,SLOT(ButtonConnect())); //multilineinputmode QLabel*label3=newQLabel("ContractArea:",this); grid->addWidget(label3,3,0); multiedit_contract=newQMultiLineEdit(this);multiedit_contract->setReadOnly(1);//setreadonlygrid->addWidget(multiedit_contract,3,1); QLabel*label4=newQLabel("SendArea:",this); grid->addWidget(label4,4,0); multiedit_send=newQMultiLineEdit(this);grid->addWidget(multiedit_send,4,1); QPushButton*button_send=newQPushButton("Send",this);/*addthesendbutton*/grid->addWidget(button_send,5,0); connect(button_send,SIGNAL(clicked()),this,SLOT(ButtonSend()));QPushButton*button_clear=newQPushButton("Clear",this);/*addtheclearbutton*/grid->addWidget(button_clear,5,1); connect(button_clear,SIGNAL(clicked()),this,SLOT(ButtonClear()));}EditDemo::~EditDemo(){if(socket_flag==1)/*ifcreatesocketsuccess*/{close(sockfd);/*Closethesocket*/printf("Closethesocket\n");}}创立套接字voidEditDemo::CreateSocket(void){ /*地址解析函数*/ host=gethostbyname(edit_ip->text()); /*创立socket*/ sockfd=socket(AF_INET,SOCK_STREAM,0); /*设置sockaddr_in结构体中相关参数*/ serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(atoi(edit_port->text())); serv_addr.sin_addr=*((structin_addr*)host->h_addr); bzero(&(serv_addr.sin_zero),8);}创立线程void*task(void*arg){intrecvbytes=0;charbuf[BUFFER_SIZE]={0};arg=arg;while(1){if((recvbytes=recv(sockfd,buf,BUFFER_SIZE,0))>0){multiedit_contract->append("Serversaid:"+(QString)buf);}}}voidCreateThread(void){ intresult=0; result=pthread_create(&thread1,NULL,task,(void*)0);/*CreateThread*/}5.2效劳器端代码#definePORT 4321#defineBUFFER_SIZE 1024#defineMAX_QUE_CONN_NM 5intmain(){ structsockaddr_i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论