欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    ARM应用系统开发详解—嵌入式uClinux及应用开发.docx

    • 资源ID:62407331       资源大小:756.93KB        全文页数:44页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ARM应用系统开发详解—嵌入式uClinux及应用开发.docx

    第7章 嵌入式uClimix及其应用开发本章从构建一个针对S3C4510B硬件平台的嵌入式uClinux操作系统和在其上进行应用 程序的开发入手,逐步讲述如何在Linux环境下编写用户应用程序的方法和步骤,并为熟悉 Windows操作系统的用户介绍在这种平台之上,使用何种工具编写和编译自己的应用。通 过本章的学习,读者可以对嵌入式uClinux有一定的了解,并且掌握在Linux和Windows 下嵌入式系统应用开发的基本方法。本章主要内容有: 嵌入式uClinux系统概况 开发工具GNU的使用 建立uClinux开发环境 在uClinux下开发应用程序嵌入式uClinux系统概况在PC机上开发应用程序的用户都会有这样的感觉,PC机有完善的操作系统并提供应 用程序接口(API),开发好的应用程序可以直接在操作系统上运行。虽然嵌入式系统的应 用程序完全可以在裸板上运行,但为了使系统具有任务管理、定时器管理、存储器管理、资 源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理, 更好的分配系统资源的功能,用户就需要针对自己的硬件平台和实际应用选择适当的嵌入式 操作系统(Embedded Operating System,以下简称EOS)。本节将结合本书所谈到的硬件平 台S3C4510B,介绍一种针对不带MMU的ARM微处理器的嵌入式操作系统uClinuxouClinux是一个完全符合GNU/GPL公约的操作系统,完全开放代码,现在由Line。公 司支持维护。uClinux的发音是“you-see-linux”,它的名字来自于希腊字母“mu”和英文大 写字母“C”的结合。“mu”代表“微小”之意,字母“C”代表“控制器”,所以从字面 上就可以看出它的含义,即“微控制领域中的Linux系统”。为了降低硬件成本及运行功耗,有一类CPU在设计中取消了内存管理单元(Memory Management Unit,以下简称MMU)功能模块。最初,运行于这类没有MMU的CPU之上 的都是一些很简单的单任务操作系统,或者更简单的控制程序,甚至根本就没有操作系统而 直接运行应用程序。在这种情况下,系统无法运行复杂的应用程序,或者效率很低,而且, 所有的应用程序需要重写,并要求程序员十分了解硬件特性。这些都阻碍了应用于这类CPU 之上的嵌入式产品开发的速度。然而,随着uClinux的诞生,这一切都改变了。uClinux从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。它是专门 针对没有MMU的CPU,并且为嵌入式系统做了许多小型化的工作。适用于没有虚拟内存 或内存管理单元(MMU)的处理器,例如ARM7TDMI。它通常用于具有很少内存或Flash 的嵌入式系统。uClinux是为了支持没有MMU的处理器而对标准Linux作出的修正。它保 留了操作系统的所有特性,为硬件平台更好的运行各种程序提供了保证。在GNU通用公共 许可证(GNU GPL)的保证下,运行uClinux操作系统的用户可以使用几乎所有的Linux API 函数,不会因为没有MMU而受到影响。由于uClinux在标准的Linux基础上进行了适当的CC= gccLD= gccall: tunel % . o : % . c $ (CC) -c -o $ $ (CFLAGS) $ (INCLUDES) $< tunel : $ (OBJS) $ (LD) -o $ $ (OBJS) -Im clean : $(RM) $(OBJS)在这个makefile中首先定义了十个宏:NCLUDES=-I(省略号代表-I后面的内容),口 dirname,表示将dirname所指的目录 加入到程序头文件目录列表中去,是在进行预处理过程中使用的参数;1 EXT_CC_OPTS = -DEXT_MODE 1表示在程序中定义了宏EXT_MODE,等价于在源 代码写入语句'#(1©自11©£乂丁_140口£,;接下来的两个宏定义CPP_REQ_DEFINES和RTM_CC_OPTS起到和EXT_CC_OPTS 类似的作用;CFLAGS =-O-g是编译器的编译选项,表示在编译的过程中对代码进行基本优化,并 产生能被GNU调试器(如gdb)使用的调试信息;CFLAGS +廿 表示对这个宏定义在原来的基础上增加新的内容; 'SRCS =.代表了所有要编译的源代码文件列表;'OBJS =$(SRCS:.c=.o),表示把宏SRC所代表的所有以.c结尾的文件名用。结尾的文件 名替换,即表示各个源文件所对应的目标文件名;'RM =rm-f'表示删除命令,-f是强制删除选项,使用该符号,在对文件进行删除 时,没有提示;'CC = gcc,表示编译器是用gcc;'LD= gcc,表示链接命令是用gcc;all和clean是两个伪目标,在使用make命令的时候,如果不指明目标文件名,则是以 在makefile中出现的第一个目标作为最终目标,所以如果键入命令make,则伪目标all被 作为最终的目标而执行,由于这个文件并不存在,所以make会尝试更新all规则,因此 就检查它的依赖文件tunel是否需要更新,如果需要,就把它更新,这样伪目标下面的两 条规则就会被执行,从而生成可执行文件tunel。如果要执行删除命令,只需耍键入命令make clean,就会把所有以。结尾的中间文件删除。另外,请读者注意在本makefile的例子中多次用到7,该符号用于在makefile中,如 果一条语句过长时,可以用''放在这条语句的右边界,通过回车换行,使下面新一行的语句 成为该语句的续行。在makefile文件中,用符号印作为注释行语句的开始,以增强makefile文件的可读性。 本例假设makefile文件名为makefile,当然也可按照个人的喜好取其他文件名,如果文 件名不是makefile, Makefile的话,在用make命令是,请使用make-f makefilenameo至U此,希望读者能够掌握make和makefile的基本使用。使用GDB调试程序无论是多么资深的程序员在编写的程序时,都不大可能一次性就会成功,在程序运行时, 会出现许许多多意想不到的错误,一味地只是查看程序用处不大,最有效的方法通过一些手 段进入到程序内部进行调试。通常在调试程序的时候如果能够得到以下一些信息,对于开发 者找到错误所在是很有帮助的。1 .程序是运行到哪个语句或者表达式就发生了错误?2 .如果错误是在执行一个函数的时候出现的,那么是程序的哪一行包含了这个函数的 调用语句,在调用该函数的时候传递的实参是什么?3 .在程序执行到某处时,所关心的某一个变量值为多少?4 .某个表达式最终运行的结果为何值?调试器(更准确地说应该称为符号调试器)能够完成上述目标。它是一个能够运行其他程 序的应用程序,它和普通意义上的程序的唯一不同之处在于,调试器能够进入到程序源码中, 允许开发者进行逐行单步运行,了解程序代码执行顺序,和每条语句执行的结果,可以在程 序运行的同时,查看甚至是改变任一变量值。在程序运行出错时,它为程序开发者提供程序 运行时的详细细节,从而找到出错的原因。在Linux系统中,最常用到的就是GDB(GNU Degugger)o GDB是GNU自带的调试工具。7. 2. 3. 1 GDB常用命令要想使用gdb,必须在对源码进行编译的时候,使用-g编译选项开关,来通知编译器, 开发者希望进行程序调试。用了-g选项后,程序在编译的时候就会包含调试信息,这些调 试信息存在目标文件中,它描述了每个函数或变量的数据类型以及源码行号和可执行代码地 址间对应关系,gdb正是通过这些信息使源码和机器码相关联的,它实现了源码级的调试。为了使用gdb调试,只需要在命令行中输入gdb filename(filename是用gcc编译生成的 最终可执行文件名),该语句启动与调试器的文本接口。就在上一小节中所举makefile例子 来说,就是键入gdbtunel,则在屏幕上会出现nieuClinux mysrc$ gdb tunelGNU gdb Red Hat Linux 7.x (5.Orh-15) (MI_OUT) Copyright 2001 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions. Type nshow copying" to see the conditions.There is absolutely no warranty for GDB. Type nshow warranty, for details. This GDB was configured as ni386-redhat-linuxn.(gdb)gdb虽然运行起来,但是可执行程序tunel并没有运行,此时在gdb提示符下直接键入 run命令即可,如果可执行程序在运行的时候需要输入命令行参数,则在gdb提示符下可以 这样键入命令:run command-line-arguments , 就如同是输入命令:tunel command-line-arguments 一样,启动了可执行程序的运行。有时候,我们希望能够断点调试程序,让程序执行到代码某处时停止继续执行下去, 此时可以使用命令break,该命令的格式为break place,这里place可以是程序代码的行号, 某函数名,甚至可以是用break main ,让程序断点设置在代码一开始执行的地方,比如对 于上面举的可执行文件名为tunel的例子,它调用了一个函数名为rtExtModeChecklnit的子 函数,如果想让程序执行到该函数处停止,可以在gdb提示符下输入:break rtExtModeChecklnit,此时屏幕上出现下歹U信息:Breakpoint 1 at 0x8049a28: file grt_main.c, line 604.o当然,也可以使用行号设置中断位置,上面设置中断的语句可以等价为break 604,可 以在屏幕上看到相同的效果。当设置了断点后,程序会运行到断点处停下来,此时从屏幕上可以得到类似下面的信息: Breakpoint 1, main (argc=4, argv=0xbffffb84) at grt_main.c:604604 rtExtModeCheckInit();(gdb)当想将某个断点除去,可以在gdb提示符下输入命令:delete N,这里N表示第几个 中断,第一个设置的中断序号为1,第二个设置的序号为2,依次类推。如果delete后不跟 任何序号,在表示把设置的所有断点都删除。如果想查看目前设置断点的情况,可以使用命 令info break,屏幕会显示出每一个设置的断点信息。在gdb提示符下使用help命令,会给出有关gdb命令的一个简短描述和命令分类。如果开发者想进入到程序内部进行单步调试,gdb提供两种命令供选择,step和next 命令,两者的区别在于step执行每一条语句,如果遇到函数调用,会跳转到到该函数定义 的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作普通一条语句执行 完成。continue命令是继续运行程序,直到遇到下一个断点或程序结束。有时候使用者仅仅是在linux的bash提示符下输入命令gdb后,启动了 gdb而已,此 时,如果要加载可执行文件,需要在gdb提示符下键入命令:file filename(filename为可执 行文件名),注意是可执行文件的名字而不是源文件名。当在调试过程中,想查看一个变量值的时候,可以在gdb环境下输入命令:watch variablename ,这里的variablename是你想观察的变量名。还有一个可以显示表达式值的命令print,其使用规则为print expressionname,其中 expressionname为要显示的表达式名。7. 2. 3. 2 GDB具体调试实例下面通过使用一个简单的程序使读者进一步熟悉用gdb的调试方法。源程序名为example.c,代码如下:/*Institute of Automation, Chinese Academy of Sciences* File Name: example.cDescription: introduce how to use gdb* Author:Xueyuan NieDate:*/#include <stdio.h>static void display(int i, int *ptr); int main(void)int x = 5;int *xptr = &x;printf(HIn main () :nn);printf(nprintf(Hx is %d and is stored atxptr holds %p and points&x);xptr, *xptr);display(x, xptr); return 0;voidvoiddisplay(int z, int *zptr)printf(HIn display():nn);printf(nprintf(Hprintf(nprintf(Hz is %d and is stored atzptr holds %p and pointsz,&z);zptr, *zptr);要使用gdb调试程序,一定要在编译程序时,使用-g编译选项,以生成参数符号表 (augmented symbol table),提供调试信息。首先使用gcc -g -o example 1 example©对源代码进行编译,这样就可以使用gdb监视 example 1的执行细节。在bash提示符下,键入命令:gdb example 1,启动了对可执行文件 example 1的调试,在屏幕上会出现下面的信息:nieuClinux nie$ gdb examplelGNU gdb Red Hat Linux 7.x (5.Orh-15) (MI_OUT)Copyright 2001 Free Software Foundation Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty” for details. This GDB was configured as ,i386-redhat-linuxn . (gdb)最后一行(gdb)就是进入到gdb调试中的提示符,此时可以在提示符下输入任何想键入 的命令。现在如果要进行断点调试的话,就需要显示一下要调试的源码,以便知道在哪个地方进 行断点设置。在gdb下,Linux最常用文本编辑命令vi不能使用,可以使用list命令列出可 执行文件的源代码的一部分,为了列出源代码的全部,只要多键入几次list命令即可。具体 操作如下:(gdb)1list#include <stdio.h>static void display(int i, int *ptr);int main(void) int x = 5;int *xptr = &x;1010(gdb)1112printf(nIn printf(n printf(n display(x, listmain () :n");x is %d and is stored atxptr holds %p and points xptr);%p.n”,x,to %d.nn,&x);xptr, *xptr);return 0;)1415161718(gdb)printf(nIn printf(" printf(n)listdisplay():nn);z is %d and is stored atzptr holds %p and pointszptr,*zptr);13void display(int z, int *zptr) Line number 19 outof range; examplel.c has 18 lines.(gdb)屏幕上清楚显示出了每一个语句所在的具体行号,比如现在我们想在第五行设置断点,可以在gdb提示符下输入命令:break 5,可以看到下面的显示信息:(gdb) break 5Breakpoint 1 at 0x8048466: file examplel.c, line 5.断点已经设置好,现在开始让程序运行起来,键入命令run,也可以键入其缩写形式r, 屏幕上出现的信息如下:(gdb) rStarting program: /home/nie/example1 Breakpoint 1, main () at examplel.c:5 5int x = 5;上述信息表明,gdb已经开始执行可执行程序,目前程序运行到exampleLc程序中main() 函数的第五行处停止,并且显示出即将要执行的第五行语句。现在我们进行单步调试的工作,输入命令:next,它表明单步执行程序的每一条语句, 当用next命令执行到函数display处时,即当屏幕出现如下所示信息时: (gdb) next 6int *xptr = &x;(gdb) next 7printf(nIn main():nn);(gdb) next In main():8 printf (n x is %d and is stored at %p.n”, x, &x);(gdb) nextx is 5 and is stored at Oxbffffb44.9 printf (n xptr holds %p and points to %d.nn, xptr, *xptr);(gdb) nextxptr holds Oxbffffb44 and points to 5.10 display(x, xptr);为了进入到函数display内部进行调试,输入命令step,即: (gdb) stepdisplay (z=5, zptr=0xbffffb44) at examplel.c:1515printf(nIn display():nH);step命令使执行进入到函数内部,此时在该函数内部,可以继续使用st叩命令或者是 next命令进行单步执行,如果不想单步执行,而是直接将程序一次执行完毕,可以输入命令 continue 即可。要退出gdb,请键入命令quit,如果程序此时仍在进行,gdb会让你确认是否真的要退出, 屏幕会出现类似下面的提示信息:(gdb) quitThe program is running. Exit anyway? (y or n) 按下V即退出调试程序,如果程序本身已经运行完毕,则quit命令键入后,会直接退出gdb, 而不出现任何提示信息。当然除了使用gdb进行程序调试外,如果程序比较简短,逻辑又比较简单,此时完全 可以不用gdb,采用printf语句在程序当中输出中间变量的值来调试程序,也是一个不错的 调试方法。到此为止,我们已经介绍了 uClinux操作系统,GNU工具的使用,有了这些预备知识 后,我们将进入到本章的重点内容了。7.3 建立uClinux开发环境为了实现基于uClinux的应用系统的开发,建立或拥有一个完备的uClinux开发环境是 十分必要的。基于uClinux操作系统的应用开发环境一般是由目标系统硬件开发板和宿主PC机所构 成。目标硬件开发板(在本书中就是基于S3c4510B的开发板)用于运行操作系统和系统应用 软件,而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主PC 机来完成。双方之间一般通过串口,并口或以太网接口建立连接关系。7.3.1 建立交叉编译器通常的嵌入式系统的开发都是以装有Linux的PC机作为宿主机来编译内核和用户应用 程序的,但是对于很多长期工作在Windows操作系统下的用户来说,突然切换到Linux环 境下去开发程序会感到诸多不便,因此本书对于不同的读者提供了在宿主机装有不同操作系 统时,相应的交叉编译环境建立的方法。7. 3. 1. 1.为安装Linux的宿主机建立交叉编译器首先,要在宿主机上安装标准Linux操作系统,如RedHat Linux(本书使用的是Redhat 7.2), 一定要确保计算机的网卡驱动、网络通讯配置正常,有关如何在PC机上安装Linux 操作系统的问题,请参考有关资料和手册。由于uClinux及它的相关开发工具集大多都是来自自由软件组织的开放源代码,所以在 软件开发环境建立的时候,大多数软件都可以从网络上直接下载获得,接下来就可以建立交 叉开发环境。现在介绍一下交叉编译的概念。简单地讲,交叉编译就是在一个平台上生成可以在另一 个平台上执行的代码。注意这里的平台,实际上包含两个概念:体系结构(Architecture)、操 作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系 统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86 体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构 和Windows NT for x86操作系统的简称。就本书所涉及到的目标硬件S3c4510B而言,之所 以使用交叉编译是因为在该硬件上无法安装我们所需的编译器,只好借助于宿主机,在宿主 机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的代码格式。读者可以从 http:mac.os.nctu.edu.tw/->download 处下载工具链:arm-elf-binutils-2.1 l-5.i386.rpm, arm-elf-gcc-2.95.3-2.i386.rpm, genromfs-0.5.1-1 .i386.rpm 的 文件复制到宿主机上的任一目录下。键入下面的命令来安装rpm包:$su# rpm -ivh *.rpmRPM(Red Hat Package Manger)软件包管理程序,是将原本复杂的软件包安装程序,轻松 利用单一操作来完成。RPM目前支持的平台有3种类型:x86(i386), Sparc以及Alpha,可以很容易的从文件 名就来判断出使用的平台。像目前下载文件比如arm-elf-binutils-2.ll-5.i386.rpm , arm.elf-binutils表示文件名,2.11表示版本编号,5表示发行序号,也就是目前已经发行的 次数,i386是指此软件包为适用于Intel x86的二进制(binary)程序,也就是已经编译并且可 以直接安装的软件包,最后的“rpm”表示这是Red Hat的RPM程序。每一版的RPM发布 后,若是发现软件有问题,都会重新进行patch和build,这样在发行序号的部分就会增加1, 以表示该版本是上个版本的更新。这里在所用的命令rpm -ivh中,-i表示Installation,就是安装指定的RPM软件包;.h表示Hash,该参数可在安装期间出现,#符号,来显示目前的安装过程,这个符号一 直持续到安装完成后才停止;# v表示Verbose,显示安装时候的详细信息。至此我们把交叉编译器已经安装到了宿主机。以后我们就可以用交叉编译器arm-elf-gcc 编译操作系统内核和用户应用程序了。读者也可以从网站 http:上下载最新的 arme-elf-gcc工具,即脚本文件arm-elf-tools-20030314.sh,在宿主机上安装该工具链,在该 文件所在目录下,键入:$ su# Is -1 arm-elf-tools-20030314.sh该命令显示文件的各种属性,如果该脚本文件属性的不是可执行的,则还需要输入命令: # chmod 755 arm-elf-tools-20030314.sh以将其属性改为可执行属性,然后通过键入命令:# sh ./arm-elf-tools-20030314.sh就可以执行该文件。执行后/usr/local/bin/路径下有 gcc, g+, binutils, genromfs, flthdr 和 等各种实用工具。7. 3. 1.2 为安装windows的宿主机建立交叉编译器这部分内容是专门针对那些对Linux环境和Linux中的应用程序不熟悉,宁愿用PC上 基于Windows的操作系统来开发嵌入式系统的读者而写的。1 . Cygwin软件介绍为了在Windows下开发嵌入式操作系统应用程序,可以在Windows环境下装上Cygwin 软件。Cygwin是一个在Windows平台上运行的Unix模拟环境,是Cygnus Solutions公司开 发的自由软件。它对于学习掌握Unix/Linux操作环境,或者进行某些特殊的开发工作,尤 其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。Cygnus当初首先把gcc, gdb等开发工具进行了改进,使它们能够生成并解释Win32的 目标文件。然后,把这些工具移植到windows平台上去。一种方案是基于win32 Api对这些 工具的源代码进行大幅修改,这样做显然需要大量工作。因此,Cygnus采取了一种不同的 方法他们写了一个共享库(就是cygwinl.dll),把Win32 API中没有的Unix风格的调用(如 fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于Win32 API写了一个 Unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以 使用Unix主机上的交叉编译器来生成可以在Windows平台上运行的工具集。以这些移植到 Windows平台上的开发工具为基础,Cygnus又逐步把其他的工具(几乎不需要对源代码进行 修改,只需要修改他们的配置脚本)软件移植到Windows上来。这样,在Windows平台上运 行bash和开发工具、用户工具,感觉好像在Unix上工作。关于Cygwin实现的更详细描述, 请参考 http:2 . Cygwin软件的安装要得到Cygwin的最新安装版本,请到Cygwin的主页 Cygwin,在该页面的右上角有“ Install Cygwin Now ”,点击此处,就会先下载一个叫做 setup.exe的GUI安装程序,用它能下载一个完整的Cygwin。图7.2所示为在点击setup.exe 后出现”选择安装类型”对话框。建议读者把Cygwin整个安装包先下载到本地,再进行本地 安装比较方便,即在下图先选择第二个选项,等到将Cygwin完全下载后,再选择第三个选,| x|,| x|项进行本地安装。Choose Installation TypeChoose A Download SourceChoose whether to install or download from the internet or install from files in a local directory.汗?nstall from InternetDownload from InternetInstall from Local Directory上一步但)下一步但)取消图7.2选择安装类型安装的时候建议最好不要安装到C:目录下,比如安装在D:下。在安装的过程中,会让用户选择安装哪些包,这些包主要是确定开发环境,编译工具等, 如果不能确定具体需要哪些包的话,而硬盘空间足够的情况下,就选择全部安装。在出现的 对话框的“All”的右边点击"Default”,直到变成Install",如下图7.3所示:图7. 3选择安装包Cygwin的安装过程时间比较长,请读者耐心等待。当出现创建图标的画面点击“完成” 按钮之后,屏幕会有几秒钟的闪动,出现类似下面的画面如图7.4所示,这是在执行Cygwin 安装后的脚本配置。Cygwin Setup Post-Install Script图7.4 Cygwin安装后自动配置自动配置结束后,出现Cygwin成功安装结束的提示框。桌面上会出现Cygwin的图标。3 .在Cygwin下生成交叉编译器在自己生成交叉编译器之前,首先对cygwin进行一些设置。假设Cygwin安装在d目 录下,在打开Cygwin窗口之前,进入到D:cygwin目录,在这个目录下,有一个文件名为 cygwin.bat的批处理文件,编辑该文件,在第一行后加入set CYGWIN二title ntea,这是因为 cygwin的启动批处理文件需要启动Unix文件系统模拟。修改完毕后,保存后退出。双击桌 面上的Cygwin图标,打开后默认用户为在Windows中登录的用户名(这里所使用的操作系 统是windows 2000 professsional),在如图7.5所示的界面中,在根目录(即D:cygwin)下键入:cd bin mv sh.exe sh-original.exeIn -s bash.exe sh.exe做上述几步的原因是因为大多数linux系统将sh符号链接到bash, Cygwin上的sh.exe 和bash.exe是不同的,因此必须用bash代替sho从网站 http:14/上下载生成工具 链的各种源码,根据脚本文件build-uclinux-tools.sh建立可在windows下编译用户应用程序 的交叉编译器,生成的交叉编译器最终被打包为的文 件,其中yyyy为生成交叉编译器的年,mm为生成交叉编译器的月份,dd为日期。这里,希望读者注意的是在生成交叉编译器的过程中,可能会遇到多次错误,读者应该 根据给出的出错信息,进行相应文件的修改。由于习惯上的原因,linux下的压缩文件一般 都是以.tar.gz或者.tgz结尾的,虽然用windows下的解压软件比如winzip或者winrar可以解 压这些文件,但是推荐读者不要用这些软件在windows下解压,因为这样可能会造成某些 信息的丢失。本书生成的交叉编译器名为 图7. 5 Cygwin开发环境4 .在Cygwin环境下建立交叉编译器在根目录下键入:进行交叉编译器的解压,解压完毕后在/usr/local/bin/目录下可以看到各种GNU工具。 有了交叉编译器后,熟悉Windows的读者就可以在Windows下编译在uClinux上运行的应 用程序了。7.3.2 uClinux针对硬件的改动目前,uClinux已被成功移植到S3C4510B及其他多款ARM芯片上,但由于嵌入式操 作系统的运行是与嵌入式系统的硬件密切相关的,而硬件的设计则会因为使用场合的不同而 千差万别,因此,在uClinux内核源代码中和硬件紧密相关的部分就应该针对特定的硬件作 出适当的修改,由于uClinux内核源代码包含很大一部分的硬件驱动程序,不可能一一列举, 在此,就基于S3c4510B的最小系统的设计与运行相关的部分作简单的介绍,希望对读者有 所启发。uClinux内核源代码中对S3C4510B片内特殊功能寄存器以及其他相关硬件信息的定义 位于 uClinux-SamsungLinux-2.4.xincludeasm-armnommuarch-samsunghardware.h 文件中, 其中有儿个地方值得注意:/*define S3C4510b CPU master clock# /#define MHz1000000# define fMCLK_MHz (50 * MHz)define fMCLK(fMCLK_MHz/MHz)# define MCLK2(fMCLK_MHz/2)以上定义了系统工作的主时钟凝率为50MHz,若用户系统的工作频率不同,应在此处 修改,若串行口采用内部时钟信号用于波特率生成,该频率同时还与串行通信波特率有关。/* System Memory Control Register /裁剪和优化,形成了一个高度优化的、代码紧凑的嵌入式Linux,虽然它的体积很小,uClinux 仍然保留了 Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、完备的对各种 文件系统的支持、以及标准丰富的API等。图7为uClinux的基本架构。系茨调用处理函效内 技 初 蛤 优内 技 初 蛤 优森根文件系茨哲理模块文件系纸文件系统模块宇符 设缶 耶劫网络设缶蜚动Mass存储 设缶蜚动Socket兆动网络模块Boot Loader箱荻 Handler图7. 1 uClinux的基本架构Boot Loader:负责Linux内核的启动,它用于初始化系统资源,包括SDRAM。这部分 代码用于建立Linux内核运行环境和从Flash中装载初始化ramdisko内核初始化:Linux内核的入口点是start_kernel ()函数。它初始化内核的其他部分, 包括捕获,IRQ通道,调度,设备驱动,标定延迟循环,最重要的是能够fork “init”进程, 以启动整个多任务环境。系统调用函数/捕获函数:在执行完“init”程序后,内核对程序流不再有直接的控制权, 此后,它的作用仅仅是处理异步事件(例如硬件中断)和为系统调用提供进程。设备驱动:设备驱动占据了 Linux内核很大部分。同其他操作系统一样,设备驱动为它 们所控制的硬件设备和操作系统提供接口。文件系统:Linux最重要的特性之一就是对多种文件系统的支持。这种特性使得Linux 很容易地同其他操作系统共存。文件系统的概念使得用户能够查看

    注意事项

    本文(ARM应用系统开发详解—嵌入式uClinux及应用开发.docx)为本站会员(太**)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开