嵌入式Linux编程开发基础知识_第1页
嵌入式Linux编程开发基础知识_第2页
嵌入式Linux编程开发基础知识_第3页
嵌入式Linux编程开发基础知识_第4页
嵌入式Linux编程开发基础知识_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

第3章嵌入式Linux编程开发

根底知识目录3.1Linux环境下相关工具的使用介绍3.2交叉编译工具链的使用3.3Makefile工程管理器Linux环境下相关工具的使用介绍VI两种模式的实例VI进入/退出输入模式进入和退出vi删除和修改文本光标移动光标按行移动光标按单词移动文本编辑文本编辑文本替换文本删除与替换比照加密/解密复制和移动文本块.表示当前行,0表示文件头,$表示文件尾文件保存GDB四大功能启动、加载、退出GDBGDB的操作GDB的操作GDB的操作GDB的操作GDB的操作GDB的操作GDB的操作GDB远程调试功能本地主机Xwindow环境GDB/XGDB远程主机Stub程序内核应用程序串口或TCP/IP连接SourceInsight的使用方法目录3.1Linux环境下相关工具的使用介绍3.2交叉编译工具链的使用3.3Makefile工程管理器3.4“文件包含〞处理gcc、arm-linux-gcc介绍GCC(GNUCompilerCollection)执行编译的过程arm-linux-gcc的执行过程与gcc一致gcc、arm-linux-gcc介绍gcc、arm-linux-gcc的用法gcc[options][filenames]arm-linux-gcc使用参数与gcc一致交叉工具链常用工具介绍arm-linux-ld链接工具的选项介绍ld将目标文件跟档案文件连接起来并重定位它们的数据连接、符号引用arm-linux-ld链接工具作用ld链接器的优势在遇到错误的时候ld链接器能继续执行以便于发现其他其他错误并且能提供诊断信息arm-linux-ld链接工具的选项介绍ld-oOUTPUT/lib/crt0.ohello.o-lc链接实例分析链接器输出文件名链接文件链接文件对库libc.a的搜索输出参数arm-linux-ld链接工具的选项介绍交叉编译工具的制作需要的压缩包:

crosstool-0.43.tar.gzbinutils-2.16.1.tar.bz2gcc-4.0.2.tar.gzglibc-2.3.6.tar.gzglibc-linuxthreads-2.3.6.tar.gzlinux-2.6.26.tar.gzlinux-libc-headers-2.6.12.0.tar.bz2准备工具包交叉编译工具的制作在登录的用户目录下面建立cross目录mkdir/home/jameszhang/cross交叉编译工具的制作将crosstool-0.43.tar.gz复制到cross目录并解压

cpcrosstool-0.43.tar.gz/home/jameszhang/crosscd/home/jameszhang/cross交叉编译工具的制作将其他文件一起复制到cross目录下cpbinutils-2.16.1.tar.bz2/home/jameszhang/crosscpgcc-4.0.2.tar.gz/home/jameszhang/crosscpglibc-2.3.6.tar.gz/home/jameszhang/crosscpglibc-linuxthreads-2.3.6.tar.gz/home/jameszhang/crosscplinux-2.6.26.tar.gz/home/jameszhang/crosscplinux-libc-headers-2.6.12.0.tar.bz2/home/jameszhang/cross交叉编译工具的制作进入crosstool-0.43目录对相关文件进行修改修改arm.dat KERNELCONFIG=`pwd`/arm.config TARGET=arm-linux TARGET_CFLAGS="-O"交叉编译工具的制作进入crosstool-0.43目录对相关文件进行修改修改demo-arm.sh将第7、8行改为如下:TARBALLS_DIR=/home/jameszhang/cross /*下载的源码包存放

的路径*/RESULT_TOP=/home/jameszhang/crosstool /*交叉编译工具链安

装的路径*/屏蔽第44行在44行下添加:eval`catarm.datgcc-4.0.2-glibc-2.3.6.dat`shall.sh--notestt交叉编译工具的制作修改gcc-4.0.2-glibc-2.3.6.dat进入crosstool-0.43目录对相关文件进行修改修改成如下:BINUTILS_DIR=binutils-2.16.1GCC_DIR=gcc-4.0.2GLIBC_DIR=glibc-2.3.6LINUX_DIR=linux-2.6.26LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6交叉编译工具的制作生成交叉编译工具执行./demo-arm.sh即可生成我们需要的交叉编译工具(半小时左右)最终生成交叉编译工具的位置:/home/jameszhang/crosstool目录3.1Linux环境下相关工具的使用介绍3.2交叉编译工具链的使用3.3Makefile工程管理器3.4“文件包含〞处理Makefile工程管理器什么是makefile项目中的源文件不计数,按类型、功能、模块分别放在若干目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,makefile就像一个Shell脚本一样,也可以执行操作系统的命令。makefile的好处make是一个命令工具,是一个解释makefile中指令的命令工具。可以进行“自动化编译”,一旦写好只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。Makefile工程管理器makefile的基本结构target……:dependency……

