课程设计(论文)-有操作系统的嵌入式系统软件开发.doc_第1页
课程设计(论文)-有操作系统的嵌入式系统软件开发.doc_第2页
课程设计(论文)-有操作系统的嵌入式系统软件开发.doc_第3页
课程设计(论文)-有操作系统的嵌入式系统软件开发.doc_第4页
课程设计(论文)-有操作系统的嵌入式系统软件开发.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

成都学院(成都大学)课程设计报告有操作系统的嵌入式系统软件开发摘要:传统的系统综合性强,但运行速度慢,耗用存储空间大,成本高。嵌入式系统是基于指令可裁剪的面向应用、成本功能严格要求的计算机系统,针对性强。本课程设计基于uclinux操作系统下,完成led显示和串口通信两个任务与内核裁剪的编译以及硬件电路的设计。实现对两个进程的调度,同时可以通过计算机的超级终端显示串口通信,在硬件电路中实现led的显示功能。关键字:嵌入式系统;uclinux操作系统;串口通信;超级终端目 录第1章 绪论11.1 课题研究的背景和意义11.2 研究的主要内容1第2章 嵌入式操作系统软件开发概述22.1 有操作系统的软件开发流程22.2 有操作系统的软件运行模式3第3章 linux操作系统简介63.1 linux操作系统介绍63.2 linux操作系统的gcc编译器6第4章 开发环境的建立74.1 建立主机linux平台74.2 安装交叉编译工具8第5章 uclinux裁剪与编译9第6章 操作系统下多任务应用程序开发116.1 操作系统下多任务应用程序的开发流程116.2 添加应用程序至内核,使其随内核编译11总 结14参考文献15附录1 led.c源代码16附录2 uart.c源代码1719第1章 绪论1.1 课题研究的背景和意义进入20世纪90年代,嵌入式技术全面展开,目前已成为通信和消费类产品的共同发展方向。在通信领域,数字技术正在全面取代模拟技术。在广播电视领域,美国已开始由模拟电视向数字电视转变,欧洲的dvb(数字电视广播)技术已在全球大多数国家推广。硬件方面,不仅有各大公司的微处理器芯片,还有用于学习和研发的各种配套开发包。目前低层系统和硬件平台经过若干年的研究,已经相对比较成熟,实现各种功能的芯片应有尽有。而且巨大的市场需求给我们提供了学习研发的资金和技术力量。从软件方面讲,也有相当部分的成熟软件系统。国外商品化的嵌入式实时操作系统,已进入我国市场的有windriver、microsoft、qnx和nuclear等产品。在现在日益信息化的社会中,计算机和网络已经全面渗透到日常生活的每一个角落。对于我们每个人,需要的已经不再仅仅是那种放在桌上处理文档,进行工作管理和生产控制的计算机机器;各种各样的新型嵌入式系统设备在应用数量上已经远远超过通用计算机,任何一个普通人可能拥有从大到小的各种使用嵌入式技术的电子产品,小到mp3,pda等微型数字化产品,大到网络家电,智能家电,车载电子设备。而在工业和服务领域中,使用嵌入式技术的数字机床,智能工具,工业机器人,服务机器人也将逐渐改变传统的工业和服务方式。目前嵌入式系统技术已经成为了最热门的技术之一,吸引了大批的优秀人才投入其中。本次课程设计目的在于了解嵌入式的开发流程,熟悉其通常操作方法,提升在嵌入式方面的兴趣,加入对嵌入式的理解。1.2 研究的主要内容(1) 了解有操作系统的嵌入式系统软件开发流程;(2) 了解linux操作系统的基本知识及常用命令;(3) 掌握linux操作系统的vi编辑器和gcc编译器用法;(4) 了解uclinux操作系统的基本知识;(5) 掌握uclinux操作系统内核编译环境的建立及uclinux内核编译步骤;(6) 掌握将编译好的内核下载到系统运行的步骤;(7) 掌握uclinux多任务编程与自启动。第2章 嵌入式操作系统软件开发概述嵌入式操作系统(embedded operation system,eos)是一种用途广泛的系统软件,在实时高效性、硬件的相关依赖性、软件固化以及应用的专用性等方面具有较为突出的特点。2.1 有操作系统的软件开发流程在软件开发之前,应首先建立交叉开发环境,主要需要如表2-1所示。表2-1 建立uclinux交叉开发环境软件功能vmware5.5虚拟机平台redhat9linux操作系统ads 1.2用于通过jtag接口烧写映像文件至flasharm-elf-tools交叉编译工具链各个软件之间的构成关系如图2-1所示。图2-1 开发环境软件构成嵌入式操作系统及应用软件的开发流程如图2-2所示。图2-2 有操作系统的软件开发流程由2-2所示,在开发嵌入式操作系统及应用软件之前,应首先将操作系统引导程序烧写到lash的起始地址0x0处,此处的引导程序与无操作系统的引导程序唯一不同的是:系统初始化完毕之后应当跳转到操作系统的起始地址0x1 0000处,而不是应用程序的入口。2.2 有操作系统的软件运行模式在运行操作系统的嵌入式系统中,主要包含了bootloader引导程序、操作系统和应用程序这三种类型的程序。这三种程序的不能组成方式和运行方式就形成了不同的软件运行模式,有操作系统的嵌入式软件运行模式如表2-2所示。表2-2 有操作系统的嵌入式运行模式编号模式abootloader直接引导操作系统,操作系统与应用程序一起编译,应用程序不自启动。bbootloader直接引导操作系统,操作系统与应用程序一起编译,应用程序自启动。cbootloader直接引导操作系统,操作系统与应用程序分开编译,应用程序通过网口等下载至sdram中。dbootloader启动后显示菜单,手动引导操作系统。(1) bootloader启动之后直接引导操作系统运行,应用程序编译在操作系统的romfs文件系统中,操作系统启动后并不自动运行应用程序,而是根据需要手动运行或由其他程序调用。 图2-3 有操作系统的运行模式a 在该模式下,bootloader在完成系统初始化工作后,修改pc指针,直接跳到操作系统image.rom开始的地址处,引导操作系统运行。而应用程序和操作系统是一起编译在image.rom里面,操作系统启动之后,应用程序存放在/ben目录下,但是应用程序还是需要手动运行。(2) bootloader启动之后直接引导操作系统运行,应用程序编译在操作系统的romfs文件系统中,操作系统后自动运行应用程序,如图2-4所示。 图2-4 有操作系统的运行模式b 在该模式下,bootloader在完成系统初始化工作后,修改pc指针,直接跳到操作系统image.rom开始的地址处,引导操作系统运行。操作系统启动完毕之后,会自动执行应用程序,主要通过uclinux-dist/vendors/samsung/4510b/rc文件中添加系统启动后自动执行应用程序的命令来实现:./bin/led&./bin/uart&命令后面的&符号表示在后台执行程序。(3) bootloader启动之后直接引导操作系统运行,应用程序和操作系统单独编译,操作系统启动完毕之后,通过网络等通信方式将应用程序下载到操作系统文件夹中,如/var/tap,在手动运行应用程序。该方式常用于调试应用程序,如图2-5所示。在该模式下,bootloader在完成系统初始化工作之后,修改pc指针,直接跳到操作系统image.rom开始的地址处,引导操作系统运行。而image.rom映像文件里面并未包含应用程序,操作系统启动之后,通过网口、串口等方式单独编译生成的应用程序下载至操作系统的可写目录(如/var/tmp)中,在手动运行。 图2-5 有操作系统的运行模式c (4) bootloader初始化完毕之后,并不是直接就引导操作系统执行,而是进入到一个命令行界面中,可以输入相应命令对系统进行操作,也可以引导操作系统,如图2-6所示。 图2-6 有操作系统的运行模式d在该模式下,bootloader的功能已经不再限于系统的初始化程序。目前常用的几种通用bootloader均提供了复杂的命令接口,可在bootloader中对硬件进行大量操作,已经相当于一个微型操作系统。第3章 linux操作系统简介3.1 linux操作系统介绍linux是一个免费的操作系统,用户可以免费获得其源代码,并能够随意修改。其具有多任务支持、多用户支持、多处理器支持、跨平台支持、按需调入执行、开放性、设备独立性以及可靠安全性等特点。linux的内核精简而高效,其内核的核心部分小到一张软盘就可以装下,通过对不需要功能的裁剪,linux内核完全可以小到100kb以下。在嵌入式环境下的资源是非常有限的,所以操作系统的目录树中的所有文件都应该是系统所必须的文件,避免浪费存储空间。linux的romfs文件系统的根目录结构如图3-1所示。图3-1 romfs文件结构3.2 linux操作系统的gcc编译器gcc是gnu组织免费c编译器,linux的很多发布默认安装的就是这种。很多流行的自由软件源代码基本都能在gcc编译器下编译运行。gcc编译器有许多选项,以下列出几个常用的选项:-o 选项表示要求编译器生成的指定文件名的可执行文件;-c 选项表示只要求编译器进行编译,而不要进行衔接,生成源文件的文件名命名但把其后缀有.c或.cc变成.o的目标文件;-g 选项要求编译器在编译的时候提供以后对程序进行调试的信息;-e 选项表示编译器对源文件只进行预处理就停止,而不做编译、汇编和衔接;-s 选项表示编译器只进行编译,而不做汇编和衔接;-o 选项是编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的可执行文件的执行效率提高;-wall 选项制定产生全部的警告信息。第4章 开发环境的建立4.1 建立主机linux平台建立交叉开发环境的第一步,是建立一个linux平台来对应用程序和内核进行编译,这里使用虚拟机软件vmware和red hat linux来搭建一个在windows环境中运行的linux平台。(1) 安装并运行vmware,选择new virtual machine命令新建虚拟机,选择custom自定义选项,如图4-1所示。 图4-1 虚拟机安装过程 图4-2 虚拟机安装完成(2) 单击“下一步”按钮,选择linux版本为red hat linux,为操作系统选择名字和安装路径。(3) 为系统选择内存,一般为256mb,网络连接类型选择第一种。(4) io adaptor类型选择buslogic,选择creat a new virtual disk。(5) 选择scsi,从硬盘中分出4gb的容量给linux使用。(6) 定义虚拟机文件名,此时一个新的virtual machine就设定完成了,如图4-2所示。接下来开始安装red hat linux,在虚拟机软件中执行start virtual machine,系统启动linux安装程序,按照提示安装linux,采用默认选项即可。由于linux与windows采用不同的文件系统,一般在linux下无法直接访问windows的硬盘区分,而以后的实验需要在linux和windows之间进行文件交换,因此有必要在linux虚拟机和windows主机之间建立一个共享文件夹。如图4-3所示,启动虚拟机,进入系统后选择菜单vminstall vmware tools,之后再linux的桌面会出现一个名为vmware-tools的文件夹。如果没有自动出现这样的文件夹,可以采用u盘等途径将vmware安装目录里面的linux.iso文件复制到linux系统下,挂载此光盘即可,如图4-4所示。 图4-3 开始安装red hat linux 图4-4 安装vmware tools由于光驱文件夹是不可写的,因此需将vmwaretools-5.5.1-19175.tar.gz复制到可写目录里(如用户主目录),再输入命令#tar xzvf vmwaretools-5.5.1-19175.tar.gz解压到当前目录下的vmware-tool-distrib文件夹中,运行其中的vmware-insll.pl文件开始安装。安装完毕后,在mnt目录下会自动建立一个名为hgfs的文件夹,通过这个目录,就可以在linux下访问对应的windows文件夹。进入菜单vmsetting,在options选项卡下选择share folders,单击add指定一个windows下的文件夹作为与linux的共享文件,如图4-4所示。4.2 安装交叉编译工具交叉编译是一个在平台上生成另一个平台上的可执行代码。要进行交叉编译,需要在主机平台上安装对应的交叉编译工具链,然后用这个交叉编译工具链编译原代码。从网上下载交叉编译工具arm-elf-tools-20030314.sh,并将其复制到linux文件夹中,使用root用户登陆,在命令窗口中输入#sh arm-elf-tools-20030314.sh命令,程序会自动完成安装过程。第5章 uclinux裁剪与编译实验板所用的uclinux-wsdist.tar.gz内核源代码已经针对硬件配置进行了相应的修改,使用前需要执行相应的编译命令,才能生成可执行的内核映像文件。uclinux的裁剪包括厂商产品选择,内核版本选择,运行库选择,内核配置和厂商用户配置5步。配置的本质是通过make工具来设置源代码包中各级目录下的配置文件和make文件中的宏定义,为下一步的编译提供前提。在linux虚拟机下新建命令终端,进入uclinux内核目录/uclinux-dist,在编译之前首先检查内核的配置:输入命令#make menuconfig,输入命令后会弹出界面如图6-1所示。图5-1 内核配置菜单(1) uclinux提供了图形界面下的操作剪裁定制选项,他们表示为:(2) vendor/product,选择硬件系统的处理器型号,以适应特定硬件平台的要求。这里选中samsung/4510b。(3) kernel version,这表明知道制定的核心来源于linux核心的2.4版本。(4) libc version,选择特定的库,这里选中uc-lib,该库目前支持arm构架的处理器,在它所支持的平台上非常稳定,体积更小。另一个选项是uclibc,它提供更多的应用程序接口(api),以及一些不常见的、不标准的库程序。因此,如果有一些程序预期要用到一些少见的库,那么需要选择uclibc。(5) default all settings,所有选项采用默认设置。(6) customize kernel settings,进行内核制定的选项。(7) customize vendorsement/user settings,进行用户程序的制定。(8) update default vendors settings,更新默认选项。以上选项中芯片配置、linux内核和库函数选项与硬件平台相关,不需要进行修改,内核设置与用户程序设置是可以进行裁剪的。对内核进行剪裁,选中customize kernel settings选择,保存并退出,内核保存一些配置以后会进入到内核定制菜单,如图5-2所示。图5-2 定制用户程序 完成内核配置后,一次输入下列所示命令,开始对内核进行编译。编译完成后,在uclinux-dist/images下会生成三个文件,如表5-1所示。表5-1 编译生成的映像文件文件作用image.rom压缩内核映像文件,用于烧写到flash存储器image.ram未压缩内核映像,可以加载到sdram存储器内运行,体积较image.rom大romfs,imgrom文件系统,已经包含至少两个内核映像中在uclinux-dist中有一个批处理文件csc.sh,里面包含了以上内核编译的所有命令,用户也可以直接执行这个脚本文件,实现相同的编译过程。第6章 操作系统下多任务应用程序开发本课题的任务主要是实现闪灯程序和串口打印程序的开发,以此掌握操作系统下多任务软件开发的方法。6.1 操作系统下多任务应用程序的开发流程开发流程如表6-1所示。表6-1 操作系统下应用程序的开发步骤步骤1编写程序源代码步骤2添加应用程序至内核添加程序文件至内核源代码目录中为程序文件建立akefile文件修改内核makefile文件修改内核配置文件config.in修改内核rc文件设置程序为自启动步骤3编译内核步骤4下载内核至flash存储器6.2 添加应用程序至内核,使其随内核编译在内核源代码目录/uclinux-dist/uesr下新建目录new_ap。并将事先编好的led.c、uart.c文件复制到该目录下。 (1) 在new_ap目录下新建makefile文件,添加如下代码。exec = led uartobjs = led.o uart.oall : $ (exec)$ (exec):$(objs)$(cc) $(ldflags)-o $.o $(ldlibs)romfs: $(romfsinst) -e config_user_new_ap_led /bin/led$(romfsinst) -e config_user_new_ap_uart/bin/uartclean:rm -f $(exec) *.gdb *.elf *.o为new_ap文件夹创建makefile文件,即为led.c和uart.c的编译提供了规则,在整个uclinux内核文件中,文件之间的组织是靠各个文件夹中的makefile文件组织起来的,所以接下来还需把应用程序的编译规则进一步添加到上级目录的makefile和系统配置文件中去,如图7-1。 图6-1 添加应用程序到uclinux(2) 编辑user目录下的makefile文件,添加如下代码。dir_$ (config_user_new_ap_led) +=new_apdir_$ (config_user_new_ap_uart) +=new_ap(3) 编辑config目录下的config.in文件,添加如下代码。mainmenu_option next_commentcomment test program bool test led config_user_new_ap_ledbool test uart config_user_new_ap_uartendmenuconfig.in文件是整个系统内核的配置文件,当输入make menuconfig时,向系统的配置菜单中添加了新的内容test program,而其子目录中分别包含了test led和test uart这两个子选项。(4) 修改rc文件,设置程序为自启动。修改/uclinux-dist/vendors/samsung/4510b/rc 文件,在最后一行添加:./bin/led(uart)&其中,./是运行命令,“&”符号设置程序为后台运行。完成以上设置后,输入make menuconfig,进入customize vendors/user settings,就会看到在上面添加的“test program”选项,如图7-2所示。图6-2 添加应用程序至编译选项图进入该选项,选中test led和test uart,就可以在内核编译过程中把这两个程序编译进去。编译内核完毕后将生成的image.rom文件烧写到flash中,可以看到led和uart两个程序在系统启动后自动运行,进程号分别为17、18,运行结果如图6-3所示。图6-3 超级终端运行结果总 结这次课程设计让我懂的了很多,在实验中遇到过很多的问题,经过自己自学教材第五章,慢慢的解决了不少问题。在老师和同学的帮助下,我成功的完成了这次实验。这是一次综合性比较强的实验,要求我们对课本知识必须有一定的掌握,下面我把在实验中遇到的问题在这里说一下:由于是第一次接触这个比较不是很熟悉,利用.iso镜像安装的时候,提示要换光盘,我点击确定结果告诉我光盘不正确,我开始慢慢对vmware workstation这个界面进行摸索,结果我在vm菜单下的setings中找到了答案,原来在这个选项中可以加载光盘,于是就这样我学会了怎么换盘。用root用户名进去之后就是建立共享文件夹,按照书上的步骤自学成功安装了桥接软件,这是在mnt文件下生成了一个hgts文件夹,这时就需要建立共享文件夹share来在两个操作系统下互访。由于先前对vmware workstation软件的菜单栏进行了熟悉,很快就找到了添加共享文件夹的选项窗口。在这里,可以说做这个实验是一步步探索出来的,真正从一个不懂到半懂,最后到熟悉的过程。然后我按照书上的方法编写cinfig、makefile、rc文件待用,结果当我把交叉编译工具安装好了的时候,准备对内核与我的(led.c、uart.c)应用程序进行编译的时候,出现错误了。由于书上没有详细步骤,我先是新建终端,在窗口中输入 make menuconfig命令,原本以为会很顺利,结果出现找不到menu编译规则,我于是翻书看,定义menu的文件编译的是cinfig文件,而这个文件我是编写对了的,我茫然中想了下,是不是要把vendor/product/linux-2.4这个内核文件夹打开,抱着试一试的心态,结果正确了。接着下面就是自定义内核编译,正当这个时候又出现错误,无法对文件夹new进行编译,这就怪了,结果询问同学,有很多同学都是这样,他们有些说是书上的makefike文件格式不对,应该重新编写,于是就在网上查了下makefike文件的编译格式,结果果然是书上的命令格式是有问题的。这里让我深刻地明白了:尽信书则不如无书。就这样一步步慢慢的来,经过一段时间的努力,终于把实验完成了。使我明白,只有学习,才会有进步,只有实践,才能超越。没有付出就没有回报,努力了即使没有成功,也是一件值得骄傲的事,因为自己做了,经历了这样一个从无到有的过程,就已经成功了。最后,我觉得此次课程设计十分有意义,而我也没有白做,因为我确实懂了 参考文献1 杜春雷.amr体系结构与编程m.北京:科学技术与工程,2009 2 杨宗德.嵌入式arm系统原理与实例开发m.太原:电脑开发与应用,20033 胡希明.嵌入式linux应用程序开发详解m.北京:科学出版社,2008 4 赵刚.32位arm嵌入式系统开发技术m.北京:电子工业出版社,20085 李光华,赵洪亮.基于s3c4510b的应用系统开发详解m.北京:清华大学出版社,20036 韦东山.嵌入式linux应用开发完全手册m.北京:人民邮电出版社,20057 赵刚.32位arm嵌入式系统开发技术m.北京:电子工业出版社,20088 李善平.linux操作系统及实验教程m.北京:机械工业版社,1999附录1 led.c源代码#define iopmod (*(volatile unsigned *)0x03ff5000) #define iopdata(*(volatile unsigned *)0x03ff5008) void delay(int i);int main(void)iopmod=0x0ffffffff; /设置gpio口为输出while(1)iopdata=0x0f; /点亮2个leddelay(100000);/延时iopdata=0x00;/熄灭leddelay(500000);/延时return 0;void delay(int i)int j,k;for(j=0;ji;j+)k=0;附录2 uart.c源代码#define iopmod (*(volatile unsigned *)0x03ff5000) /定义寄存器地址#define iopcon(*(volatile unsigned *)0x03ff5004)#define iopdata(*(volatile unsigned *)0x03ff5008) #define ulcon0(*(volatile unsigned *)0x03ffd000)#define ucon0(*(volatile unsigned *)0x03ffd004) #define ustat0(*(volatile unsigned *)0x03ffd008) #define utxbuf0(*(volatile unsigned *)0x03ffd00c) #define urxbuf0(*(volatile unsigned *)0x03ffd010) #define ubrdiv0(*(volatile unsigned *)0x03ffd014) #define ulcon1(*(volatile unsigned *)0x03ffe000) #define ucon1(*(volatile unsigned *)0x03ffe004) #define ustat1(*(volatile unsigned *)0x03ffe008) #define utxbuf1(*(volatile unsigned *)0x03ffe00c) #define urxbuf1(*(volatile unsigned *)0x03ffe010) #define ubrdiv1(*(volatile unsigned *)0x03ffe014)void delay(unsigned int);/声明延时函数void inituart(int port,int baudrate);/声明初始化串口函数void printuart(int port,char *s);/声明串口输出字符函数int main()inituart(0,0x500);/19200bps 50mhz 0=com1;1=com2for(;)delay(100);p

温馨提示

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

评论

0/150

提交评论