ARM应用系统开发详解—嵌入式uClinux及应用开发.docx
《ARM应用系统开发详解—嵌入式uClinux及应用开发.docx》由会员分享,可在线阅读,更多相关《ARM应用系统开发详解—嵌入式uClinux及应用开发.docx(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 嵌入式uClimix及其应用开发本章从构建一个针对S3C4510B硬件平台的嵌入式uClinux操作系统和在其上进行应用 程序的开发入手,逐步讲述如何在Linux环境下编写用户应用程序的方法和步骤,并为熟悉 Windows操作系统的用户介绍在这种平台之上,使用何种工具编写和编译自己的应用。通 过本章的学习,读者可以对嵌入式uClinux有一定的了解,并且掌握在Linux和Windows 下嵌入式系统应用开发的基本方法。本章主要内容有: 嵌入式uClinux系统概况 开发工具GNU的使用 建立uClinux开发环境 在uClinux下开发应用程序嵌入式uClinux系统概况在PC机上开发
2、应用程序的用户都会有这样的感觉,PC机有完善的操作系统并提供应 用程序接口(API),开发好的应用程序可以直接在操作系统上运行。虽然嵌入式系统的应 用程序完全可以在裸板上运行,但为了使系统具有任务管理、定时器管理、存储器管理、资 源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理, 更好的分配系统资源的功能,用户就需要针对自己的硬件平台和实际应用选择适当的嵌入式 操作系统(Embedded Operating System,以下简称EOS)。本节将结合本书所谈到的硬件平 台S3C4510B,介绍一种针对不带MMU的ARM微处理器的嵌入式操作系统uClinuxouCl
3、inux是一个完全符合GNU/GPL公约的操作系统,完全开放代码,现在由Line。公 司支持维护。uClinux的发音是“you-see-linux”,它的名字来自于希腊字母“mu”和英文大 写字母“C”的结合。“mu”代表“微小”之意,字母“C”代表“控制器”,所以从字面 上就可以看出它的含义,即“微控制领域中的Linux系统”。为了降低硬件成本及运行功耗,有一类CPU在设计中取消了内存管理单元(Memory Management Unit,以下简称MMU)功能模块。最初,运行于这类没有MMU的CPU之上 的都是一些很简单的单任务操作系统,或者更简单的控制程序,甚至根本就没有操作系统而 直接
4、运行应用程序。在这种情况下,系统无法运行复杂的应用程序,或者效率很低,而且, 所有的应用程序需要重写,并要求程序员十分了解硬件特性。这些都阻碍了应用于这类CPU 之上的嵌入式产品开发的速度。然而,随着uClinux的诞生,这一切都改变了。uClinux从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。它是专门 针对没有MMU的CPU,并且为嵌入式系统做了许多小型化的工作。适用于没有虚拟内存 或内存管理单元(MMU)的处理器,例如ARM7TDMI。它通常用于具有很少内存或Flash 的嵌入式系统。uClinux是为了支持没有MMU的处理器而对标准Linux作出的修正。
5、它保 留了操作系统的所有特性,为硬件平台更好的运行各种程序提供了保证。在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中首先定义
6、了十个宏: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 +廿 表示对这个
7、宏定义在原来的基础上增加新的内容; SRCS =.代表了所有要编译的源代码文件列表;OBJS =$(SRCS:.c=.o),表示把宏SRC所代表的所有以.c结尾的文件名用。结尾的文件 名替换,即表示各个源文件所对应的目标文件名;RM =rm-f表示删除命令,-f是强制删除选项,使用该符号,在对文件进行删除 时,没有提示;CC = gcc,表示编译器是用gcc;LD= gcc,表示链接命令是用gcc;all和clean是两个伪目标,在使用make命令的时候,如果不指明目标文件名,则是以 在makefile中出现的第一个目标作为最终目标,所以如果键入命令make,则伪目标all被 作为最终的目标而
8、执行,由于这个文件并不存在,所以make会尝试更新all规则,因此 就检查它的依赖文件tunel是否需要更新,如果需要,就把它更新,这样伪目标下面的两 条规则就会被执行,从而生成可执行文件tunel。如果要执行删除命令,只需耍键入命令make clean,就会把所有以。结尾的中间文件删除。另外,请读者注意在本makefile的例子中多次用到7,该符号用于在makefile中,如 果一条语句过长时,可以用放在这条语句的右边界,通过回车换行,使下面新一行的语句 成为该语句的续行。在makefile文件中,用符号印作为注释行语句的开始,以增强makefile文件的可读性。 本例假设makefile文
9、件名为makefile,当然也可按照个人的喜好取其他文件名,如果文 件名不是makefile, Makefile的话,在用make命令是,请使用make-f makefilenameo至U此,希望读者能够掌握make和makefile的基本使用。使用GDB调试程序无论是多么资深的程序员在编写的程序时,都不大可能一次性就会成功,在程序运行时, 会出现许许多多意想不到的错误,一味地只是查看程序用处不大,最有效的方法通过一些手 段进入到程序内部进行调试。通常在调试程序的时候如果能够得到以下一些信息,对于开发 者找到错误所在是很有帮助的。1 .程序是运行到哪个语句或者表达式就发生了错误?2 .如果错误
10、是在执行一个函数的时候出现的,那么是程序的哪一行包含了这个函数的 调用语句,在调用该函数的时候传递的实参是什么?3 .在程序执行到某处时,所关心的某一个变量值为多少?4 .某个表达式最终运行的结果为何值?调试器(更准确地说应该称为符号调试器)能够完成上述目标。它是一个能够运行其他程 序的应用程序,它和普通意义上的程序的唯一不同之处在于,调试器能够进入到程序源码中, 允许开发者进行逐行单步运行,了解程序代码执行顺序,和每条语句执行的结果,可以在程 序运行的同时,查看甚至是改变任一变量值。在程序运行出错时,它为程序开发者提供程序 运行时的详细细节,从而找到出错的原因。在Linux系统中,最常用到的
11、就是GDB(GNU Degugger)o GDB是GNU自带的调试工具。7. 2. 3. 1 GDB常用命令要想使用gdb,必须在对源码进行编译的时候,使用-g编译选项开关,来通知编译器, 开发者希望进行程序调试。用了-g选项后,程序在编译的时候就会包含调试信息,这些调 试信息存在目标文件中,它描述了每个函数或变量的数据类型以及源码行号和可执行代码地 址间对应关系,gdb正是通过这些信息使源码和机器码相关联的,它实现了源码级的调试。为了使用gdb调试,只需要在命令行中输入gdb filename(filename是用gcc编译生成的 最终可执行文件名),该语句启动与调试器的文本接口。就在上一小
12、节中所举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 c
13、onditions. 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 ,
14、 就如同是输入命令:tunel command-line-arguments 一样,启动了可执行程序的运行。有时候,我们希望能够断点调试程序,让程序执行到代码某处时停止继续执行下去, 此时可以使用命令break,该命令的格式为break place,这里place可以是程序代码的行号, 某函数名,甚至可以是用break main ,让程序断点设置在代码一开始执行的地方,比如对 于上面举的可执行文件名为tunel的例子,它调用了一个函数名为rtExtModeChecklnit的子 函数,如果想让程序执行到该函数处停止,可以在gdb提示符下输入:break rtExtModeChecklnit,此
15、时屏幕上出现下歹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表示第几个 中断,
16、第一个设置的中断序号为1,第二个设置的序号为2,依次类推。如果delete后不跟 任何序号,在表示把设置的所有断点都删除。如果想查看目前设置断点的情况,可以使用命 令info break,屏幕会显示出每一个设置的断点信息。在gdb提示符下使用help命令,会给出有关gdb命令的一个简短描述和命令分类。如果开发者想进入到程序内部进行单步调试,gdb提供两种命令供选择,step和next 命令,两者的区别在于step执行每一条语句,如果遇到函数调用,会跳转到到该函数定义 的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作普通一条语句执行 完成。continue命令是继续运行程序,直
17、到遇到下一个断点或程序结束。有时候使用者仅仅是在linux的bash提示符下输入命令gdb后,启动了 gdb而已,此 时,如果要加载可执行文件,需要在gdb提示符下键入命令:file filename(filename为可执 行文件名),注意是可执行文件的名字而不是源文件名。当在调试过程中,想查看一个变量值的时候,可以在gdb环境下输入命令:watch variablename ,这里的variablename是你想观察的变量名。还有一个可以显示表达式值的命令print,其使用规则为print expressionname,其中 expressionname为要显示的表达式名。7. 2. 3.
18、 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 static void display(int i, int *ptr); int main(void)int x = 5;int *xptr = &x;printf(HIn
19、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调试程序,一定要在编译程序时,使
20、用-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.G
21、DB 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-
22、redhat-linuxn . (gdb)最后一行(gdb)就是进入到gdb调试中的提示符,此时可以在提示符下输入任何想键入 的命令。现在如果要进行断点调试的话,就需要显示一下要调试的源码,以便知道在哪个地方进 行断点设置。在gdb下,Linux最常用文本编辑命令vi不能使用,可以使用list命令列出可 执行文件的源代码的一部分,为了列出源代码的全部,只要多键入几次list命令即可。具体 操作如下:(gdb)1list#include static void display(int i, int *ptr);int main(void) int x = 5;int *xptr = &x;101
23、0(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 应用 系统 开发 详解 嵌入式 uClinux
限制150内