1.1 建立一个工程
在 ADS 集成开发环境中,点 File->New,打开如图所示窗口:
可以看到有 7 种工程类型可以选择:
ARM Excuteable Image:用于由 ARM 指令的代码生成一个 ELF 格式的可以执行映象文件。
ARM Object Library:用于由 ARM 指令的代码生成一个 armar 格式的目标文件库。
Empty Project:用于创建一个不包含任何库或者源文件的工程。
Makefile Importer Wizard:用于将 Visual C 的 nmake 或者 GNU make 文件转入到CodeWarrior IDE 工程文件。
Thumb ARM Excutable Image:用于由 ARM 指令和 Thumb 指令的混和代码生成一个可执行的 ELF 格式的映象文件。
Thumb Excutable image:用于由 Thumb 指令创建一个可执行的 ELF 格式的映象文件。
Thumb Object Library:用于由 Thumb 指令的代码生成一个 armar 格式的目标文件库。
我们在这里选择 ARM Executable Image,在“Project name:”中输入工程文件名,本例为“myled”,点击“Location:”文本框的“Set”按钮,浏览选择想要保存该工程的路径(本例为“D:work”),将这些设置好之后,点击“确定”,即可创建一个新的名为 myled 的工程。
这个时候会出现 myled.mcp 窗口,如图所示,同时会在 D:work 目录下创建一个工程目录 myled,而 myled.mcp 会出现在“D:workmyled”目录中。
对于本例,我们将已经准备好的源文件及其目录 (位于光盘的“非操作系统示例代码myled”文件夹中。下载地址:https://pan.baidu.com/s/1PSOw3HHGSbPNiHkeKyJqsQ密码:vc1x)一起复制到 myled 工程目录,如图
然后在 myled.mcp 项目窗口中,点鼠标右键或者 ADS 菜单 Project->Add Files…,如图开始添加该项目索需要的源代码。
点击“打开”按钮确定,这时会跳出如下图所示的提示选择窗口
这里请注意,我们在新建一个工程时,ADS 默认的 target 时 DebugRel,另外还有两个可用的 target,分别为 Realse 和 Debug,它们的含义分别为:
DebugRel:使用该目标选项,在生成目标的时候,会为每一个源文件生成调试信息。
Debug:使用该目标选项,在生成目标的时候,会为每一个源代码生成最完整的调试信息。
Release:使用该目标选项,在生成目标的时候,不会生成任何调试信息。
在本例中,我们使用默认的 DebugRel 选项。然后把 main.c 也加入到 myled.mcp 项目工程:
到目前为止,一个完整的工程就已经建立了,下面我们开始对该工程进行编译和链接的配置。
1.2 编译和链接工程
在进行编译和链接之前,首先需要对生成的目标进行配置,点 Edit 菜单,选择“DebugRelSetting…”(注意:这个选项会因为用户选择的不同目标而有所不同),出现如图所示的设置窗口。
这里的设置有很多,我们主要介绍最常用的一些选项。
- Target Setting
Target Name 文本框显示了当前的目标设置。
Linker 选项为用户提供了要使用的连链接器,在这里选择默认的 ARM Linker,使用该链接器,将使用 armlink 链接编译器和汇编器生成相应的工程目标文件。
在 Linker 设置中,还有两个可选项,None 代表不对生成的各个源代码目标文件进行链接,ARM Librarian 表示将编译或者汇编得到的目标文件转换为 ARM 库文件,对于本例,使用默认的链接器 ARM Linker。
Pre-Linker:目前 ADS 并不支持该选项。
Post-Linker:选择在链接完成后,还要对输出文件进行的操作。因为在本例中,希望生成一个可以烧写到 Flash 中去的二进制代码,所以在此选择 ARM fromELF,表示在链接生成映象文件后,再调用 fromELF 命令将含有调试信息的 ELF 格式的映象文件转换为其他格式的文件。
Target Setting 选择最后设置如图所示:
-
Language Settings
因为在本例中包含汇编代码,所有要用到汇编器,点接选择 ARM Assembler,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armasm,默认的 ARM 体系结构是 ARM7TDMI,在此要改为 ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:
本例中还包含了 C 语言代码,因此还需要设置 ARM C Compiler 选项,点接选择 ARM C Compiler,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armcc,默认的 ARM 体系结构是 ARM7TDMI,在此要改为 ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:
细心的读者可能会注意到,在设置框的右下脚,当对某项设置进行了修改,该行中的某个选项就会发生相应的改动,实际上,这行文字显示的就是相应的编译或者链接选项,由于有了 CodeWarrior,开发人员可以不用再去产科繁多的命令行选项,只要在界面中选择或者撤销某个选项,软件就会自动生成相应的代码,该命令框为习惯在 DOS 下键入命令行的用户提供了极大的方便。
-
Linker 设置
提示:如果您对 ADS 设置不熟悉,可以使用我们缺省的项目文件,以下部分仅供参考。点接选择 ARM Linker,在右侧出现相应的设置选项,我们在此详细介绍这些设置框,因为这些选项对最终生成的文件有着直接的影响。在标签 Output 中,Linktype 中提供了三种链接方式。Partial 方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple 方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的 ELF 格式的目标文件,使用的是链接器中指定的地址映象方式。Scattered 方式使得链接器要根据 scatter 格式文件指定的地址映象,生成复杂的 ELF 格式的映象文件,这个选项一般很少用到。
在本例中,我们选择使用 Simple 方式,这里有一些设置:
RO Base:这个文本框设置包含 RO 段的加载域和运行域为同一个地址,默认是 0x8000。这里用户要根据自己的硬件实际 SDRAM 地址空间来修改这个地址,保证这里填写的地址,是程序运行时,SDRAM 地址空间所能到达的范围,针对本目标板,SDRAM 的空间范围是 0x3000000-0x34000000,因此这里设置为 0x30000000。
RW Base:这个文本框设置了包含 RW 和 ZI 输出段的运行域地址。如果选中 split 选项,链接器生成的映象文件将包含两个加载域和两个运行域,此时在 RW Base 中所输入的地址为包含 RW 和 ZI 输出段的域设置了加载域和运行域地址。
Ropi:选中这个设置将告诉链接器使包含有 RO 输出段的运行域位置无关。使用这个选项,链接器将保证下面的操作:检查各段时间的重寻址是否有效;确保任何由 armlink 自身生成的代码是只读位置无关的。
Rwpi:选中该选项将会告诉链接器使包含 RW 和 ZI 输出段的运行域无关。如果这个选项没有被选中,域就标识为绝对。每一个可写的输入段必须是和读写位置无关的。如果这个选项被选中,链接器将进行下面的操作:
检查可读/写属性的运行域的输入段是否设置了位置无关属性;检查在各段之间的重地址是否有效;在 Region$$Table 和 ZISection$$Table 中添加基于静态存储器 sb 的选项。
该选项要求 RW Base 有值,如果没有给他指定数值的话,默认为 0。
Split Image:选择这个选项把包含 RO 和 RW 的输出段的加载域分成 2 各加载域,一个是包含 RO 输出段的域,一个是包含 RW 输出段的域。
这个选项要求 RW Base 有值,如果没有给 RW Base 选项的值,则默认是 0。
Relocatable:选择这个选项保留了映像文件的重寻址偏移量。这些偏移量为程序加载器提供了有用信息。在 Options 选项中,需要读者引起主义的是 Image entry point 文本框。它指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该地址处执行。如果需要,用户可以在这个文本框中输入下面格式的入口点:
入口点地址:这是一个数值,例如 -entry 0x0
符号:该选项指定映像文件的入口点为该符号所代表的地址处,比如: -entry int_handler ,如果该符号有多处定义存在,armlink 将产生出错信息。
offset+object(section):该选项指定在某个目标文件的段的内部的某个偏移量处为映像文件的入口地址,例如:-entry8+startup(startuoseg)在此处指定的入口点用于设置 ELF 映像文件的入口地址。需要引起注意的是,这里不可以用符号 main 作为入口点地址符号,否则将会出现类似“Image dose not have an entry point(Not specified or not set due to multiple choice)”的错误信息。在 Layout 选项中,需要设置 asm.o 目标文件中的 Init 为整个文件的入口点。关于 ARM Linker 的设置还很多,对于想进一步深入了解的读者,可以查看帮助文件,都有很详细的介绍。
在 Linker 下还有一个 ARM fromELF:
fromELF 是一个实用工具,它实现将链接器,编译器和汇编器的输出代码进行格式转换的功能。例如,将 ELF 格式的可执行映像文件转换成可以烧写到 ROM 的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小,符号和字符串表以及重寻址等信息。只有在 Target 设置中选择了 Post-linker,才金可以使用该选项。在 Output format 下拉框中,为用户提供了多种可以转换的目标格式,本例选择 Plainbinary,这是一个二进制格式的可执行文件,可以被烧写到目标板的 Flash 中。
在 Output file name 文本域输入期望生成的输出文件存放的路径,或通过点击 Choose...按钮从文件对话框中选择输出文件。如果在这个文本域不输入路径名,则生成的二进制文件存放在工程所在的目录下。进行好这些相关的设置后,以后在对工程进行 make 的时候, CodeWarrior IDE 就会在链接完成后调用 fromELF 来处理生成的映像文件。
对于本例的工程而言,到此,就完成了 make 之前的设置工作了。
点击CodeWarrior IDE 的菜单Project 下的make 菜单,就可以对工程进行编译和链接了。编译链接结果如图:
最后在“D:workmyledmyled_DataDebugRel”目录下生成myled.bin,同时还有myled.axf文件,它是用于调试的,如图: