基于ARM的多线程应用程序设计
- 格式:doc
- 大小:947.92 KB
- 文档页数:17
开放性实验报告
题目: 基于ARM的多线程应用程序设计院系名称:电气工程学院
专业班级:自动1302
学生姓名:张鹏涛
学号:201323020219
指导教师:张晓东
目录
1 系统概述与设计要求 (2)
1.1 系统概述 (2)
1.2 设计要求 (2)
2 方案论证 (2)
2.1 实现方法 (2)
2.2 线程优势 (2)
3 硬件设计 (3)
3.1 树莓派接口驱动LED电路设计 (3)
4 软件设计 (4)
4.1 驱动三色LED灯 (4)
4.1.1 驱动实现方法 (4)
4.1.2 wiringPi库安装和软件编程 (5)
4.2 服务器和客户端 (5)
4.2.1 服务器设计方法 (5)
4.2.2 客户端设计方法 (6)
5 系统调试 (6)
设计心得 (8)
参考文献 (9)
附录1(LED驱动程序) (10)
附录2(服务器程序) (10)
附录3(客户端程序代码) (14)
1 系统概述与设计要求
1.1 系统概述
本系统设计是基于树莓派开发板上实现的,树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,Eben·Upton/埃·厄普顿为项目带头人。2012年3月,英国剑桥大学埃本·阿普顿(Eben Epton)正式发售世界上最小的台式机,又称卡片式电脑,外形只有信用卡大小,却具有电脑的所有基本功能,这就是Raspberry Pi电脑板,中文译名"树莓派"。它是一款基于ARM的微型电脑主板,以SD/MicroSD 卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100 以太网接口(A型没有网口),可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上,具备所有PC的基本功能。而树莓派2具有900MHz内核频率,4核ARM Cortex-A7,1GB 内存,带Micro SD 卡插槽(支持通过它启动Linux 操作系统,如Fedora),40PIN接口(可以增加驱动外设)。本系统设计正式在树莓派2环境下开发实现多线程设计,设计的主要功能就是两个客户端通过服务器互相收发信息。
1.2 设计要求
要求多个客户端能够同时连接服务器,而服务器需要创建线程来管理这多个客户端,并且能够把一个客户端发来的数据进行解析,发给另一个客户端,实现两个甚至多个客户端互相收发信息。能够通过驱动三色灯来发现系统运行的状态,红色说明有错误发生,绿色说明正在正常运行,蓝色说明有用户连接,绿色说明有客户端互相收发信息。
2 方案论证
2.1 实现方法
要实现服务器同时管理两个甚至多个客户端,就必须引入进程或线程。
2.2 线程优势
一是和进程相比,它是一种非常"节俭"的多任务操作方式。
进程是系统中程序执行和资源分配的基本单位。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这就导致了进程在进行切换等操作起到了现场保护作用, 这是一种"昂贵"的多任务工作方式。
但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程演化中出现了另外一个概念,这就是线程,也被人称为轻量级的进程。它是一个进程内的基本调度单位。线程是在共享的内存空间中并发的多道执行路径,它们共享一个进程的资源,比如文件描述符和信号处理等。因此,大大减少了上下文切换的开销。
二是线程间方便的通信机制。
对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。
3 硬件设计
3.1 树莓派接口驱动LED电路设计
图 3.1
从图3.1可以知道,要想让三色灯的红色亮起来,首先控制树莓派GPIO.27引脚输出低电平,同理可以控制GPIO.28、GPIO29引脚电瓶来控制绿、蓝LED的启动和关闭。树莓派开发板上的相关引脚如图3.2。
图 3.2
4 软件设计
4.1 驱动三色LED灯
4.1.1 驱动实现方法
控制引脚电瓶的高低就能实现控制LED灯的变化,实际上三色LED可以显示无数种颜色,要想超过三种颜色的显示实现,就必须引入PWM。PWM是模拟脉宽调制来控制输出引脚的实际输出电瓶大小,此系统可以控制引脚从0~3.3V变化来显示不同的颜色。wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等。
4.1.2 wiringPi库安装和软件编程
首先需要在树莓派上安装wiringPi库,我们选择直接在网上下载安装源码,输入命令:cd ~ 进入根目录下,输入命令:git clone git:///wiringPi 从网上下载源码包,输入命令cd wiringPi 进入安装包目录下,依次输入命令:configure make make install来配置、编译和安装,最后输入命令sudo ./build 来执行编译之后生成的可执行文件,完成安装。最后输入命令:gpio readall会出来引脚图来确定已经安装成功。
接下来就需要运用库的软件编程来驱动led灯啦,在写C文件时首先要加入库的头文件:#include
完整代码如附录1。
4.2 服务器和客户端
4.2.1 服务器设计方法
为了方便起见,我们把服务器和客户端都定义在本地IP上进行测试,服务器端的话,首先我们需要把主函数传入的端口号记录下来,并且利用C语言标准函数atoi 转换成整型值。接着我们定义两个整型数组来存放两个客户端的套接字,然后我们根据端口去创建服务器,创建服务器需要几个函数来实现,第一个就是socket()函数来创建一个服务器的套接字,此函数有3个输入参数,我们选择ipv4协议族,流式Socket,TCP协议类型。然后根据端口号和本地IP配置服务器,之后就是调用绑定bind(),监听listen()函数来完成服务器的创建。之后就是根据创建的套接字来进行循环,如果有客户端连接,就保存客户端套接字创建一个线程去处理,此处我们以两个客户端为例来进行操作。若是套接字编号0发来消息,我们就转发给套接字编号1,若是超过2个的客户端连接进来我们直接关闭创建的线程就行,之后要是有客户