第二章μC/OS-II的入门知识μC/OS-II是一种跨平台的操作系统,很容易移植到不同架构的微处理器上。它是在PC机上开发和测试的,例子可在Windows环境下的DOS窗口内运行。C编译器使用的是BorlandC/C++编译器,本书使用BC45,主要应用它的工具程序。本章主要内容:BC45编译器的使用Make和makefile初识μC/OS-II,实例演示2.1开发工具采用BorlandC/C++V4.5(后简称BC45)的C编译器和BorlandTurboAssembler汇编器。这个编译器可产生可重入型代码,同时支持在C语言程序中嵌入汇编语句。BC45下有3个重要的目录:bin、include、lib。Bin目录中为各个开发工具,include目录中为库代码的头文件,lib目录中为库文件。在开发C++的过程中,除了使用BorlandC++IDE之外,还可以在DOS下直接用命令,达到编译及链接的效果,还有一些程序开发工具也非常实用。以下是本节要介绍的工具程序,这些程序都位于bin目录下。BCC(BorlandCCompiler)Tlink(Linker)TASM(Assembler)MAKE2.1.1BCC编译器BCC.是BorlandC的编译器。BCC的命令格式是:BCC[Option[Option…]]filename[filename…]其中,BCC是编译链接命令,该命令将起到bin目录下的bcc.exe的作用。filename表示文件名,必须在命令中包含至少一个文件的名字。文件的名字一般是带有.c后缀的c语言源程序。Option是选项,编译器支持的选项包括以下方面。1.内存模式BCC能够编译的内存模式如表2-1所示。表2-1内存模式内存模式选项描述-mc编译时用Compact内存模式-mh编译时用huge内存模式-ml编译时用large内存模式-mm编译时用medium内存模式-mm!编译时用medium内存模式;DS!=SS-ms!编译时用small内存模式;DS!=SS-ms编译时用small内存模式-mt编译时用tiny内存模式-mt!编译时用tiny内存模式;DS!=SS2.宏定义编译器支持的宏定义选项如表2-2所示。表2-2宏定义宏定义选项描述-Dname定义宏符号name为空字符串(Nullstring)-Dname==String定义宏符号name为string-Vname解除宏符号name的定义3.目标码编译器支持的目标码选项如表2-3所示。表2-3目标码目标码选项描述-1产生802186之实模式(RealMode)目标码-1-产生8088/8086目标码-2产生80286的保护模式(ProtectedMode)-a强迫整数的长度,必须符号该机器的存取长度。-b将相同字符串合并,使程序大小便更小-Fs在全部的存储模式内,假设DS等于SS-f程序运行浮点运算时如没80x87则模拟80x87的运行如有80x87则调用之-f87程序运行时浮点运算时使用80x87处理器-f287与-f87相同,但只能用于协处理器为80287以上者-N在调用函数时加上检查有否溢出(stackoverflow)-p强制使函数调用之参数传递方式为pascal。Pascal:代表函数之参数放置到堆栈(stack),顺序与传统C相反。-X产生overlay程序-y在目标文件存放源程序的行号,共调试之用,此举将是程序大小增大,但不影响运行效率。4.优化编译器支持的优化选项如表2-4所示。表2-4优化优化选择描述-02产生一运行速度最快的目标码-01产生最小的目标码-0将调整(Jump)跳到另一个跳转及永远运行不到程序,和不需要的调整都除掉。-0d将全部优化的参数设置都解除-0l压缩循环(Loop)-0m将内容不变的变量移到循环之外5.源代码编译器支持的源代码选项如表2-5所示。表2-5源代码源代码选项描述-A源代码为ANSI结构-A-源代码为BorlandC++-AU源代码为UNIX结构-C允许嵌套注释说明(NestComments)-in变量或函数名有效长度为n(1≤n≤32),建议n不用小于8.6.错误产生选项此处的错误包括真正的错误(Error)及警告(Warning),如表2-6所示。表2-6错误选项描述错误选项描述-gn当编译时发生n个警告后就停止编译-jn当编译时发生n个错误后就停止编译-w当有警告时,显示其内容-wxxx当xxx情况发生时,视为一个警告-w-xxx当xxx发生时,不视为一个警告7.编译控制编译器支持的编译控制选项如表2-7所示。表2-7编译控制选项编译控制选项描述-B在程序中调用汇编器(Assembler)编译程序中的汇编语言-Efilename要调用什么编译器,通常Filename为TASM-H使用已经编译过的表头文件,通常是TCDEF.SYM-p假设全部要编译的程序其扩展名全部是*.cpp-ofilename产生的目标文件(*.obj)为何?-WD产生DLL可以使用这模块8.EMS选项编译器支持的EMS选项如表2-8所示。表2-8EMS选项EMS选项描述-Qe使用全部的EMS来编译程序-Qe==xxxx使用xxx个页得EMS编译程序-Qe-不作EMS-Qx=xxxx使用xxxx个bytes的extendedmemory来编译程序9.链接器参数设置编译器支持的链接器选项如表2-9所示。表2-9链接器选项链接器选项描述-efilename产生的运行码的文件名(即*.COM,*.DLL,*.EXE的名称)-tDe产生DOS*.EXE文件-tDc产生DOS*.COM文件-M链接时产生LinkMap文件10.环境参数设置编译器需设置的环境参数如表2-10所示。表2-10环境参数设置环境参数描述-Ipath在path路径下找头文件,如-IC:\BC45\INCLUDE-npath将产生的*.OBJ及*.ASM放到path路径下2.1.2Tlink链接器TLINK为一独立的链接器。当BCC.EXE要运行链接动作时,就是调用TLINK。如要BCC.EXE只编译不用链接,则可用-c参数,例如BCC–ctest结果产生test.obj不会产生test.exe。TLNK使用语法如下:TLINK[options…]objfiles,exefiles,mapfile,libfiles,deffile其中,TLINK表示链接器命令,option表示链接器选项,objfiles表示目标文件名,exefiles表示可执行文件名,mapfile表示map文件名,libfiles表示库文件名,deffile表示def文件名。TLINK的选项如表2-11所示。表2-11TLINK的选项TLINK的选项描述/3处理32位模块(80286/80486)/c符号、大小写必须吻合才能引用/C在模块定义文件的EXPORTS,IMPORTS符号、大小写必须吻合才能引用/d如果在程序库内有重复的符号,则显示警告信息/i启动全部的segments/l链接时将源程序行号加到运行文件内,利用调试/m产生MAP文件(链接的模块对照文件)/n不用省略之程序库/o产生overlay程序/s产生segments对照表/t产生*.COM文件/Tdc产生DOS*.COM文件/Tde产生DOS*.EXE文件/Twe产生windows*.EXE文件/Twd产生windows*.DLL文件/v包括除错信息/ye不产生MAP文件/Yx利用expanded内存例2-1DOS*.EXE的链接Tlink/cmufun1fun2,myexe,mymap,temp\lib\mylib将mu.obj,fun1.obj,fun2.obj链接成myexe.exe,其MAP文件为mymap.map,其链接程序模块库为mylib.lib,其路径为temp\lib由于tlink的参数可能很长,因此可以将这些参数存到一个特定的文件称为响应文件(Responsefile)。使用时只要调用此响应文件即可。如例2-1可改写成/cmyfun1fun2MyexeMymaptemp\lib\mylib存到一个文件名为my内,而运行tlink@my如果TLINK原Option很多,可将这些Option存到TLINK.CFG(CFG为Configuration)内。由于程序的内存模式不同,因此链接的模块及程序也有所不同。DOS环境下的不同内存模式启动模块和库如表2-12所示。表2-12DOS环境下内存模式的启动模块和库内存模式启动模块数学程序库运行库-mt(Tiny)C0T.OBJ,C0FT.OBJMATHS.LIBCS.LIB-ms(Small)C0S.OBJ,C0FS.OBJMATHS.LIBCS.LIB-mc(Compact)C0C.OBJ,C0FC.OBJMATHC.LIBCC.LIB-mm(Medium)C0M.OBJ,C0FM.OBJMATHM.LIBCM.LIB-ml(Large)C0L.OBJ,C0FL.OBJMATHL.LIBCL.LIB-mh(Huge)C0H.OBJ,C0FH.OBJMATHH.LIBCH.LIB注:tiny和small模式的数学程序库,运行库相同。2.1.3“HelloWorld”程序例2-2程序给出“HelloWorld”的源代码,源程序文件名test.c。#includestdio.hmain(){printf(“HelloWorld!\n”);}(1)把源程序编译成目标程序由于BC45已拷贝到c:\,把环境变量设置成path=c:\bc45\bin,下面进行源程序的编译C:\bcc–c–ml–Ic:\bc45\include–Lc:\bc45\libtest.c将源程序文件编译成目标文件,指定的内存模式是large模式,-I指定包含文件路径,-L指定库文件路径。编译后,在本目录下生成test.obj的目标文件。(2)把目标文件链接成可执行文件C:\tlinkc:\bc45\lib\c0l.objtest.obj,test,test,c:\bc45\lib\cl.lib这样形成了test.exe文件。(3)运行test.exe在屏幕上输出HelloWorld!2.1.4TASM汇编语言编译器C语言可以与汇编语言相链接,两种语言相辅相成,各有特色。在BorlandC++内附有TASM.EXE,此程序为汇编语言的编译器。其使用语法如下:TASM[Opions]source,[Object][,Listing][,xref]Source:为要编译的文件(*.ASM)Object:编译后的目标文件(*.obj)Listing:编译后的列表文件(*.LST),说明编译结果Xrdf:编译后的交叉参考文件(*.xrf)Options:表示编译选项,具体说明如表2-13所示。表2-13TASM的编译选项TASM的编译选项描述/c定义交叉参考的列表文件/dxxx[=nnn]定义符号xxx=0或者为xxx=nnn(例/dABC=20)/e,/r模拟浮点数指令/h,/?在线帮助/ipath找寻path路径内的包含文件(includefile,*.inc)(例/ic:\bc45\asm)/l一般列表文件/la详细列表文件/ml全部符号,不管其大小写/mx全局符号,不管其大小写/mv#符号有效长度为#(例/mv8)/n在列表文件内不显示符号表/o,/p产生目的码/t如编译成功则不显示任何信息/w0/w1/w2设置warning严格程度W0没有warning/z在有错误时一并显示源程序的行号2.1.5make和makefile在大型的开发项目中,人们通常利用make工具来自动完成编译工作,这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件;利用这种自动编译可大大简化开发工作,避免不必要的重新编译。实际上,make工具通过一个称为makefile的文件来完成并自动维护编译工作。make