第4章ARM系统硬件设计基础2第4章ARM系统硬件设计基础嵌入式软件系统的体系结构硬件应用层驱动层操作系统层中间件层板级初始化FLASH驱动RTC/定时器驱动串口驱动以太网驱动LCD驱动键盘驱动其他驱动内核TCP/IP网络系统文件系统嵌入式GUI电源管理嵌入式CORBA嵌入式JAVA嵌入式DCOM面向应用领域的中间件应用任务1应用任务2……应用任务n3第4章ARM系统硬件设计基础主要内容1324ADS1.2集成开发环境简介基于ARM的汇编语言程序设计基于ARM的硬件启动程序基于ARM的C语言与汇编语言混合编程5印制电路板制作简介4第4章ARM系统硬件设计基础4.1ADS1.2集成开发环境简介ADS的英文全称为ARMDeveloperSuite,是ARM公司推出的新一代ARM集成开发工具。ADS由六个部分组成,分别是:代码生成工具集成开发环境调试器指令集模拟器ARM开发包ARM应用库5第4章ARM系统硬件设计基础4.1.1ADS1.2集成开发环境下工程的创建使用ADS创建工程的步骤:新建工程“File|New…”设置目标及其参数“Edit|DebugSettings…”向工程中添加文件“Project|AddFiles”6第4章ARM系统硬件设计基础利用ADS开发应用程序工程将所有的源码文件组织在一起,并能够决定最终生成文件存放的路径、输出的格式等。在CodeWarrior中新建一个工程的方法有两种,可以在工具栏中单击“New”按钮,也可以在“File”菜单中选择“New…”菜单。这样就会打开一个如图3.4所示的对话框。在这个对话框中为用户提供了7种可选择的工程类型。ARMExecutablImage:用于由ARM指令代码生成一个ELF格式的可执行映像文件;ARMObjectLibrary:用于由ARM指令代码生成一个armar格式的目标文件库;EmptyProject:用于创建一个不包含任何库或源文件的工程;MakefileImporterWizard:用于将VisualC的nmake或GNUmake文件转入到CodeWarriorIDE工程文件;ThumbARMExecutableImage:用于由ARM指令和Thumb指令的混合代码生成一个可执行的ELF格式的映像文件;ThumbExecutableimage:用于由Thumb指令创建一个可执行的ELF格式的映像文件;ThumbObjectLibrary:用于由Thumb指令的代码生成一个armar格式的目标文件库。7第4章ARM系统硬件设计基础8第4章ARM系统硬件设计基础9第4章ARM系统硬件设计基础10第4章ARM系统硬件设计基础#includestdlib.h#includestring.h#includedef.h#includeoption.h#include2410addr.h#include2410lib.h#include2410slib.h#includemmu.h#includeuart0.hvoidIsr_Init(void);//==========================voidMain(void){MMU_Init();ChangeClockDivider(1,1);ChangeMPllValue(0xa1,0x3,0x1);Port_Init();Isr_Init();Uart_Init(0,115200);Uart_Select(0);while(1){Led_Display(15);Delay(1000);Led_Display(1);Delay(1000);Led_Display(2);Delay(1000);Led_Display(4);Delay(1000);Led_Display(8);Delay(1000);Uart_Printf(\n\nTestProgram.FCLK=%dHz\n\n,FCLK);}}voidIsr_Init(void){rINTMOD=0x0;rINTMSK=BIT_ALLMSK;rINTSUBMSK=BIT_SUB_ALLMSK;}11第4章ARM系统硬件设计基础函数MMU_Init()在mmu.h中定义,完成内存管理单元的初始化。函数ChangeClockDivider()和函数ChangeMPllValue()在2410lib.h中定义,用来设置系统时钟。Port_Init()也在2410lib.h中定义,以初始化通用I/O口。Isr_init()用来设置中断。Uart_Init()和Uart_Select()在uart0.h中定义,初始化串口以方便与主机的通信。Led_Display()实现LED的闪烁,Delay()为一延时程序,均在2410lib.h中定义。Uart_Printf()实现与主机的通信。该段代码在调用初始化函数、完成MMU单元、端口、系统时钟等初始化后,在while循环中实现4个LED循环显示功能,并通过超级终端显示FCLK时钟信息。在建立好一个工程时,默认的Target是DebugRel,还有另外两个可用的Target,分别为Release和Debug,这3个target的含义分别说明如下。DebugRel:使用该目标,在生成目标的时候,会为每一个源文件生成调试信息;Debug:使用该目标为每一个源文件生成最完全的调试信息;Release:使用该目标不会生成任何调试信息。到目前为止,一个完整的工程已经建立,下面应该对工程进行编译和链接工作。12第4章ARM系统硬件设计基础编译和链接工程在进行编译和链接前,首先讲述一下如何进行生成目标的配置。单击“Edit”菜单,出现Edit菜单,选择“DebugRelSettings…”,如图3.9所示。图3.9Edit菜单13第4章ARM系统硬件设计基础单击“DebugRelSettings…”后,出现如图3.10所示的对话框。这个对话框中的设置很多,在这里只介绍一些最常用的设置选项,读者若对其他未涉及的选项感兴趣,可以查看相应的帮助文件。图3.10DebugRelSettings对话框1.Target设置选项TargetName文本框显示了当前的目标设置。Linker选项供用户选择要使用的链接器。Pre-linker:目前CodeWarriorIDE不支持该选项。Post-Linker:选择在链接完成后,还要对输出文件进行的操作。14第4章ARM系统硬件设计基础2.LanguageSettings因为本例中包含汇编源代码,所以要用到汇编器。首先看ARM汇编器。这个汇编器实际上就是armasm,ARM体系结构是ARM920T,字节顺序默认就是小端模式。在其他编译器的设置中,ARM体系结构均为ARM920T。细心的读者可能会注意到,在设置框的右下角,当对某项设置进行修改后,该行中的某个选项就会发生相应的改动,如图3.11所示。事实上,这行文字显示的是相应的编译或链接选项,由于有了CodeWarrior,开发人员可以不用再去查看繁多的命令行选项,只要在界面中选中或撤销某个选项,软件就会自动生成相应的代码,这项功能为那些不习惯在DOS下键入命令行的用户提供了极大的方便。图3.11命令行工具选项设置15第4章ARM系统硬件设计基础3.Linker设置鼠标选中ARMLinker,出现如图3.12所示的对话框。这里详细介绍该对话框的主要标签页选项,因为这些选项对最终生成的文件有着直接的影响。在标签页Output中,Linktype中提供了3种链接方式。Partial方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple方式是默认的链接方式,也是使用最频繁的链接方式,它链接生成简单的ELF格式的目标文件,使用的是链接器选项中指定的地址映射方式。Scattered方式使得链接器根据scatter格式文件中指定的地址映射,生成复杂的ELF格式的映像文件。在一般情况下,该选项使用得不太多。图3.12链接器设置16第4章ARM系统硬件设计基础在选中Simple方式后,会出现Simpleimage选项。(1)ROBase:这个文本框设置使包含有RO段的加载域和运行域为同一个地址,默认是0x8000。用户要根据自己硬件的实际SDRAM的地址空间来修改这个地址,保证在这里填写的地址是程序运行时,SDRAM地址空间所能覆盖的地址。(2)RWBase:这个文本框设置了包含RW和ZI输出段的运行域地址。如果选中split选项,链接器生成的映像文件将包含两个加载域和两个运行域,此时,在RWBase中所输入的地址为包含RW和ZI输出段的域设置了加载域和运行域地址。(3)Ropi:选中这个设置将告诉链接器,使包含有RO输出段的运行域位置无关。使用这个选项,链接器将保证下面的操作。检查各段之间的重定址是否有效;确保任何由armlink自身生成的代码是只读位置无关的。(4)Rwpi:选中该选项将会告诉链接器,使包含RW和ZI输出段的运行域位置无关。该选项要求RWBase有值,如果没有给它指定数值的话,默认为0值。如果这个选项没有被选中,域就标识为绝对。每一个可写的输入段必须是读写位置无关的。(5)SplitImage:选择这个选项把包含RO和RW输出段的加载域分成2个加载域:一个是包含RO输出段的域,一个是包含RW输出段的域。这个选项要求RWBase有值,如果没有给RWBase选项设置,则默认值为RWBase0。(6)Relocatable:选择这个选项将保留映像文件的重定址偏移量。这些偏移量为程序加载器提供了有用信息。在Options选项中,需要读者引起注意的是Imageentrypoint文本框。该文本框用来指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该地址去执行。17第4章ARM系统硬件设计基础18第4章ARM系统硬件设计基础在Linker下还有一个ARMfromELF,如图所示。fromELF就是在3.3.1节中介绍的一个实用工具,它将链接器、编译器或汇编器的输出代码进行格式转换。例如,将ELF格式的可执行映像文件转换成可以烧写到ROM的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小、符号和字符串表,以及重定址等信息。只有在Target设置中选择了Post-linker,才可以使用该选项。在Outputformat下拉框中,为用户提供了多种可以转换的目标格式,本例选择Plainbinary,这是一个二进制格式的可执行文件,可以被烧写到目标板的Flash中。在Outputfilename文本框输入希望生成的输出文件存放的路径,或通过单击“Choose...”按钮从文件对话框中选择输出文件。如果不输入路径名,则生成的二进制文件存放在工程所在的目录下。19第4章ARM系统硬件设计基础4.1.2ADS1.2集成开发环境下进行仿真和调试的方法在Codewarrior中,如果工程编译成功,将产生一个后缀为.axf的映像文件,接下来就可以使用AXDDebugger进行调试。常用调试按钮20第4章ARM系统硬件设计基础用AXD进行代码调试AXD是ADS软件中独立于CodeWarriorIDE的图形软件。打开AXD软件,默认打开的目标是ARMulator,这也是在不具备仿真器的条件下调试时最常用的一种调试工具。为了更贴近实际硬件,需要选择Multi-ICEServer作为仿真器。本节主要结合Multi-ICEServer介绍在AXD中进行代码调试的方法和过程,使读者对AXD的调试有初步的了解。在使用AXD进行代码调试之前,首先要保证Multi-ICE的正常连接,这样才能正常进入AXD环境。3.4.1调试架构3.4.2Multi-ICE的配置3.4.3使用AXD进行代码调试3.4.4生成.bin文件21第4章ARM系统硬件设计基础调试架构22第4章ARM系统硬件设计基础调试主机一般是一台运行调试软件的计算机,运行有AR