command……target(目标):一个目标文件,可以是Object文件,也可以可执行文件,还可以是一个标签(Label)dependency(依赖):要生成目标文件(target)所依赖哪些文件command(命令):创立工程时需要运行的shell命令【注:命令(command)局部的每行的缩进必须要使用Tab而不能使用多个空格】Makefile工程管理器makefile实例假设有一个C源文件test.c,该源文件含有自定义的头文件test.h,则目标文件test.o依赖于两个源文件:test.c和test.h。如果希望利用gcc命令来生成test.o目标文件。则可以利用如下的makefile来定义test.o的创建规则:#Thismakefilejustisaexample. //注释行

test.o:test.ctest.h gcc–ctest.cclean: //清除编译中的中间文件 rm

-f

*.oMakefile工程管理器makefile实例edit

:

main.o

kbd.o

command.o

display.o

\

cc

-o

edit

main.o

kbd.o

command.o

display.o

\

main.o

:

main.c

defs.h

cc

-c

main.c

kbd.o

:

kbd.c

defs.h

command.h

cc

-c

kbd.c

command.o

:

command.c

defs.h

command.h

cc

-c

command.c

display.o

:

display.c

defs.h

buffer.h

cc

-c

display.c

clean

:

rm

edit

main.o

kbd.o

command.o

display.o

\

“\〞为换行符方便阅读Makefile工程管理器make命令编译链接文件的过程Makefile工程管理器makefile的基本内容Makefile工程管理器makefile-隐晦规则实例objects

=

main.o

kbd.o

command.o

display.o

\

edit:$(objects)

cc

-o

edit

$(objects)

main.o

:

defs.h

kbd.o

:

defs.h

command.h

command.o

:

defs.h

command.h

display.o

:

defs.h

buffer.h

clean

:

rm

edit

$(objects)

Makefile工程管理器makefile-清空目标文件规则实例一般风格

clean:

rm

edit

$(objects)

更为稳健的做法

.PHONY

:

clean

clean

:

-rm

edit

$(objects)表示clean是伪目标“-〞表示如果某些文件出现问题,但不马上处理,先继续做后面的事Makefile工程管理器GNUmake工作时的执行步骤Makefile工程管理器makefile中的变量Makefile工程管理器makefile变量举例#makefiletestforhelloprogram#writtenbyEmdoorCC=gccCFLAGS=OBJS=hello.oall:hellohello:$(OBJS) $(CC)$(CFLAGS)$(OBJS)–ohellohello.o:hello.c $(CC)$(CFLAGS)–chello.c–o$(OBJS)clean: rm–rfhello*.o使用自定义变量OBJS表示hello.oMakefile工程管理器makefile变量举例#makefiletestforhelloprogram#writtenbyEmdoorCC=gccCFLAGS=OBJS=hello.oall:hellohello:hello.o gcchello.o–ohellohello.o:hello.c gcc–chello.c–ohello.oclean: rm–rfhello*.omakefile执行展开后的形式Makefile工程管理器GNUmake主要预定义变量Makefile工程管理器GNU

make

的隐含规则Makefile工程管理器文件引用在makefile使用include关键字可以把别的makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。有三个makefile:a.mk、b.mk、c.mk,还有一个为foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:

includefoo.make*.mk$(bar)

等价于:

includefoo.makea.mkb.mkc.mke.mkf.mkMakefile工程管理器文件引用make命令开始时,会把找寻include所指出的其它Makefile,并把其内容安置在当前的位置。如果文件都没有指定绝对路径或是相对路径的话,make首先会在当前目录下寻找,如果当前目录下没有找到。那么,make还会在下面的几个目录下找:如果make执行时有-I或--include-dir参数make就会在这个参数所指定的目录下去寻找如果目录<prefix>/include(一般是/usr/include)存在make也会去找如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,如果还是不行make才会出现一条致命信息Makefile工程管理器makefile中的函数在makefile中可以使用函数来处理变量,从而让命令或规则更为灵活和智能,函数调用很像变量的使用,是以“$”来标识的,函数调用后,返回值可以当做变量来使用如最常见的wildcard的函数,可以展开成一列所有符合由其参数描述的文件名。文件间以空格间隔。语法如下:$(wildcardPATTERN...)例:用'wildcard'函数找出目录中所有的".c"文件:SOURCES=$(wildcard*.c)Makefile工程管理器make的执行make找寻默认的makefile的规则是在当前目录下依次找三个文件按顺序找这三个文件,一旦找到,就开始读取该文件并执行Makefile工程管理器嵌套执行make在大工程中,经常按功能模块存放源文件,为了让程序结构清晰所以经常在每个目录都存放该目录的makefile,这种方式对于分模块和分段编译带来便利例:一个子目录叫subdir,该目录下有makefile文件,来指明了这个目录下文件的编译规则。那么我们父目录的makefile可以这样书写:

