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

下载本文档

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

文档简介

目 录一、前言211 课题研究背景212 课程研究目的和意义2二 、需求分析4三、开发环境及系统结构531 开发环境532 系统结构6四、详细设计741 arm linux的建立7411 建立交叉编译环境7412 编译内核9413 生成并配置根文件系统1342 bootloader的移植15 421 移植的环境15 422 移植的步骤1543 基于s3cc400的嵌入式web服务器boa移植20 431 配置开发板网络20433 web静态网页制作23434 cgi程序login.c程序。23五、 结论26一、前言11 课题研究背景 随着3c融合进程和我国传统产业结构升级的加速,人们对设备越来越高的应用需要已经无法满足当前和未来高性能的应用与发展需求。显然,嵌入式系统的软、硬件技术和开发手段,正日益受到重视,成为各领域技术创新的重要基础。目前,嵌入式系统是近年来发展很快的计算机方面的学科方向,并迅速渗透到控制、自动化、仪器仪表等学科。嵌入式方向包括了软硬件协同设计、嵌入式体系结构、实时操作系统、嵌入式产品设计等方面的知识,大于当代大学生,更需要掌握嵌入式系统设计的典型开发工具和开发核心技术。对于嵌入式市场的发展来说,中国市场的意义更加重大。中国市场对于嵌入式互联网这场革命来说非常关键。勃勃的生机,很好的产业互动,良好的协作精神,中国现在正在形成-个健康的嵌入式的发展模式和转型模式。中国可能是-个引发点,嵌入式市场先在中国蓬勃发展,然后辐射到全球其他地区。12 课程研究目的和意义 linux操作系统是-个开放源代码的免费操作系统,它不仅安全、稳定、成本低,而且很少发现有病毒传播,越来越的服务器、工作站和个人电脑开始使用linux软件,基于linux具有稳定、可靠和强大的网络功能这些优点。在linux环境下实现-个boa web服务器。二 、需求分析随着计算机迅猛发展,www 的技术也有了突破性的进展,它解决了远程信息服务中的文字显示、数据连接以及图像传递的问题,使得 www 成为 internet 上最为流行的信息传播方式。 现在,web 服务器成为 internet 上最大的计算机群,web 文档之多、链接的网络之广,令人难以想象。可以说,web 为 internet 的普及迈出了开创性的-步,是近年来 internet 上取得的最激动人心的成就。嵌入式系统已经渗透到各个领域,在32位嵌入式微处理器市场上,基于arm内核的微处理器在市场上处于绝对的领导地位,因此追踪arm技术的发展趋势显得尤为重要。在嵌入式操作系统上,linux-直因其内核精简、代码开发、基于移植等特点受到广大嵌入式能力更加强大,因此有必要为嵌入式系统构建web服务器。在嵌入式linux系统中,常用的web server有boa、httpd、thttpd和mini-httpd等。其中boa是-个运行在类unix系统中的小型web server,适合嵌入式环境。在boa中若两个用户同时访问,则其中的-个必须等待,它产生独立进程来处理cgi(通用网关接口)程序,因此占用较少的资源,其体系结构如图1所示。boa的优点在于其快速可靠性。它与其它服务器的区别:没有为cgi程序设置remote_host环境变量;没有server-side include(ssi)项,要产生动态网页只能通过cgi:没有设置进入控制,而是根据linux的文件系统的权限来决定服务的对象:没有chroot选项,即不能改变根目录。 基于以上的阐述,boa应用到嵌入式平台上有着诸多的优势,本文的嵌入式web服务器也因此选用boa作为平台。下面笔者将着重介绍嵌入式web服务器的硬件平台及软件体系的设计与实现。三、开发环境及系统结构 31 开发环境 1、虚拟机下安装的redhat9.0;2、交叉编译工具:arm-linux-gcc-4.3.2;3、miin2440开发板;4、移植使用到的软件:(1)boa源文件boa-0.94.13.tar.gz,下载地址:/;(2) cgi库 cgic205.tar.gz,下载地址:/cgic/cgic205.tar.gz。 32 系统结构 嵌入式系统组成框图 专有硬件(嵌入式处理器、存储器、外设等 ) 设备驱动 操作系统内核 api 应用程序 实物连接图 usb 交叉串口线 网 线embest仿真器5v powers3c2440 1.8v 3.3v jtaguart0 网口四、详细设计41 arm linux的建立 arm linux的建立是基于u-boot的实现,它的建立实际上是linux内核在s3c2440上移植的过程,主要分为3个步骤:建立交叉编译环境;编译内核;生成并配置根文件系统。411 建立交叉编译环境 交叉编译的主要特征是某-机器(目标机)中执行的程序代码不是本机编译生成,而是另-台机器(宿主机)编译生成。-般采用的方法是首先在宿主机上编写程序,通过交叉编译生成目标平台上可运行的二进制代码,再下载到目标平台的特定位置上运行。本次设计的通信使用的rs3232串口,在redhat 9.0里面建立-个能编译arm-linux环境。(1) 添加工作用户rootpc-linux # useradd g root g root d /home/arm1 arm rootpc-linux # mkdir p/home/arm1rootpc-linux # chown r arm /home/arm1rootpc-linux #chmod r 775 /home/arm1(2) 建立工作目录 armpc-linux arm1 $ mkdir dev_home armpc-linux arm1 $ cd dev_home armpc-linux dev_home $ mkdir btools kernel(3) 设置环境变量,准备源码及相关补丁。首先是设置环境变量: arm pc-linux arml$ vi bashrc export prefix=usrlocalarm3.3.2 export target=arm-1inux export sysroot=$prefix)sysroot export cross_compile=$target)- export path=$prefix)bin:$path export src=homearmldev_homebtoolstchain3.3.2 接下来准备各个源码包。从网上下载以下源码包:binutils-216targz、 gcc-332tarbz2、glibc-235targz、linux-2613targz。(4)编译gnu binutils。重新以arm用户身份登录,让新设置的环境变量 起作用。 arm pc-linux arml$su arm arm pc-linux arml$ cd $src) arm pc-linux tchain3.3.2$ tar zxvf binutils-216targz arm pc-linux tchain3.3.2j$ mkdir -p buildbinutils -216 arm pc-linux tchain3.3.2$cd buildbinutils-216 arm pc-linux binuti ls-216$ binutils -216configure -prefix=$prefix) -target=$target) -with -sysroot=$sysroot) arm pc-linux binutils-216$make arm pc-linux binutils-216$su root arm pc-linux binutils-216#make instal 1 arm pc-linux binutils-216#exit (5)使用当前平台的gcc编译内核头文件。 armpc-linux tchain332$cd$kernel) armpc-linux kernel$tar zxvf 1inux-26141targz armpc-linuxkernel$ cd 1inux-26141 armpc-linux since-26141$cp archarmconfigssmdk2410_defconfigconfig armpc-linux linux-261411$ make arch:arm menuconfig armpc-linux linux-26141$ make include1inuxversionh (6)复制内核头文件。 armpc-linux linux-$su root rootpc-linux linux-#mkdir -p $sysroot)usrinclude rootpc-linux linux-26141#cp -a includelinux$sysroot)usrinclude1inux rootpc-linux 1inux-#cp -a includeasm-arm$sysroot)usrincludeasm rootpc-linux 1 inux-#cp -a includeasm-generic $sysroot)usrincludeasm-generic rootpc-linux 1inux-#exit (7)编译glibc头文件。 armpc-linux kernel$cd$src) armpc-linux tchain332$tar zxvf glibc-235targz armpc-linux tchain332$patch -d glibc-235-pliopermcdiff armpc-linux tchain3321$cd glibc-235 armpc-linux glibc-235$tar zxvfglibc-1 inuxthreads-235.targz armpc-linux glibc-235$cd armpc-linux tchain332$mkdir buildglibc-235-headers armpc-linux tchain332$cd buildglibc-235-headers armpc-linux glibc-235-headers$glibc-235configure -prefix=usr -host=$target)-enable-add-ons=linuxthreads -with-headers=$sysroot)usrinclude rootpc-linux glibc-235-headers#make cross-compi l ing=yes instal1_root=$sysroot)install-headers rootpc-linux glibc-235-headers#touch$sysroot)usrincludegnustubsh rootpc-linux glibc-2.3.5-headers#touch$sysroot)/usr/include/bits/stdio_limh rootpc-linux glibc235235-headers3#exit (8) 编译gcc第-阶段。 armpc-linux glibc-235-headers$cd$src) armpc-linux tchain332$tar jxvf gcc-332tarbz2 armpc-linux tchain332$patch -d gcc-332 -plflowcdiff armpc-linux tchain332$patch -d gcc-332 -plt-linuxdiff armpc-linux tchain332$mkdir -p buildgcc-332-stagel armpc-linux tchain332$cd buildgcc-332-stagel armpc-linux gcc-332-stagel$gcch-332configure -prefix =$prefix) -target=$target)-enable-languages=c -with-sysroot=$sysroot) armpc-linux gcc-332-stage 1$make all -gcc armpc-linux gcc-332-stagel$su root rootpc-linux gcc-332-stage 1#make install -gcc rootpc-linux gcc-332-stagel#exit (9) 编译完整的glibc armpc-linux gcc-332-stage 1$cd$src) armpc-linux tchain332-$mkdir buildglibc-235 armpc-linux tchain332-$cd buildglibc-235 armpc-linux glibcpc-linux235$build_cc=gcc cc=$cross_compile)gcc ar=$cross cobipile)ar ranlib=$cross_compile)ranlib as=$crosspc-linuxcompile)as ld=$cross-compile)ldgl ibc-235 configure -prefix=usr -build=i686-pc-1 inux-gnu-host=arm- unknown-1 i nux-gnu-target=arm-unknown-l inux-gnu-without- thread-enable-add-ons=l inuxthreadsith headers= i $sysroot)usrinclude armpc-linux glibc-235$make armpc-linux glibc-235$su root rootpc-linux glibc-235#make install_root=$sysroot) install rootpc-linux glibc-235#exit (10) 编译完整的gcc。 armpc-linux glibc-235$cd$src) armpc-linux tchain332$mkdir buildgcc-332 armpc-linux tchain332$cd buildgcc-332 armpc-linux gcc-332$gcc-332configure-prefix= $prefix -target=$target)-enablelanguages=c -with-sysroot=$sysroot) armpc-linux gcc-332$make armpc-linux gcc-332$su root rootpc-linux gcc-332#make install rootpc-linux gcc-332#exit412 编译内核在交叉编译内核之前,首先对编译选项的配置,linux内核配置命令: make menuconfig,然后再编译内核。(1) 修改makefile文件修改内核项层目录下的makefile,指明目标平台及交叉编译器: #vi makefile 找到arch和cross_compile,修改: arch ?=arm cross-compi le?=arm-linux- (2) 设置flash 分区 主要是修改mtd分区,driversmtdmapscfi-flagadmc文件是关于nor flash分区的代码,针对本文使用的目标板的nor flash分区情况,修改其中 关于nor flash分区的那部分代码,同时修改该子目录下的makefile文件里生成目标文件的条件:把obj-$(config_mtd_cfi_flagadm)+=cfi_flagadmo改为obj-y+=cfi_flagadm.o,即无条件生成目标文件,加进内核。以上只是-块nor flash(am29lvl60db)的mtd分区修改过程,由于移植过程要用到开发板的两块nor flash,所以还需要探测另外-块strata flash(e28f128j3),首先模仿文件cfi_flagadmc在driversmtdmaps目录下建立cfi-flagintc,然后修改makefile,在obj-y+=cfi_flagadmo下面加上obj-y+=cfi_flaginto,即把它也无条件加进内核。 (3) 配置内核支持启动时挂载devfs。 为了使内核支持devfs以及在启动时并在sbininit运行之前能自动挂载dev为devfs文件系统,修改fskconfig文件。在文件中找到menu”pseudo filesystems”,添加如下语句:config devfs_fsbool ”dev file system support(obsolete) default yconfig devfs_mountbool ”automatically mount at boot” default y depends on devfs_fs (4) 配置内核产生.config文件。 #cp archarmconfigssmdk2440_defconfigconfig #make menuconfig(5)编译内核 #make zimage 编译完成之后,在archarmboot目录下会看到-个zlmage文件,这就 是需要烧写到flash中的内核映像文件。 通过jtag将zimage下载到nor flash(am29lvl60db)中,烧写地址为oxo0030000 - ox00200000。重启目标板,打开超级终端就可以看到内核启动信息。413 生成并配置根文件系统 生成并配置文件系统主要有以下的几个步骤完成:安装busybox工具包;创建文件系统的映象文件:配置文件系统。-个完整的根文件系统包含以下几个目录:bin,应用程序存放目录。几乎所有的应用程序都存放于此。比如1s等,包括功能强大的命令工具集busybox。/sbin,系统管理员服务程序,其中最重要的就是供内核初始化之后执行的sbininit进程。1ib,存放程序运行所需要的动态库。proc,系统状态文件目录。这是用来显示系统状态且真正意义上的虚拟文件系统,目录下的所有文件其实就是“控制面板”才能看到的系统状态信息,可以使用cat命令来显示相应硬件配置及状态信息。所以这是linux的“控制面板”。dev,驱动程序存放目录。在cramfs文件系统中这是-个空目录,在内核运行后由内核devfs作为安装目录,才产生所有项目,所以实际为空目录。已经编译到内核中的设备驱动程序都将存放于该目录下,包括动态加载的模块驱动也存放于此。etc,系统配置文件及用户数据存放目录。mnt,用于设备安装的目录,通常包含etc子目录和为块设备安装保留目录。其中,etc子目录中包含linux内核启动时挂载到ramfs文件系统etc下的所有内容。usr,用于存放用户程序和配置文件的目录,可以根据需要进行设置。 (1) cramfs文件系统的创建。 建立-个目录:#mkdir rootfs,作为放置根文件系统的目录,并根据cramfs文件系统结构分别建立目录结构,#mkdir bin sbin dev etc proc lib usr mnt 编译busybox。busybox是-个著名的开源项目,它是许多嵌入式linux系统的基石,它用-个极小型的应用程序来提供上述位于bin和sbin中的整个命令集的功能,它还支持动态和静态方式链接glibc,允许根据需要修改缺省配置,选中或移除所包含的命令。busybox提供的配置界面与linux菜单配置界面非常相似。首先要到网站下载busybox源代码,busybox-100targz;并解压源文件包:#tar zxvf busybox-i00targz;建立-个符号链接并进入目录:#in -s busybox-100 busybox#cd busybox交叉编译器路径设为:opthostarmv41binarmv4-unknown-1inux-,移植平台为:arch=arm。保存退出。交叉编译busybox:#make a11#make install将生成的命令拷贝到上面建立的相应目录中。#cp -abin*rootfsbin#cp -asbin*rootfssbin 复制应用程序运行时所需要的库至1ib下,库文件可以从pc机上的交叉编辑工具安装目录下复制。 在linux中根据需要建立相应文件的快捷方式,如在rootfs下建立tmp和var快捷方式到mntetctmp和mntetcvar文件夹,这样就可以使用tmp和var 访问ramfs的空间。 关于启动脚本。-般系统启动时都会按要求执行相应的初始化操作。写在命令行里就是init=1inuxrc,这个linuxrc是指向etcinitdrcs文件的-个符号链接。在rcs文件中列出了linux初始化时要执行的文件, 生成映像文件。 完成以上所示的cramfs文件系统结构后,用下面的命令制作映像文件:#mkcramfs rootfs rootfs.cramfsrootfscramfs就是最后要烧写到flash中的映像文件。用jtag将该文件下载到strata flash(e28f128j3)中,下载地址为:0x08040000-0x09000000。重启目标板,就可以在超级终端中看到整个系统的启动信息了。42 bootloader的移植bootloader就是在操作系统内核运行之前运行的-段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到-个合适的状态,以便为最终调用操作系统内核准备好正确的环境。从操作系统的角度bootloader的总目标就是正确地调用内核来执行。在本web服务器开发中使用的bootloader是u-boot(源代码可以在网上下载)。421 移植的环境 工作用户:root。u-boot版本:116。交叉编译工具链:2953。 422 移植的步骤 在board子目录中建立s3c2440,并且将smdk2410下的相关文件复制到s3c2410目录下。 修改项层makefile文件。项层makefile文件负责u-boot整体配置编译。每-种开发板在makefile都需要有板子配置的定义。修改commoncmd-bootc。如果内核不是uimage,则下载后,u-boot没有传递参 数给内核,所以启动时会有错误,修改本文件中的相关代码使u-boot可以传递参数 给内核。修改includeconfigss3c2440h。 修改cpuarm920tstart.s文件,实现把内核从flash拷贝到ram,修改lowlevel-init.s文件。 修改boards3c2440lowlevel_init.s文件, 编译u-boot。 #make在顶层目录下可以看到编译完成的映像文件u-bootbin。利用embest online flash programmer for arm软件,将映像文件u-boot.bin通过jtag烧写到nor flash中,烧写地址为:ox00000000-ox00020000。烧写完成后,重启开发板就可以在超级终端中看到u-boot的启动信息了。u-boot的移植工作就完成了。43 基于s3cc400的嵌入式web服务器boa移植 首先在下载boa源文件 431 配置开发板网络在移植嵌入式 web 服务器 boa 之前需要在根文件系统中配置网络,我的根文件系统目录是 /opt/rootfs ,这里设置我的 ip 地址为 12 rootfs/etc 中添加 resolv.conf 文件 nameserver 该文件存放在dns信息 rootfs/etc 中添加 net.conf 文件 ipaddr=23 netmask= gateway= mac=10:23:45:67:89:ab 在 rootfs/etc/rc.d/init.d 目录下添加 httpd 文件 #!/bin/sh base=boa # see how we were called. case $1 in start) /usr/sbin/$bas ; stop) pid=/bin/pidof $base if -n $pid ; then kill -9 $pid fi ; esac exit 0 使用命令 chmod +x httpd 改变文件属性,该文件为 boa 服务器的代理。 在根文件中 sbin 目录下添加文件 net_set通过命令 chmod +x net_set 改变该文件属性具有可执行。 5 、我的文件系统中使用 mdev 创建设备文件, 在根文件系统的 etc/init.d/rcs 文件中添加如下echo network interface/dev/console /sbin/ifconfig lo echo start net_set/dev/console net_set & sleep 1 echo start httpd/dev/console /etc/rc.d/init.d/httpd start 432 boa 服务器和 cgic 库移植 cgic是-个支持cgi开发的开放源码的标准c库。 修改makefile文件,主要是修改交叉编译器。找到cc=gcc,将其改成cc=opthostarmv4lbinarmv4l unknown linux -gcc;找到ar=ar,将其改成ar=opthostarmv4lbinarmv4l unknown -1inux -ar;找到ranlib=ranlib,将其改成r

温馨提示

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

评论

0/150

提交评论