您的位置:首页 > 其它

第三章 裸机_第一个裸机程序(中)

2014-01-08 09:25 211 查看
1 使用ADS 创建LED
工程
本节通过一个简单的具体实例,介绍如何使用 ADS
集成开发环境。包括如何创建一个新的工程,如何配置编译选项,并编译生成可以直接烧写到Flash
中的bin 格式二进制可执行文件。
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:\work\myled”目录中。

对于本例,我们将已经准备好的源文件及其目录 (位于光盘的“非操作系统示例代码\myled”文件夹中)
一起复制到myled 工程目录。
然后在 myled.mcp 项目窗口中,点鼠标右键或者ADS
菜单Project->Add Files…,开始添加该项目所需要的源代码。



点击“打开”按钮确定,这时会跳出如下图所示的提示选择窗口



这里请注意,我们在新建一个工程时,ADS
默认的target 时DebugRel,另外还有两个
可用的target,分别为Realse
和Debug,它们的含义分别为:
DebugRel:使用该目标选项,在生成目标的时候,会为每一个源文件生成调试信息。
Debug:使用该目标选项,在生成目标的时候,会为每一个源代码生成最完整的调试信息。
Release:使用该目标选项,在生成目标的时候,不会生成任何调试信息。
在本例中,我们使用默认的 DebugRel
选项。
然后把 main.c 也加入到myled.mcp
项目工程,到目前为止,一个完整的工程就已经建立了。

1.2 编译和链接工程
在进行编译和链接之前,首先需要对生成的目标进行配置,点Edit
菜单,选择“DebugRel Setting…”(注意:这个选项会因为用户选择的不同目标而有所不同),出现如图所示的设置窗口。
这里的设置有很多,我们主要介绍最常用的一些选项。
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
选项,点接选择ARMC Compiler,在右侧出现相应的设置选项,在ADS
集成开发环境中用的汇编器是armcc,默认的ARM
体系结构是ARM7TDMI,在此要改为ARM920T,字节顺序默认是小端模式,其他设置,采用默认值即可,如图所示:

细心的读者可能会注意到,在设置框的右下角,当对某项设置进行了修改,该行中的某个选项就会发生相应的改动,实际上,这行文字显示的就是相应的编译或者链接选项,由于有了CodeWarrior,开发人员可以不用再去产科繁多的命令行选项,只要在界面中选择或者撤销某个选项,软件就会自动生成相应的代码,该命令框为习惯在DOS
下键入命令行的用户提供了极大的方便。
Linker
设置
点接选择 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 下拉框中,为用户提供了多种可以转换的目标格式,本例选择Plain
binary,这是一个二进制格式的可执行文件,可以被烧写到目标板的Flash
中。在 Output file name 文本域输入期望生成的输出文件存放的路径,或通过点击Choose...按钮从文件对话框中选择输出文件。如果在这个文本域不输入路径名,则生成的二进制文件存放在工程所在的目录下。进行好这些相关的设置后,以后在对工程进行make
的时候,CodeWarrior IDE 就会在链接完成后调用fromELF
来处理生成的映像文件。对于本例的工程而言,到此,就完成了 make
之前的设置工作了。

点击 CodeWarrior IDE
的菜单Project 下的make
菜单,就可以对工程进行编译和链接了。编译链接结果如图:



最后在“D:\work\myled\myled_Data\DebugRel”目录下生成myled.bin,同时还有myled.axf文件,它是用于调试的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: