ImageVerifierCode 换一换
格式:DOC , 页数:14 ,大小:57.04KB ,
资源ID:3995959      下载积分:8 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/3995959.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(基于ARM的多线程应用程序设计.doc)为本站上传会员【精***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

基于ARM的多线程应用程序设计.doc

1、开放性实验报告题目:基于ARM的多线程应用程序设计院系名称:电气工程学院专业班级:自动1302学生姓名:张鹏涛学号:201323020219指导教师:张晓东成绩:指导老师签名: 日期:2017.1.6 目 录1 系统概述与设计要求11。1 系统概述11.2 设计要求22 方案论证22.1 实现方法22。2 线程优势23 硬件设计33.1 树莓派接口驱动LED电路设计34 软件设计44.1 驱动三色LED灯44。1。1 驱动实现方法44。1。2 wiringPi库安装和软件编程44。2 服务器和客户端54.2。1 服务器设计方法54.2。2 客户端设计方法55 系统调试6设计心得6参考文献7附录

2、1(LED驱动程序)8附录2(服务器程序)10附录3(客户端程序代码)161 系统概述与设计要求1。1 系统概述 本系统设计是基于树莓派开发板上实现的,树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,EbenUpton/埃厄普顿为项目带头人。2012年3月,英国剑桥大学埃本阿普顿(Eben Epton)正式发售世界上最小的台式机,又称卡片式电脑,外形只有信用卡大小,却具有电脑的所有基本功能,这就是Raspberry Pi电脑板,中文译名”树莓派”。它是一款基于ARM的微型电脑主板,以SD/MicroSD卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100

3、以太网接口(A型没有网口),可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上,具备所有PC的基本功能.而树莓派2具有900MHz内核频率, 4核 ARM Cortex-A7,1GB 内存,带Micro SD 卡插槽(支持通过它启动 Linux 操作系统,如 Fedora),40PIN接口(可以增加驱动外设)。本系统设计正式在树莓派2环境下开发实现多线程设计,设计的主要功能就是两个客户端通过服务器互相收发信息。1.2 设计要求 要求多个客户端能够同时连接服务器,而服务器需要创建线程来管理这多个客户端,并且能够把一个

4、客户端发来的数据进行解析,发给另一个客户端,实现两个甚至多个客户端互相收发信息。能够通过驱动三色灯来发现系统运行的状态,红色说明有错误发生,绿色说明正在正常运行,蓝色说明有用户连接,绿色说明有客户端互相收发信息。2 方案论证2。1 实现方法 要实现服务器同时管理两个甚至多个客户端,就必须引入进程或线程.2。2 线程优势 一是和进程相比,它是一种非常节俭”的多任务操作方式. 进程是系统中程序执行和资源分配的基本单位.我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这就导致了进程在进行切换等操作起到了现场保护作用, 这是一

5、种”昂贵”的多任务工作方式。 但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程演化中出现了另外一个概念,这就是线程,也被人称为轻量级的进程.它是一个进程内的基本调度单位。线程是在共享的内存空间中并发的多道执行路径,它们共享一个进程的资源,比如文件描述符和信号处理等。因此,大大减少了上下文切换的开销。 二是线程间方便的通信机制。 对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带

6、来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方.3 硬件设计3。1 树莓派接口驱动LED电路设计图 3。1 从图3。1可以知道,要想让三色灯的红色亮起来,首先控制树莓派GPIO。27引脚输出低电平,同理可以控制GPIO.28、GPIO29引脚电瓶来控制绿、蓝LED的启动和关闭。树莓派开发板上的相关引脚如图3.2。图 3。24 软件设计4。1 驱动三色LED灯4。1。1 驱动实现方法 控制引脚电瓶的高低就能实现控制LED灯的变化,实际上三色LED可以显示无数种颜色,要想超过三种颜

7、色的显示实现,就必须引入PWM.PWM是模拟脉宽调制来控制输出引脚的实际输出电瓶大小,此系统可以控制引脚从03。3V变化来显示不同的颜色.wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等.4.1.2 wiringPi库安装和软件编程 首先需要在树莓派上安装wiringPi库,我们选择直接在网上下载安装源码,输入命令:cd 进入根目录下,输入命令:git clone git:/git。dro

8、gon。net/wiringPi 从网上下载源码包,输入命令cd wiringPi 进入安装包目录下,依次输入命令:configure make make install来配置、编译和安装,最后输入命令sudo ./build 来执行编译之后生成的可执行文件,完成安装。最后输入命令:gpio readall会出来引脚图来确定已经安装成功。 接下来就需要运用库的软件编程来驱动led灯啦,在写C文件时首先要加入库的头文件:include wiringPi。h和C语言必要的头文件:include include #include include string。h include signal。h #

9、include include include fcntl.h #include #include include include arpa/inet.h include pthread。h #define BUFSIZE 1024 int socket_client2; int socket_create(int port) int st = socket(AF_INET, SOCK_STREAM, 0); int on = 1; if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on)) = -1) printf(setsock

