嵌入式应用课程设计(实训)报告书

上传人:lizhe****0001 文档编号:47365818 上传时间:2018-07-01 格式:PDF 页数:24 大小:1.09MB
返回 下载 相关 举报
嵌入式应用课程设计(实训)报告书_第1页
第1页 / 共24页
嵌入式应用课程设计(实训)报告书_第2页
第2页 / 共24页
嵌入式应用课程设计(实训)报告书_第3页
第3页 / 共24页
嵌入式应用课程设计(实训)报告书_第4页
第4页 / 共24页
嵌入式应用课程设计(实训)报告书_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《嵌入式应用课程设计(实训)报告书》由会员分享,可在线阅读,更多相关《嵌入式应用课程设计(实训)报告书(24页珍藏版)》请在金锄头文库上搜索。

1、九 江 学 院信 息 科 学 与 技 术 学 院嵌入式应用开发课程设计嵌入式应用开发课程设计报告书报告书题题目:目:多线程式生产者多线程式生产者-消费者同步互斥程序设计消费者同步互斥程序设计专专业:业:计算机应用技术计算机应用技术班班级:级:姓姓名:名:学学号:号:同组人员:同组人员:指导老师:指导老师:设计时间:设计时间:2目目录录1.实训计划.12.问题描述.13.问题分析.24.业务逻辑.55.程序模块设计.76.技术原理与分析.107.系统测试.158.心得体会.219.参考文献.2211.1.实训计划实训计划2013.12.052013.12.05选择实验任务,明确项目需求,查阅参考

2、书籍2013.12.06、2013.12.09业务逻辑的分析和确定2013.12.102013.12.12项目分析和代码实现2013.12.132013.12.13项目演示、验收、评分2.2.问题描述问题描述生产者消费者问题 (英语: Producer-consumer problem) , 也称有限缓冲问题 (英语:Bounded-buffer problem) ,是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程即所谓的“生产者”和“消费者”在实际运行时会发生的问题。有一个有限的缓冲池(这里用有名管道实现 FIFO 式缓冲区)和两个线程:生产者和消费者,它们分别不停地

3、那产品放入缓冲池和缓冲池中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者、消费者必须临界执行。它们之间的关系如图所示:图 1 “生产者消费者”问题描述这里要求使用有名管道来模拟有限缓冲区, 并且使用信号量解决“生产者消费者”问题同步与互斥问题。生产者123N消费者23.3.问题分析问题分析这一部分以软件工程结构化分析方法中需求分析的内容为核心,对实验项目进行详细的分析。基本要求:此部分内容非常重要,必须有详细的文字分析和相应的图例。3.1 嵌入式 Linux 的 PC 开发环境(1) Ubuntu 10.10 的安装我

4、们采用在 Windows 下安装虚拟机后,再在虚拟机中安装 Linux 操作系统的方案。首先在 Windows 上安装虚拟机软件,常用的虚拟机软件为 Vmware,如何在 Vmware上安装 Ubuntu10.10,安装完后还要安装嵌入式 Linux 的交叉编译环境和开发库以及ARM-Linux 的所有源码。(2)VMware 的安装首先找到其.exe 文件,双击,安装。打开此软件,双击桌面上的快捷方式,虚拟机出现后,点击“打开此虚拟机”。(3)在虚拟机上安装 Ubuntu 10.10打开虚拟机,点击“Open a Virtual Machine”,弹出对话框,选择一配置过的 Ubuntu系统

5、,将光盘资料解压至要安装 Ubuntu 操作系统的磁盘中;选择.vmx 文件,打开返回到虚拟机主页面。点击“开启其虚拟机”便可进行程序的开发。3.1.2 对 hello world 程序的开发(1)实验的开始在 PC 端做准备工作。 首先需要将串口线、 网线、 电源线依次连接好,完成硬件的连接。(2)实验箱进入 Linux 操作系统。先打开实验箱的 power(开关) 。首先进入的是Android 系统,同时按 Vol+和 reset 键,reset 键按一下就,Vol+键按到出现凌阳的字样即可。(3) 打开 VM 虚拟机。打开虚拟机,会出现用户登录,密码输入 111111 即可,进入后会看到

6、 Ubuntu 界面。(4)打开超级终端。在开始-附件-通讯-超级终端,名称任意,串口选用 COM1,设置串口属性应该讲每位秒数设置为 115200,数据流控制选择无即可。超级终端会出现信息,登陆成功后,配置 ip 地址,使用命令 ipconfig eth0 i 192.168.1.100 m255.255.255.0 g 192.168.1.1配置,然后使用servicenetworkrestart命令, 使用ifconfigeth0 查看本地的地址。3(5)编写 C 程:在 VC6.0 中编写 hello.c 文件的代码。(6)编译 C 程序: 打开 Ubuntu 系统中的“主文件夹”保存

