您好,欢迎访问三七文档
嵌入式操作系统第二章预备知识李明讲师Mail:liming_nefu@nefu.edu.cnQQ:10361454822.1开发工具2.1.1BorlandC3.1精简版BorlandC++3.1(简称BC3.1)是美国Borland公司的一款经典产品,可应用于x86系列CPU平台,配备的软件工具支持C/C++及汇编编程的集成开发和调试。该产品自推出以来,就以它卓越的编译性能及简单明了的操作界面获得了巨大的成功,深受广大开发工程师的喜爱。3•BorlandC3.1精简版只保留了BC3.1核心开发工具和库,即只保留了BC3.1的bin、include和lib三个目录。Bin目录中为各个开发工具,include目录中为库代码的头文件,lib目录中为库文件。•我们来看一下Bin目录中的内容:其中bcc.exe为C语言程序编译器,tasm.exe为汇编器,tlink.exe为连接器,而make.exe为用来执行makefile文件的执行工具,即通常所说的工程管理器。4•BC3.1精简版的安装复制到C盘,并将其目录命名为BC,当需要使用某个开发工具时,其命令格式如下:c:\bc\bin\bcc…•环境变量的设置方法如下:我的电脑——属性——高级(选项卡)——环境变量——(选中变量)PATH——编辑(按钮)——变量值(c:\bc\bin)5•例2-1一个简单的问候程序(1)编辑程序代码如下:test.c#includestdio.hvoidmain(){printf(hello,world!\n);}6(2)进入命令行环境并进入程序所在目录,把程序编译成目标程序c:\bcc-c-ml-Ic:\bc\include-Lc:\bc\libtest.c其中bcc为编译命令,该命令将启动bin目录中的bcc.exe。命令行最后的test.c为待编译的源文件名称。处在编译命令与源文件之间的那些字符则是编译命令的选项,这些选项定义了编译器具体工作方式。上述命令中使用的选项为:•–c指定将源文件编译成目标文件•–ml、-ms、-mh(本书使用-ml)指定内存模式的选项•–I指定包含文件所在路径•–L指定库文件所在路径编译后,在本目录会产生一个test.obj文件。以obj为扩展名的文件是一个中间文件,也叫做目标文件。7(3)把目标文件连接成可执行文件为了形成扩展名为exe的最后可执行文件,还需要把目标文件与生成可执行文件所需其他目标文件连接起来,使用BC提供的连接器tlink.exe:c:\tlinkc:\bc\lib\c0l.objtest.obj,test,test,c:\bc\lib\cl.lib使用连接器的命令格式为:tlink[选项…]目标文件名[目标文件名…],最终可执行文件名,map文件名,lib文件名,def文件名8•表2-1(p18)中列出了几种不同内存模式所需的启动模式和相应的运行库。不同的内存模式,其库文件也不同。•本例最终产生了一个test.exe文件和test.map文件,用户可以通过map文件来查看程序的内存映射。•查看程序运行结果92.1.2多文件程序的编译和链接•在软件设计的实际工作中,一个工程通常都会有多个源文件,所以通常都会要经过编译和连接两个过程。•例2-2一个具有三个源文件应用程序的编译及连接示例。(1)pa程序代码头文件pa.h源文件pa.c10•//pa.h•#ifndefPA_H•#definePA_H•voidA_print();•#endif------------------------------------•//pa.c•#includestdio.h•#includepa.h•voidA_print()•{•printf(AAAAAAAA\n);•}11(2)pb程序代码头文件pb.h•//pb.h•#ifndefPB_H•#definePB_H•voidB_print();•#endif源程序pb.c•//pb.c•#includestdio.h•#includepb.h•voidB_print()•{•printf(BBBBBBBB\n);•}12(3)test.c程序代码•//test.c•#includepa.h•#includepb.h•voidmain()•{•for(;;)•{•A_print();•B_print();•}•}(4)编译•进入源文件目录,在命令行状态编译pa.c以形成pa.obj文件,命令为:bcc–c–ml–Ic:\bc\include–I.\–Lc:\bc\libpa.c•编译pb.c以形成pb.obj文件,命令为:bcc–c–ml–Ic:\bc\include–I.\–Lc:\bc\libpb.c•编译test.c以形成test.obj文件,命令为:bcc–c–ml–Ic:\bc\include–I.\–Lc:\bc\libtest.c13(5)连接成可执行文件test.exe生成test.exe的命令为:tlinkc:\bc\lib\c0l.objpa.objpb.objtest.obj,test,test,c:\bc\lib\cl.lib(6)运行test.exe得运行结果•使用连接文件的命令格式为:tlink@连接文件名.txt•(连接文件的扩展名也可以用*.lnk)14•连接文件的内容可以分行书写,换行的分界以原命令中的逗号为界,本例中的连接文件tlink1.txt就可以写成如下的形式:c:\bc\lib\c0l.objpa.objpb.objtest.objtesttestc:\bc\lib\cl.lib•如果分行后,一行仍然很长,那么还可以用“+”号作为续行符再进行分行书写。c:\bc\lib\c0l.obj+pa.obj+pb.obj+test.objtesttestc:\bc\lib\cl.lib•则连接的命令格式如下:tlink@tlink1.txt152.2工程管理工具make及makefile•与连接文件类似,为了减轻工作量,BC也允许把源文件的编译及目标文件的连接全部工作写成一种叫做makefile的文件,并提供了可以执行这种文件的工具make.exe,从而实现所谓的“自动”编译和连接。1.make工具•make工具也叫做工程管理工具或项目管理工具。该工具的功能就是运行一种叫做makefile的文本文件,makefile文件由开发者编写。当启动make.exe,该工具就会去查找用户编写的makefile并执行,从而实现项目文件的“自动”管理。162.makefile的结构•makefile文件就是对源文件进行编译和连接的脚本,也就是说makefile文件就是用DOS命令写出来一个文件来对工程文件进行管理。•一个makefile文件由若干个程序段组成,可以采用标号的方式对程序段进行标注。当不同的程序段需要关联时,在标号的后面还可以有一个或者多个与程序段相关联的其他程序段的标号,每个关联标号的前面都要带有一个空格。17程序段的格式如下:程序标号:关联程序标号1关联程序标号2…命令集注意:命令集中的所有命令行必须以TAB键开头。3.标号的作用标号可以看作是一个程序段的名称,用户可以在make命令的后面接标号来指定要执行的程序段。(类似于gotoLabel)18•例2-3makefile文件示例(1)makefile文件的代码(makefile.mak)target1:md11target2:md22target3:rd11rd2219(2)在命令行进入本makefile所在目录,运行makemaketarget2maketarget3make命令后面不接标号表示默认执行makefile文件的首段,而其他段的执行则需要在make命令中通过标号来指定。20•可以在makefile中使用任何命令行命令,包括bcc和tlink等BC命令,所以用户可以把源文件的编译和目标文件的连接工作也写到makefile中,即通过执行makefile文件来完成编译及连接工作。•例2-4为例2-2设计一个具有4个程序段的makefile.mak,并在该文件中实现源文件的编译及目标文件的连接,从而最终生成可执行文件。21(1)makefile文件的代码test.exe:tlink@tlink1.txt########################################pa.obj:bcc-c-ml-Ic:\bc\include-Lc:\bc\libpa.cpb.obj:bcc-c-ml-Ic:\bc\include-Lc:\bc\libpb.ctest.obj:bcc-c-ml-Ic:\bc\include-Lc:\bc\libtest.c本makefile文件中各段使用了每段程序的目标文件名作为标号。第一段完成各个目标文件的连接以形成最终的可执行文件,另外三段分别完成了三个源文件的编译,从而形成三个目标文件。22(2)makefile文件的执行makepa.objmakepb.objmaketest.objmake234.target(标号)的目标作用•可见使用文件名作为标号有一个好处,就是可以清楚的调用相应的程序段。但是有个问题,每生成一个文件就要使用一次make命令,为了使用一次make命令就能完成所有的编译及连接工作,makefile允许把程序段写成如下形式:目标:生成目标所需要的文件名(依赖文件)命令集•为了强调目标与所需文件之间的关系,人们把生成目标所需要的文件叫做“依赖文件”。对于上例来说,test.exe的依赖的文件为pa.obj,pb.obj和test.obj。那么makefile文件的第一个程序段可以改为:test.exe:pa.objpb.objtest.objtlink@tlink1.txt24•makefile的执行过程如下:①由于make命令中没有任何参数,因此最开始被执行的就是本makefile的第一个程序段。如果目标test.exe后面的依赖文件都存在,则命令tlink将被执行,从而把各个依赖文件连接成最终可执行文件。程序的执行即告结束。②如果依赖文件并不完全存在,那么本段落的命令不会被执行,从而转向以该依赖文件名为标号的程序段生成本程序段的目标pa.obj、pb.obj和test.obj。为了格式上的整齐,凡是以目标为标号的程序段都要写上目标的依赖,例2-5的makefile规范写法如下:25•test.exe:pa.objpb.objtest.objtlink@tlink1.txt•pa.obj:pa.cpa.hbcc-c-ml-Ic:\bc\include-Lc:\bc\libpa.c•pb.obj:pb.cpb.hbcc-c-ml-Ic:\bc\include-Lc:\bc\libpb.c•test.obj:test.cbcc-c-ml-Ic:\bc\include-Lc:\bc\libtest.c•makefile文件的执行进入文件所在目录输入命令make265.伪目标•Makefile的标号(target)有标号和目标两种作用。人们把makefile中的所有标号(target)叫做目标,把那种仅起标号作用的目标叫做“伪目标”。在makefile文件中,伪目标所对应的程序段是一个不与其他程序段相关联的程序段,所以在需要执行它们时,必须在make命令中使用其标号。•伪目标的程序段通常用来执行一些创建目录、删除目录、复制文件、移动文件及删除文件等项目管理任务。27•例为上例的makefile添加一个标号为clean的伪目标程序段,目的是删除中间的目标文件pa.obj、pb.obj和test.obj。添加的程序段为:test.exe:pa.objpb.objtest.objtlink@tlink1.txtpa.obj:pa.cpa.hbcc-c-ml-Ic:\bc\include-Lc:\bc\libpa.cpb.obj:pb.cpb.hbcc-c-ml-Ic:\bc\include-Lc:
本文标题:嵌入式-2
链接地址:https://www.777doc.com/doc-4023837 .html