嵌入式系统工程设计实训.docx
- 文档编号:29000465
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:24
- 大小:535.77KB
嵌入式系统工程设计实训.docx
《嵌入式系统工程设计实训.docx》由会员分享,可在线阅读,更多相关《嵌入式系统工程设计实训.docx(24页珍藏版)》请在冰豆网上搜索。
嵌入式系统工程设计实训
苏州市职业大学
实习(实训)报告
名称嵌入式系统工程设计实训
2012年12月31日至2013年1月11日共2周
院 系电子系
班级10电子信息1
姓名孔中宝
系 主 任张红兵
教研室主任陆春妹
指导教师史斌斌
苏州市职业大学
实习(实训)任务书
课程名称:
嵌入式系统工程设计实训
起讫时间:
院系:
电子信息工程系
班 级:
10电子信息
(1)
指导教师:
史斌斌
系主任:
张红兵
一、实习(实训)目的和要求
1、建立交叉编译环境;
2、了解基于嵌入式Web的CGI编程方法;
3、掌握嵌入式驱动程序编程方法;
4、完成应用程序开发后书写设计文档,整理实训报告。
二、实习(实训)内容
“基于嵌入式WEB的远程LED显示系统开发”主要包含以下两个内容:
(1)嵌入式WEB设计:
设计一个Web页面,将目标板作为服务器,宿主机作为客户端,设计菜单栏,实现对目标板的控制。
(2)远程LED显示:
(参照教材P171)驱动目标板的LED模块工作,通过接收宿主机的指令控制显示。
三、实习(实训)方式
√集中□分散√校内□校外
四、实习(实训)具体安排
1、实训任务布置和讲解4课时
2、交叉编译环境搭建;各组确定主题4课时
3、系统程序开发30课时
4、讨论与总结2课时
5、编写实训报告6课时
6、答辩2课时
五、实习(实训)报告内容(有指导书的可省略)
1、实训报告封面
2、实训任务书
3、目录
4、正文(包括交叉编译环境、程序分模块介绍、调试过程、总结、参考文献)
第一章:
绪论
嵌入式系统和Linux的有机结合,成为后PC时代计算机最普遍的应用形式。
嵌入式Linux不仅继承了Linux源代码开发、内核稳定高效、软件丰富、强大的网络支持功能、优秀的开发工具等优势,而且还具备支持广泛的处理器结构和硬件平台占用空间小、成本低等优点。
嵌入式Linux技术在中国有巨大的发展潜力和市场需要。
有数据显示,未来两年里,在计算机、消费电子、通信、汽车电子、工业控制、军事国防这六大主要应用领域,嵌入式Linux产品将达到60亿的市场规模。
嵌入式Linux属于一个交叉学科,涵盖了微电子技术、电子信息技术、计算机软件和硬件等多项技术领域的应用。
另外嵌入式Linux需要相应的嵌入式开发板和软件,还需要有经验的人进行指导开发,目前国内大部分高校都很难达到这种要求,这也造成了目前国内嵌入式Linux开发人才极其缺乏的局面。
这次的课程设计要求我们对嵌入式系统基础知识、嵌入式系统开发过程、ARM体系机构和嵌入式系统的BootLoad开发有所了解以及要知道如何创建嵌入式系统开发环境、如何在ARM平台上移植Linux系统、Linux设备驱动程序开发、USB设备驱动程序开发、嵌入式Linux网络编程和图形用户接口开发。
这次实训所用的硬件平台是锐极RJARM9-EDU教学实验系统,所有的程序都是基于该平台下精心设计的实验,试验程序也可移植到其它ARM平台上。
第二章:
交叉编译环境
嵌入式Linux的开发环境
嵌入式Linux开发使用交叉开发的模式,即在PC机(host)上编译连接程序,下载到目标机(target)上运行使用。
Linux开发嵌入式应用,可以在自己的PC机上装一套Linux,例如,RedHatLinux。
可以用Linux中的XWindows(xterm)开若干个窗口,用于编译、下载、调试等;可以使用Linux中的emacs做文本编辑。
Windows中有的软件在Linux中几乎都有。
多数人对Linux环境和Linux中的应用程序不熟悉,宁愿用PC上基于Windows的操作系统,此时可以在Windows环境下装上Cygwin软件。
GNU中的Cygwin是在Windows下运行Linux的自由软件,但我们发现,Cygwin的兼容性似乎不太好,在有点PC机上能装得上,有的PC机上装不上。
Cygwin的安装过程需要三个小时,有时装到一半出现问题很不好处理。
据说,VMWare的Windows版本也可以在Windows环境下开出Linux的窗口,但VMWare不是自由软件。
我们采用的办法是用一台PC机运行Linux作为服务器。
开发小组中每个成员都可以通过局域网用Telent登录到这台Linux服务器上去,被开发的目标板也挂在网上。
在服务器的Linux环境下,用GNUgcc编译生成目标代码,再用FTP传回到自己的PC机上,然后通过串行口或网络下载到目标机上。
JTAC工具主要用于硬件调试。
因为JTAC工具的支持软件也是Linux下的自由软件,故JTAC工具只能接在Linux服务器的并口上。
硬件调试完成后,可以把Debug程序写入Flash,然后就不需要JTAC工具了。
验证开发环境是否建立好了需要一块目标板。
在开发环境建立起来之前,贸然设计自己的硬件,难度较大。
可以用商家提供的评估板作为目标板,先把开发环境建立起来。
可以通过用GNUgcc编译uClinux然后下载到目标板上运行的办法来熟悉Linux下GNUgcc的开发环境,检验开发环境是否已建立好。
交叉编译
交叉编译(cross-compilation)是指,在某个主机平台上(比如PC上)用交叉编译器编译出可在其他平台上(比如ARM上)运行的代码的过程。
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。
我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。
比如,我们在Windows平台上,可使用VisualC++开发环境,编写程序并编译成可执行程序。
这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为nativecompilation,中文可理解为本机编译。
然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。
这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilationtoolchain)需要很大的存储空间,并需要很强的CPU运算能力。
为了解决这个问题,交叉编译工具就应运而生了。
通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。
交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成。
一般把前者称为目标机,后者称为宿主机。
采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工作转移到高性能的主机中进行。
因此硬件需要目标板和PC机,软件上需要与目标板的平台兼容的编译工具包下载并且安装,编译目标。
第三章:
程序分模块介绍
基于嵌入式WEB的远程LED显示系统开发”主要包含以下两个内容:
(1)嵌入式WEB设计:
设计一个Web页面,将目标板作为服务器,宿主机作为客户端,设计菜单栏,实现对目标板的控制。
(2)远程LED显示:
(参照教材P171)驱动目标板的LED模块工作,通过接收宿主机的指令控制显示。
嵌入式WEB设计
1、在宿主机上修改EXP2/APP/HTTPD/HTML目录下的文件添加LED左栏目选项,具体操作如下图:
图
2、将修改好了的覆盖到目标板的/HOME/HTTPD目录下。
在目标板上的具体命令如下:
宿主机的IP:
子网掩码:
minicom
ifconfigeth0netmaskmkdirnfs
mount/nfs
cdnfs/expriments/EXP2/app/httpd/html
cp/home/httpd
3、打开WEB,在MINICOM界面下,控制目标板,进入刚才MOUNT的目录。
在/RJARM9-EDU/experiments/EXP2/app/boa/src目录下,拷贝执行文件boa到目标板的/bin目录下。
在/RJARM9-EDU/experiments/EXP2/app/目录下,拷贝httpd到目标板的/home目录下(有的home目录下已经有文件)。
具体命令操作如下:
宿主机的IP:
子网掩码:
minicom
ifconfigeth0netmaskmkdirnfs
mount/nfs
cd/nfs/experiments/EXP2/app/boa/src
cpboa/bin
cd/
cd/nfs/experiments/EXP2/app
cp–rhttpd/home
cd/
cdbin
./boa
远程LED显示
在/EXP2/APP/CGI目录下修改如下三个文件:
1、添加四个函数命名及对应FLAG如下(具体程序见附录1):
Ledshow对应FLAG=200
Led_123对应FLAG=202
Led_888对应FLAG=204
Led_hello对应FLAG=206
图
2、添加四个函数对应的头文件声明(具体程序见附录2)
图
3、中定义四个函数(具体程序见附录3)
Ledshow用于显示LED页面,用HTML语言实现,需要添加三个按钮
Led_123参考LED显示程序,显示123456
Led_888参考LED显示程序,显示888888
Led_hello参考LED显示程序,显示HELLO!
图
第四章:
调试过程
1、在宿主机/EXP2/APP/CGI下修改相应程序,修改后MAKE生成新的文件,在目标板上进入mount的对应宿主机目录,将新生成的文件拷贝到目标板的/home/httpd/cgi-bin目录下替换原文件,然后目标板执行./boa,具体命令如下:
宿主机的IP:
子网掩码:
minicom
ifconfigeth0netmaskmkdirnfs
mount/nfs
cd/nfs/experiments/EXP2/app/cgi
cp/home/httpd/cgi-bin
cd/
cd/nfs/experiments/EXP2/app/boa/src
cpboa/bin
cd/
cd/nfs/experiments/EXP2/app
cp–rhttpd/home
cd/
cdbin
./boa
2、在PC机WINXP环境下打开浏览器访问的目标板地址:
图
第五章:
调试结果
进入LED显示页面后出现三个按键
1、按下键1“show:
123456”即在LED显示123456
图
2、按下键2“show:
888888”即在LED显示888888
图
按下键3“show:
HELLO”即在LED显示HELLO!
图
第六章:
总结
课程设计的日子总是过得很快,眨眼间又到了星期四。
这次课程设计的目的是在Windows下通过WEB页面控制Linux嵌入式下的目标板工作,使之能通过LED显示数字。
课程设计的主要工作就是编写程序代码,由于以前课上做过类似的实验,所以我们积累有一定的程序和经验,工作量相对来说不是太大。
在实验的两天是时间里,我们小组主要修改了一个WEB页面程序,还有一个目标板运行用的工程程序。
不得不说,每一次修的程序都有很多这样那样的漏洞,编译一下,错误真多,然后我们就在那边一点点修改程序中的各种错误和漏洞。
有些错误很不好找,但集思广益,人多力量大,最后还是让我们给发现了,例如:
同学在打字的时候把“.”打成了“,”我们看了半天才看出来。
当然,因为有一段时间没有接触嵌入式,所以对Linux的一些程序指令也不大熟悉了,给我们造成了一定的困扰。
虽然编写和调试程序确实不是个太让人兴奋的活计,但是最终克服各种困难把程序给改出来,并能在硬件上运行着实很让人欣慰,有一种满足和成就感。
这次课程设计给我最大的感受就是调试程序要比编写程序耗费更多的精力,调试程序需要的是细心,更多的是耐心,适当的时候也要学会放松自己,休息是为了更好的改程序。
还有,团队合作永远都是完成任务的捷径。
参考文献
【1】杨波ARM&Linux嵌入式系统开发详解北京航空航天大学出版社2007年
附录1()
#include<>
#include<>
#include""
#include""
intmain(intargc,char*argv[]){
char*querystring;
structsplitbackstring,tmp;
inti;
intflag=1;
flag=strcmp(argv[0],"/home/httpd/cgi-bin/");
//gethtmlvarandsplitit
querystring=getenv("QUERY_STRING");
string=splitstring(querystring,'&');
for(i=0;i<;i++){
tmp=splitstring[i],'=');
snprintf[i],100,"%s",[1]);
}
//decidewhichfunctiontouse
if(strcmp[0],"8")==0)
changerootpass();
elseif(strcmp[0],"7")==0)
show_changerootpass();
………………………………
………………………………
elseif(strcmp[0],"200")==0)
Ledshow();
elseif(strcmp[0],"202")==0)
Led_123();
elseif(strcmp[0],"204")==0)
Led_888();
elseif(strcmp[0],"206")==0)
Led_Hello();
else
printf("Systemerror!
");
return(0);
}
附录2()
define__MYHDR_H_
#include<>
#include<>
#include<>
#include<>
#include
#include<>
#include
#include""
externintaccesstime();
………………………………
………………………………
externintLedshow();
externintLed_123();
externintLed_888();
externintLed_Hello();
externintsaveconf();
……………………………
externintconfiguration1();
#endif
附录3()
#include
#include<>
#include<>
#include<>
#include<>
#include
#include
#include<>
#include
//#include<>
#include""
#include""
#include<>
#include
//#include<>
#include<>
#include
#include<>
#include<>
#include""
#defineNOKEY0
#defineUSER_MAX256
#defineIP_COUNT_MAX100
#definePORT_COUNT_MAX100
#defineONLINE_MAX100
#defineMAX_PORTFW256
intLedshow(){
printf("Content-type:
text/html\n\n");
printf("
WEB-LED-1SHOW!
PLSCLICKTOSHOW
主页面显示   123456onClick=\"location='? flag=202'\"> 主页面显示   888888onClick=\"location='? flag=204'\"> 主页面显示   HelloonClick=\"location='? flag=206'\">