7、 hello.c 的文件, 从 Windows拖动到 Ubuntu 中即实现了复制文件,找到应用程序-附件-终端,使用命令 ls,可以查看是否复制到此文件。使用命令 arm-linux-gcc o hello hello.c 即可完成编译。主文件夹上生成可执行文件,如图 2 所示:图 2(7)执行 hello.c 文件。若在终端上直接使用./hello 命令会出现“无法执行二进制文件”的错误,这时需要使用到 FTP,是将编译好的文件,即可执行文件复制到实验箱。(8)FTP 的使用。设置网段。右键单击“网上邻居”-属性-本地连接,双击本地连接-属性,找到 TCP/IP,点击属性-高级-添加,添加

8、的网段为:192.168.1.156,点击“确定”。如图 3 所示:图 3在我的电脑的地址栏输入 ftp:/实验箱的 ip 地址,我们所使用的实验箱 ip 地址为192.168.1.100 刚开始只有文件夹 www。将文件复制到实验箱上:首先在 Ubuntu 的主文件夹中找到 hello 文件,先复制到windows 中,然后复制到 ftp:/192.168.1.100 下面,如图 4 所示:4图 4在超级终端中输入 ls 命令,可看到 hello 已被复制,如果 hello 文件名字不是蓝色的,则说明不能执行此文件,因为未更改其权限,使用命令:chmod 777 hello,使用命令./he

9、llo 便可执行。结果如图 5 所示。图 554.4.业务逻辑这一部分需要详细描述解决问题的业务逻辑,即该实验到底应该怎么做。基本要求:处理问题中的业务关系都要描述清楚。需要文字描述以及业务流图。(1)信号量。这里使用 3 个信号量,其中两个信号量 avail 和 full 分别用于解决生产者和消费者之间的同步问题, mutex 用于解决这里个线程直接的互斥问题。 其中, avail表示有界缓冲区中的空单元数,初始值为 N;full 表示有界缓冲区中的非空闲单元数,初始值为 0;mutex 是互斥信号量,初始值为 1。(2)流程图,总流程图如图 6 所示。图 66(3)编写代码。本实验的代码中

10、采用的有界缓冲区拥有 3 个单元,每个单元为 5 字节。 为了尽量体现每个信号量的意义, 在程序中生产过程和消费过程是随机 (采用 05s的随机时间间隔)进行的,而且生产者的速度比消费者的速度平均快两倍左右(这种关系可以相反) 。生产者一次生产一个单元的产品(放入“hello”字符串) ,消费者一次消费一个单元的产品。75.5.程序模块设计程序模块设计按照模块(即函数)画出每个函数的流程图,并配合必要的文字说明。生产者线程的流程图,流程图如图 7 所示。图 7说明:首先先判断设置的日历时间与 end_time,若小于则继续,否则退出线程。通过调用函数 sem_wait(return 0;12(

11、1)预处理阶段在该阶段,编译器将上述代码中的 stdio.h 编译进来,并且用户可以使用 Gcc 的选项“-E”进行查看,该选项的作用是让 Gcc 在预处理结束后停止编译过程。注意 Gcc 指令的一般格式为:Gcc 选项 要编译的文件 选项 目标文件其中,目标文件可缺省,Gcc 默认生成可执行的文件。(2)编译阶段在这个阶段中,Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。(3)汇编阶段汇编阶段是把编译阶段生成的“.s”文件转成目标文件,读

12、者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。(4)链接阶段在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。可以重新查看这个小程序,在这个程序中并没有定义“printf”的函数实现,且在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了, 在没有特别指定时, Gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“print

13、f”了,而这也就是链接的作用。函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。Gcc 在编译时默认使用动态库。运行该可执行文件即可。四、 Gdb 调试器Gdb 调试器是一款 GNU 开发组织并发布的 UNIX/Linux 下的程序调试工具。 虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的 VC 工具等媲美。13Gdb 的命令可以通过查看 help 进行查找,Gdb 中的命令主要分为以下几类:工作环境相关命令、设置断点与恢复命令、源代码查找。五、 Make 工程管理器所谓工程管理器是指管理较多的文件的。 Make 工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入 Makefile 文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。它大大提高了实际项目的工作效率,而且几乎所

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号