集成环境: - ADS1.2
( 下载地址: http://esoft.mcu123.com/MCU123_temp_0080309@/ARM/ads1.2.rar)
三、 正文。
本节通过一个简单的具体实例,介绍如何使用 ADS 集成开发环境。包括如何创建一个
新的工程,如何配置编译选项,并编译生成可以直接烧写到 Flash 中的 bin 格式二进制可执
行文件和用于 JLINK 仿真调试的 axf 文件。
1. 建立一个工程
在 ADS 集成开发环境中,点 File->New ,打开如图所示窗口:
[attachment=492]
可以看到有 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 :”中输入工程文件名,本例
为“ test ”,点击“ Location :”文本框的“ Set ”按钮,浏览选择想要保存该工程的路径 ( 本
例为“ D:/test ” ) ,将这些设置好之后,点击“确定”,即可创建一个新的名为 test 的工程。这个时候会出现test.mcp 窗口,如图所示,同时会在“ D:/Backup/ 我的文档 /MCU/ARM9/STUDY/ 点灯 _ 汇编 / 学习 / ” 目录下创
建一个工程目录 test ,而 test.mcp 会出现在“ D:/test/test ”目录中。
[attachment=494]
[attachment=494]
2. 添加代码。
这里我们就不编写源代码了,我选择了开发板测试用的源代码。该源代
码已经被拷贝到本文档附带的文件夹里。分别是 inc 、 LCD 、 src 、 usb 四个文件夹。如下图:
[attachment=495]
然后在 test.mcp 项目窗口中,点鼠标右键或者 ADS 菜单 Project->Add Files …,如图开始
添加该项目索需要的源代码。
[attachment=496]
你也可以直接把文件夹拖进 test.mcp 项目窗口中(建议)。
如果在点鼠标右键或者 ADS 菜单 Project->Add Files …添加代码过程中,如果出现一个错误对话框,可以不用理会,原因是你添加了一个不需要添加的代码,在这里不讨论代码,就不详细解释原因了,直接拖拽文件夹不会有这个错误,所以建议大家还是直接拖拽文件夹比较好。
错误对话框如图:
[attachment=497]
在添加完代码之后,会弹出这个对话框:
[attachment=525]
这里请注意,我们在新建一个工程时, ADS 默认的 target 时 DebugRel ,另外还有两个可用
的 target ,分别为 Realse 和 Debug ,它们的含义分别为:
DebugRel :使用该目标选项,在生成目标的时候,会为每一个源文件生成调试信息。
Debug :使用该目标选项,在生成目标的时候,会为每一个源代码生成最完整的调试信息。
Release :使用该目标选项,在生成目标的时候,不会生成任何调试信息。
在本例中,我们使用默认的 DebugRel 选项。点去 Realse 和 Debug 两个选项。如图:
[attachment=498]
完成添加代码后如图所示:
[attachment=499]
[attachment=500]
[attachment=501]
[attachment=502]
[attachment=503]
到目前为止,一个完整的工程就已经建立了,下面我们开始对该工程进行编译和链接的配置 3. 配置。
在进行编译和链接之前,首先需要对生成的目标进行配置,点 Edit 菜单,选择
“ DebugRelSetting …”(注意:这个选项会因为用户选择的不同目标而有所不同),出现如图:
[attachment=504]
所示的设置窗口。
这里的设置有很多,我们主要介绍最常用的一些选项。
· 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 选择最后设置如图所示:
[attachment=505]
· Language Settings
因为在本例中包含汇编代码,所有要用到汇编器,点接选择 ARM Assembler ,在右侧出
现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armasm ,默认的 ARM 体系结构
是 ARM7TDMI ,在此要改为 ARM920T (不同的 CPU ,这个选项是不同的),字节顺序默认
是小端模式,其他设置,采用默认值即可,如图所示:
本例中还包含了 C 语言代码,因此还需要设置 ARM C Compiler 选项,点接选择 ARM C
Compiler ,在右侧出现相应的设置选项,在 ADS 集成开发环境中用的汇编器是 armcc ,默认
的 ARM 体系结构是 ARM7TDMI ,在此要改为 ARM920T (不同的 CPU ,这个选项是不同的),
字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:
[attachment=526]
细心的读者可能会注意到,在设置框的右下脚,当对某项设置进行了修改,该行中的某个选
项就会发生相应的改动,实际上,这行文字显示的就是相应的编译或者链接选项,由于有了 CodeWarrior ,开发人员可以不用再去产科繁多的命令行选项,只要在界面中选择或者撤销
某个选项,软件就会自动生成相应的代码,该命令框为习惯在 DOS 下键入命令行的用户
提供了极大的方便。
· Linker 设置
提示:如果您对 ADS 设置不熟悉,直接跳过说明,按照图片设置即可,以下部分仅供参考。
点接选择 ARM Linker ,在右侧出现相应的设置选项,我们在此详细介绍这些设置框,
因为这些选项对最终生成的文件有着直接的影响。
在标签 Output 中, Linktype 中提供了三种链接方式。
Partial 方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进
一步链接时的输入文件。
Simple 方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的 ELF 格
式的目标文件,使用的是链接器中指定的地址映象方式。
Scattered 方式使得链接器要根据 scatter 格式文件指定的地址映象,生成复杂的 ELF 格式的
映象文件,这个选项一般很少用到。
[attachment=527]
[attachment=528]
在本例中,我们选择使用 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 为整个文件的入口点。
这里关于 layout 选项卡的选择对于新手有些难度,也容易忽略,我们在设置时,很容易把 Object/Symbol 选项,和Section 选择忘记填写,或者我们不知道填写哪什么内容。
这里 Object/Symbol 是程序的入口点,在你代码初始化程序进入的那个点,这里我们查看 src 文件夹里的2440init.s 文件,找到如图的位置:
可以看到 ENTRU ,那就是程序的入口,我们在 Object/Symbol 里填写文件名 2440init.o , Section 一栏里我们填写 Init 。这步很重要,负责你的程序就会运行不了!!!至于为什么,这里不讲了。
关于 ARM Linker 的设置还很多,对于想进一步深入了解的读者,可以查看帮助文件,
都有很详细的介绍。
该选项在本例子中的配置:
[attachment=530]
在 Linker 下还有一个 ARM fromELF :
fromELF 是一个实用工具,它实现将链接器,编译器和汇编器的输出代码进行格式转换的
功能。例如,将 ELF 格式的可执行映像文件转换成可以烧写到 ROM 的二进制格式文件;
对输出文件进行反汇编,从而提取出有关目标文件的大小,符号和字符串表以及重寻址等信
息。只有在 Target 设置中选择了 Post-linker ,才可以使用该选项。
在 Output format 下拉框中,为用户提供了多种可以转换的目标格式,本例选择
Plainbinary ,这是一个二进制格式的可执行文件,可以被烧写到目标板的 Flash 中。
在 Output file name 文本域输入期望生成的输出文件存放的路径,或通过点击 Choose... 按钮从文件对话框中选择输出文件。如果在这个文本域不输入路径名,则生成的二进制文件存放在工程所在的目录下。进行好这些相关的设置后,以后在对工程进行 make 的时候,
CodeWarrior IDE 就会在链接完成后调用 fromELF 来处理生成的映像文件。
对于本例的工程而言,到此,就完成了 make 之前的设置工作了。
点击“ OK ”后,我们回到了 CodeWarrior IDE 界面:
4. 编译和链接。
点击 CodeWarrior IDE 的菜单 Project 下的 make 菜单,就可以对工程进行编译和链接了。
最后在“ D:/test/test/test_Data/DebugRel ”目录下生成 test.bin ,同时还有 test.axf 文件,它是用于调试的,如图: