1.6 代码开发工具
本节将介绍代码开发工具:编译器、C++实时运行库、汇编器、连接器、专家链接器、归档器、分割器、加载器,可用的工具根据处理器的不同会有所不同。“Project Options”对话框中各页里的可用选项可以指定工具选项。
1.编译器
编译器(Compiler)可将C/C++程序处理成汇编代码,编译一个或多个C/C++源文件,其主要输出是一个可链接目标文件。为了给工程创建指定编译器选项,选择“Project→Project Options”选项,从弹出的“Project Options”对话框的树控件中展开“Compile”,并单击子页面,编译器选项归类在各个子页里,见表1-3。注意,可用的子页和选项取决于目标处理器和代码开发工具。
表1-3 编译器选项子页
2.C++实时运行库
必须运行VisualDSP++来使用C++实时运行库。C和C++实时运行库(RTL)是一些函数、宏和类模板的集合,可以在源代码中调用它们,很多函数是用处理器汇编语言来实现的。C和C++程序依靠库函数来执行C和C++程序设计语言的基本操作,这些操作包括存储器分配、字符与字符串转换、数学计算。这些库也包括许多信号处理函数,减轻了代码开发负担。通过提供满足各种需要的代码,RTL简化了软件开发。
编译器提供了丰富的C函数集用于处理器程序设计,包括那些ANSI标准必需的和ADI另外提供的有价值的函数。编译器软件包括标准C库和删减的、符合标准C++库的一个子集。关于C库的数学函数的基本算法的更多信息,读者可参考1980年Prentice Hall出版的Cody和Waite的书 Software Manual for the Elementary Functions。关于C++的ANSI/ISO标准的C++库部分的更多信息,读者可参考1994年Prentice Hall出版的Plauger的书Draft Standard C++ Library。
3.汇编器
汇编器用于汇编源程序、头文件和数据文件并产生目标文件。汇编器的主要输出是扩展名为“.doj”的目标文件。要指定汇编器选项,可选择“Project→Project Options”选项再单击“Assemble”。汇编器术语定义如下。
指令集 属于一个特定处理器的汇编指令集。
预处理程序命令 管理预处理程序包含文件、执行宏替换、控制条件汇编的命令。
汇编器指示符 告诉汇编器如何处理源代码、如何设置处理器属性的指示符,使用指示符构造用户程序到支持链接器描述文件(.ldf)所定义的逻辑Segment或Section,以便构建一个与目标系统相符的映像。
4.链接器
链接器用于链接单独汇编的文件(目标文件和库文件),产生可执行文件(.dxe)、共享存储器文件(.sm)、覆盖文件(.ovl),它们是可以加载到目标上的二进制可执行可链接文件(ELF)。为了得到可执行文件,链接器要处理来自链接器描述文件(.ldf)和一个或多个目标文件(.doj)的数据,可执行文件包含程序代码和调试信息,链接器完全解析可执行文件里的地址。要指定链接器选项,选择“Project→Project Options”选项,再单击“Link”标签,在链接页中选择“Category”选项,链接器选项归类在子页里,有:总体、LDF预处理、消除、处理器等。链接器术语定义如下。
对照链接(Link Against) 一个使链接器解析多个可执行文件要引用的符号的功能。例如,共享存储器(.sm)可执行文件包含其他处理器可执行文件(.dxe)要对照进行链接的代码段,通过这个处理,一个共享的对象可以被多个可执行文件使用,而无须复制。
链接对象 目标文件,它们将变成链接的和其他项如可执行文件(.dxe、.sm、.ovl),它们是对照链接的。
LDF文件 包含用于控制链接器如何在存储器里安排程序的命令、宏指令和表达式的文件。
存储器:向链接器提供目标处理器存储器系统描述的定义。
覆盖:根据代码操作,覆盖管理器要换入和换出实时运行存储器的文件。链接器产生覆盖文件(.ovl)。
段(Section) 识别链接器产生的每个可执行文件的内容的声明。
链接器描述文件(.ldf)描述了目标系统,映射用户程序代码到系统存储器和处理器。LDF文件创建一个可执行文件要用到:目标系统存储器映射、在源文件中定义的段。LDF文件的各个部分从开头到末尾是按如下顺序描述的:
(1)存储器映射:描述了处理器的物理存储器(位于LDF文件的开始)。
(2)“SEARCH_DIR、$LIBRARIES”和“$OBJECTS”命令:定义了路径名称,链接器用它们来搜索和解析输入文件中的引用。
(3)“MEMORY”命令:定义了系统的物理存储器,并为其中的逻辑段(Logical Segment)分配标签。这些逻辑段定义了程序、存储器和堆栈存储器类型。
(4)“SECTIONS”命令:通过将程序文件里指定的段(Section)映射到“MEMORY”命令里声明的段(Segment),定义了代码在物理存储器里的放置,“INPUT_SECTIONS”声明指定了链接器要用于解析映射的目标文件。
5.专家链接器
专家链接器是一个图形化工具,使用户可以定义目标处理器的存储器映射、放置工程的目标段到存储器映射中、查看处理器程序运行后用了多少堆栈和堆。这个交互式的工具加速了系统存储器的配置,它使用目标存储器描述、目标文件和库文件来创建存储器映射,用户可以据此控制系统存储器使用的优化。注意,专家链接器与链接器一起工作。专家链接器图形化地显示了LDF文件里作为输入的可用的工程信息,包括目标文件、LDF宏、库和目标存储器描述,使用拖放操作可以按图形化存储器映射表示方法来安排目标文件,当用户对存储器布局满意,就可以通过VisualDSP++工程选项产生可执行文件(.dxe)。当工程没有LDF文件时,VisualDSP++就会使用一个默认的LDF文件。对于已有的Blackfin工程,可以通过“Project Options”对话框里的“Add Startup Code/LDF”子页添加一个LDF文件。对于“SHARC”和“TigerSHARC”工程,要使用“Create LDF Wizard”来创建和定制一个新的LDF文件。
打开工程里已经存在的LDF文件时,专家链接器会分析LDF文件并图形化显示目标处理器的存储器映射和目标映射,存储器映射出现在专家链接器窗口里(如图1-9 所示),使用这个显示可以修改存储器映射或目标映射。当工程准备好可以创建了,专家链接器将保存这些变化到LDF文件里。专家链接器可以图形化显示分配给程序的堆和堆栈空间,在加载并运行程序之后,专家链接器将指示堆和堆栈的使用部分,于是可以据此减小堆和堆栈的大小来最小化它们的存储器分配,这可以释放存储器来存放代码和数据等其他对象。
图1-9 专家链接器窗口
使用专家链接器窗口可以修改存储器映射或目标映射。专家链接器窗口包含如下两个主要窗格。
(1)输入段(Input Section)窗格:显示输入段的一个树结构。
(2)存储器映射(Memory Map)窗格:按树或图形化方法显示每个存储器映射。
表1-4列出了存储器映射窗格右键菜单上的命令。使用专家链接器可以调整堆栈和堆的大小,以便更好地使用存储器。专家链接器可以进行如下操作:
表1-4 存储器映射窗格右击菜单
(1)定位堆栈和堆,并用一个标记值填充它们。这个操作发生在加载程序到处理器目标之后。堆栈和堆是根据它们的存储器段的名字来定位的。
(2)搜索处理器程序写入堆和堆栈里的最高存储器单元。这个操作发生在程序运行之后、目标停下来时。这些值就假定是堆栈或堆中未使用部分的开始地址,专家链接器将更新存储器映射以显示多少堆栈和堆未被使用。堆栈和堆有如下的限制:
① 分别在HEAP、STACK和SYSSTACK输出段中定义堆、堆栈和系统堆栈。
② 在这些输出段中,堆、堆栈和系统堆栈必须是唯一项,不能有其他目标。
对于不同处理器系列,根据默认LDF文件里的内容,存储器段名字的限制会有所不同。如图1-10所示为一个SHARC C程序运行之后存储器映射的例子。
图1-10 运行一个SHARCC程序之后的存储器映射例子
6.归档器
VisualDSP++归档器(elfar.exe)可以将目标文件组合到库文件里作为工程开发的可重用资源,链接器将从库文件中搜索其他对象要引用的例行程序(库成员)并将它们链接到可执行程序中。VisualDSP++可以创建一个库文件作为一个工程的输出。可以通过VisualDSP++或命令行运行归档器,如果要修改或显示库文件的内容(或对其执行其他操作),则必须从命令行运行归档器。
7.分割器
分割器(elfspl21k.exe)用于处理可执行文件从而提供非引导可编程只读存储器(PROM)映像文件,这些文件是从处理器的外部存储器中执行的。分割器的主要输出是一个PROM文件,带有如下扩展名:
(1).s_#、.h_#和.stk(SHARC处理器);
(2).ldr(Blackfin和TigerSHARC处理器)。
对于TigerSHARC处理器,分割器的输出是32位的;对于SHARC处理器,分割器的输出是32位、40位、48位或64位的。要指定分割器选项,选择“Project→Project Options”选项,然后在树控件中,单击“Split”页(或“Splitter”子页)。分割器术语定义如下。
非引导的PROM映像文件 分割器的输出,由PROM文件构成,不能用于引导-加载一个系统。
分割器 分割器应用程序,如“elfspl21k.exe”,包含于软件中。
8.加载器
除了加载器核,加载器(elfloader.exe)还通过处理可执行文件来产生可引导-加载的文件,加载器输出文件(.ldr)使处理器可以从一个外部设备(主机或ROM)进行引导。注意,加载器创建的是从内部存储器执行的程序,而分割器创建的是从外部存储器中执行的程序。要指定加载器选项,选择“Project→Project Options”选项,再打开“加载”页。加载器术语定义如下。
引导核 执行目标上存储器初始化的可执行文件。
可引导-加载文件 加载器的输出文件(.ldr),它包含了引导加载器和格式化的系统配置,是一个可引导的映像文件。
引导加载 加载引导加载器、初始化系统存储器和开始执行目标上应用程序的过程。
加载器 加载器应用程序,如“elfloader.exe”,包含在软件中。