10、opt is failed sn, strerror(errno)); return 0; struct sockaddr_in addr; memset(&addr, 0, sizeof(addr); addr.sin_family = AF_INET; addr。sin_port = htons(port); addr.sin_addr。s_addr = htonl(INADDR_ANY); if (bind(st, (struct sockaddr *) &addr, sizeof(addr) = -1) printf(zhang。pt:bind is failed %sn, strer

11、ror(errno)); return 0; if (listen(st, 300) = 1) printf(”zhang。pt:listen is failed %sn”, strerror(errno)); return 0; return st; void deliver(int index, const char buf, ssize_t len) ssize_t rc = 0; if(index = 0) if (socket_client1 = 0) printf(%d:user not onlinen”, index); else rc = send(socket_client1

12、, buf, len, 0); printf(”send:s,send:%u bytesn”, buf, rc); if (rc = 0) if (rc = 0) printf(zhang。pt:send failed, disconnection,n); else printf(zhang.pt:send failed, %sn, strerror(errno); if(index = 1) if(socket_client0 = 0) printf(”d:user not onlinen”, index); else rc = send(socket_client0, buf, len,

13、0); printf(send:%s,send:u bytesn”, buf, rc); if(rc = 0) if (rc = 0) printf(”zhang。pt:send failed, disconnection,n”); else printf(”zhang。pt:send failed, sn”, strerror(errno)); void socket_work(int index) char bufBUFSIZE; ssize_t rc = 0; while(1) memset(buf, 0, sizeof(buf)); rc = recv(socket_clientind

14、ex, buf, sizeof(buf), 0); if (rc = 0) if (rc = 0) printf(”%d:recv disconnectionn”, index); else printf(%d:recv failed, %sn”, index, strerror(errno); close(socket_clientindex); socket_clientindex = 0; break; else printf(”d:recv:%s,recv:u bytesn, index, buf, rc); deliver(index, buf, rc); void *socket_

15、handle(void *arg) int client_st = (int *)arg; free(int )arg); printf(”zhang。pt:handle_thread is beginn); int index = 0; if (socket_client0 = 0) socket_client0 = client_st; else if (socket_client1 = 0) socket_client1 = client_st; index = 1; else close(client_st); return NULL; socket_work(index); prin

16、tf(”zhang.pt:handle_thread is endn); return NULL; void sockaddr_toa(const struct sockaddr_in addr, char *IPAddr) unsigned char p = (unsigned char )(addr-sin_addr。s_addr); sprintf(IPAddr, u。u。u.u”, p0, p1, p2, p3); void socket_accept(int st) pthread_t thr_d; pthread_attr_t attr; pthread_attr_init(&at

17、tr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); while(1) memset(&client_addr, 0, sizeof(client_addr)); int client_st = accept(st, (void )client_addr, &len); if(client_st = 1) printf(”zhang。pt:accept failed sn”, st

18、rerror(errno)); break; else char sIP32; memset(sIP, 0, sizeof(sIP); sockaddr_toa(client_addr, sIP); printf(”zhang。pt:accept by %sn”, sIP); int tmp = malloc(sizeof(int); tmp = client_st; pthread_create(&thr_d, attr, socket_handle, tmp); pthread_attr_destroy(attr); int main(int arg, char *args) if(arg

19、 2) printf(”zhang.pt:server port error!n”); return 0; int iport = atoi(args1); if(iport = 0) printf(”zhang。pt:port %d is invalid!n”, iport); return 0; printf(zhang。pt:server is begin*v!n”); memset(socket_client, 0, sizeof(socket_client); int st = socket_create(iport); if(st = 0) return 0; socket_acc

20、ept(st); close(st); printf(zhang。pt:server is endn); return 0; 附录3(客户端程序代码)include include stdlib.h include include include include arpa/inet.h #include sys/types.hinclude sys/socket。h #include pthread。h #define BUFSIZE 1024 void *socket_read(void *arg) int st = *(int )arg; char bufBUFSIZE; while(1)

21、 memset(buf, 0, sizeof(buf); ssize_t rc = recv(st, buf, sizeof(buf), 0); if(rc = 0) printf(”zhang。pt:recv failed, %sn, strerror(errno)); break; else printf(”zhang.pt:recv:s,recv:u byten”, buf, rc); return NULL; void *socket_write(void *arg) int st = (int )arg; char bufBUFSIZE; while(1) memset(buf, 0

22、, sizeof(buf); read(STDIN_FILENO, buf, sizeof(buf)); int ilen = strlen(buf); if(bufilen 1 = n) bufilen 1 = 0; ssize_t rc = send(st, buf, sizeof(buf), 0); printf(”zhang。pt:send:%s,send:%u byten, buf, rc); if(rc = 0) printf(zhang.pt:send failed, %sn”, strerror(errno); return NULL; int socket_connect(c

23、onst char hostname, int iport) int st = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; memset(addr, 0, sizeof(addr)); addr。sin_family = AF_INET; addr.sin_port = htons(iport); addr。sin_addr。s_addr = inet_addr(hostname); if(connect(st, (struct sockaddr )addr, sizeof(addr)) = 1) printf(”zhan

24、g。pt:connect failed %sn, strerror(errno); else printf(”zhang。pt:connect successn”); return st; int main(int arg, char *args) if(arg 3) printf(”zhang.pt:server ip port error!n”); return 0; int iport = atoi(args2); if(iport = 0) printf(zhang.pt:port d is invalidn, iport); return 0; printf(zhang。pt:client is beginn”); int st = socket_connect(args1, iport); if(st = 0) return 0; pthread_t thr_read, thr_write; pthread_create(&thr_read, NULL, socket_read, st); pthread_create(thr_write, NULL, socket_write, st); pthread_join(thr_read, NULL); close(st); printf(zhang。pt:client is endn”); return 0; 12

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服