subsystem:

cd

subdir

&&

$(MAKE)

等价于:

subsystem:

$(MAKE)

-C

subdir

先进入subdir目录然后执行make命令定义成变量容易维护Makefile工程管理器makefile传递变量父makefile的变量可以传递到子makefile中(如果你显示的声明),但是不会覆盖子Makefile中所定义的变量,除非指定“-e”参数传递变量到子makefile中通过export

<variable

...>;进行申明

例、完成子目录make后,离开目录时我们可以看到如下:

make:

Leaving

directory

`/EELiod/Kernel/linux-2.4.21-51Board_EDR/arch/arm/boot`变量传递完成退出makeMakefile工程管理器makefile变量定义变量的值使用=号,在=左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处。(注:右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值)例:

A

=

$(B)

B

=

$(A)

这会让make陷入无限的变量展开过程中去使用:=操作符,右侧是变量的值,右侧变量的值,右侧变量的值只能定义在使用变量之前。(注:前面的变量不能使用后面的变量,只能使用前面已定义好了的变量)例:

x

:=

foo

y

:=

$(x)

bar

x

:=

later

其等价于:

y

:=

foo

bar

x

:=

laterMakefile工程管理器makefile条件判断

ifeq

(,)

$(CC)

-o

......

else

$(CC)

-o

......

endif表示条件语句开始,并指定一个条件表达式,表达式包含两个参数以逗号分隔,表达式以圆括号括起表示条件表达式为假的情况表示一个条件语句的结束,任何一个条件表达式都以endif结束Makefile工程管理器makefile条件表达式<conditional-directive>;

<text-if-true>;

else

<text-if-false>;

endif

1、头文件在C语言中,需要利用头文件来定义结构、常量以及声明函数的原型。大多数C的头文件都存放在/usr/include及其子目录下。引用以上目录中的头文件在编译的时候无需加上路径,但如果程序中引用了其他路径的头文件,需要在编译的时候用–I参数。3.4“文件包含〞处理2、“文件包含〞处理“文件包含〞处理,意思是把另外一个源文件的内容包含到本程序中来。其作用是减少编写程序的重复劳动,即把一些要重复使用的东西,编写到一个“头文件〞〔*.h〕中,然后在程序中用#include命令来实现“文件包含〞的操作。例如:∑n=1+2+3+……+100求和运算。1

#include<stdio.h>2

intmain(){3

intx=100,s=0,i=1;5

while(i<=x)

{6

s=s+i;7

i++;8

}9

printf("sum=%d\n",s);10

return0;11

}为了让加法局部能重复使用,将加法局部写成一个函数intsum(intn)。intmysum(intn)

{

inti=1,ss=0;

while(i<=n){

ss=ss+i;

i++;

}

return(ss);

}再在主函数中调用它1

#include<stdio.h>2

intmysum(intn);3

intmain()4

{5

intx=100;6

ints=0;7

s=mysum(x);8

printf("sum=%d\n",s);9

return0;10

}注意:上述程序中的第2行语句intmysum(intn);是必不可少的。由于mysum(intn)函数的定义是从第11行语句开始,而调用mysum(intn)函数的语句在第7行。因此,要在调用之前声明这个函数。下面进一步将程序中具有独立功能的mysum()函数分割出来。该程序可分割为以下3个程序:mysum.h、mysum.c和ex_sum.c。〔1〕程序mysum.h:1/*mysum.h*/2intmysum(intn);〔2〕程序mysum.c:1./*mysum.c*/2.intmysum(intn)3.{4. inti=1,ss=0;5. while(i<=n){6. ss=ss+i;7. i++;8.

}9. return(ss);10.}〔3〕主程序ex_sum.c:1./*ex_sum.c*/2.#include<stdio.h>3.#include"mysum.h"4.intmain()5.{6. intx=100;7. ints=0;8. s=mysum(x);9. printf("sum=%d\n",s);10. return0;11.}在Linux环境下,执行编译程序命令:

gccex_sum.cmysum.c-osum此命令将ex_sum.c和mysum.c编译成一个在Linux环境下的可执行文件sum。在Linux环境下运行可执行文件sum,

./sum结果如下:

sum=5050位运算符C语言提供了六种位运算符:

&〔按位与〕、|〔按位或〕、^〔按位异或〕、~〔取反〕、<<〔左移〕、>>〔右移〕。3.5位运算1、按位与运算按位与运算:只有对应的两个二进位均为1时,结果位才为1,否那么为0。参与运算的数以补码方式出现。

例如:9&5可写成算式如下:可见9&5=1。按位与运算通常用来对某些位清0或保存某些位。例如把a的高八位清0,保存低八位,可作a&0x00ff运算〔0x00ff的二进制数为0000000011111111〕。

main(){

inta=9,b=5,c;

c=a&b;

printf("a=%d/nb=%d/nc=%d/n",a,

温馨提示

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

评论

0/150

提交评论