Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 嵌入式系统的设计方法 3.1 嵌入式系统的总体结构 3.2 嵌入式系统开发过程 3.3 ADS集成开发环境的使用

Similar presentations


Presentation on theme: "第3章 嵌入式系统的设计方法 3.1 嵌入式系统的总体结构 3.2 嵌入式系统开发过程 3.3 ADS集成开发环境的使用"— Presentation transcript:

1 第3章 嵌入式系统的设计方法 3.1 嵌入式系统的总体结构 3.2 嵌入式系统开发过程 3.3 ADS集成开发环境的使用
第3章 嵌入式系统的设计方法 3.1 嵌入式系统的总体结构 3.2 嵌入式系统开发过程 3.3 ADS集成开发环境的使用 3.4 用AXD进行代码调试

2 3.1 嵌入式系统的总体结构 在不同的应用场合,嵌入式系统呈现出的外观和形式各不相同。但通过对其内部结构进行分析,可以发现,一个嵌入式系统一般都由嵌入式微处理器系统和被控对象组成,如图3.1所示。其中嵌入式微处理器系统是整个系统的核心,由硬件层、中间层、软件层和功能层组成。被控对象可以是各种传感器、电机等,可以接受嵌入式微处理器系统发出的控制命令,执行所规定的操作或任务。 第3章 嵌入式系统的设计方法

3 硬件层由嵌入式微处理器、外围电路和外设组成。在一片嵌入式微处理器基础上增加电源电路、复位电路、调试接口和存储器电路,就构成一个嵌入式核心控制模块。其中操作系统和应用程序都可以固化在ROM或者Flash中。为方便使用,有的模块在此基础上增加了LCD、键盘、USB接口,以及其他一些功能的扩展电路。 嵌入式系统的硬件层是以嵌入式处理器为核心的,最初的嵌入式处理器都是为通用目的而设计的。后来随着微电子技术的发展出现了ASIC(Application specific integrated circuit,专用的集成电路),ASIC是一种为具体任务而特殊设计的专用集成电路。由于ASIC在设计过程中进行了专门优化,其性能、性价比都非常高。采用ASIC可以减少系统软硬件设计的复杂度,降低系统成本。有的嵌入式微处理器利用ASIC来实现,但ASIC的前期设计费用非常高,而且ASIC一旦设计完成,就无法升级和扩展,一般只有在一些产量非常大的产品设计中才考虑使用ASIC。 近年来,各种PLD(Programmable Logic Device,可编程逻辑器件)的出现,改变了硬件设计方法,出现了“可重构计算”的概念。通过改写PLD,允许在不改变硬件结构的情况下,实现不同的接口和功能。20世纪80年代中期以后出现了FPGA(Field-programmable gate array,现场可编程门阵列)器件,这是是一种大规模可编程逻辑器件,具有保密性好、体积小、重量轻、可靠性高等一系列ASIC的优点。FPGA的出现使得一个电子系统可以仅仅由三种标准模块构成,即微处理器、存储器和可编程逻辑器件。前两种模块都已标准化,系统中大量的控制逻辑由FPGA实现。这使得硬件的设计更具有灵活性和扩展性,并降低了后续产品开发的成本。 第3章 嵌入式系统的设计方法

4 硬件层与软件层之间为中间层,也称为BSP(Board Support Package,板级支持包),将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关,一般应具有相关硬件的初始化、数据的输入/输出操作和硬件设备的配置等功能。BSP是主板硬件环境和操作系统的中间接口,是软件平台中具有硬件依赖性的那一部分,主要目的是为了支持操作系统,使之能够更好地运行于硬件主板上。 纯粹的BSP所包含的内容一般说来是与系统有关的驱动程序,如网络驱动程序和系统中的网络协议有关,串口驱动程序和系统的下载调试有关,等等。离开这些驱动程序系统就不能正常工作。 软件层主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。操作系统是嵌入式应用软件的基础和开发平台,实际上是一段程序,系统复位后首先执行,相当于用户的主程序,用户的其他应用程序都建立在操作系统之上。操作系统是一个标准的内核,将中断、I/O、定时器等资源都封装起来,以方便用户使用。 操作系统的引入大大提高了嵌入式系统的功能,方便了应用软件的设计,但同时也占用了宝贵的嵌入式系统资源。一般在大型的或需要多任务的应用场合才考虑使用嵌入式操作系统。 功能层由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。功能层是面向被控对象和用户的,为了方便用户操作,往往需要具有友好的人机界面。 对于一些复杂的系统,在系统设计的初期阶段就要对系统的需求进行分析,确定系统的功能,然后将系统的功能映射到整个系统的硬件、软件和执行装置的设计过程中,这个过程称为系统的功能实现。 第3章 嵌入式系统的设计方法

5 3.2嵌入式系统开发过程 嵌入式软件的开发与传统的软件有许多共同点,它继承了许多传统软件开发的开发习惯。但由于嵌入式软件运行于特定的目标环境,与传统软件的开发又有着很大的不同。 嵌入式系统的开发特点 嵌入式系统的开发流程 调试嵌入式系统 第3章 嵌入式系统的设计方法

6 嵌入式系统的开发特点 1.采用宿主机/目标机方式
嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的。嵌入式软件以宿主机/目标机模式开发,所需要的开发环境称为交叉开发环境,分为宿主机部分和目标机部分,两者以统一的通信协议进行通信,宿主机向目标机发送命令,目标机接收、执行命令并将结果返回宿主机,从而实现两机之间的交互控制。 2.为了保证稳定性和实时性,选用RTOS开发平台 对简单系统可以用传统方法,从底层用汇编语言编写程序,利用在线仿真器(ICE)、在线调试器(ICD)等开发工具进行软件的调试。对于那些复杂的嵌入式系统,需要在优化级可控的情况下预测其运行状态,不利用实时操作系统和嵌入式系统开发平台进行开发,是很难、甚至是不可能达到预定要求的。为了合理地调度多任务、利用系统资源,用户必须选配RTOS开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保证软件质量。 3.生成代码需要固态化存储 嵌入式应用程序开发环境是PC机,但运行的目标环境却千差万别,可以是PDA,也可以是仪器设备。而且应用软件在目标环境下必须存储在非易失性存储器中,保证系统在掉电重启后仍能正常使用。所以,应用软件在开发完成以后,应生成固化版本,都固化在单片机本身或烧写到目标环境的Flash中运行。 4.软件代码具有高质量、高可靠性 第3章 嵌入式系统的设计方法

7 嵌入式系统的开发流程 嵌入式系统的应用开发是按照如图3.2所示的流程进行的,一般由5个阶段构成:需求分析、体系结构设计、硬件/软件设计、系统集成和代码固化。各个阶段之间往往要求不断地反复和修改,直到完成最终完成设计目标。 第3章 嵌入式系统的设计方法

8 把系统中的软件、硬件集成在一起,进行调试,发现并改进单元设计过程中的错误。 5.代码固化
1.需求分析阶段 在需求分析阶段需要分析系统的需求,系统的需求一般分功能需求和非功能需求两方面。根据系统的需求,确定设计任务和设计目标,并提炼出设计规格说明书,作为正式指导设计和验收的标准。 2.体系结构设计 需求分析完成后,根据提炼出的设计规格说明书,进行体系结构的设计。系统的体系结构描述了系统如何实现所述的功能和非功能需求,包括对硬件、软件的功能划分,以及系统的软件、硬件和操作系统的选型等。 3.硬件/软件设计 基于体系结构,对系统的软、硬件进行详细设计。对于一个完整的嵌入式应用系统的开发,应用系统的程序设计是嵌入式系统设计一个非常重要的方面,程序的质量直接影响整个系统功能的实现,好的程序设计可以克服系统硬件设计的不足,提高应用系统的性能,反之,会使整个应用系统无法正常工作。 4.系统集成 把系统中的软件、硬件集成在一起,进行调试,发现并改进单元设计过程中的错误。 5.代码固化 嵌入式软件开发完成以后,大多数要在目标环境的非易失性存储器中运行,程序写入到Flash中固化,保证每次运行后下一次运行无误,所以嵌入式软件开发与普通软件开发相比,增加了固化阶段。 第3章 嵌入式系统的设计方法

9 调试嵌入式系统 调试是任何项目开发过程中必不可少的一部分,特别是在软硬件结合非常紧密的嵌入式系统开发中。一般来说,大多数的调试工作是在RAM中进行的,只有当程序完成并能运行后才切换到ROM上。嵌入式系统的调试有多种方法,可分为模拟器方式、ICE(In-Circuit Emulator,在线仿真器)方式、ICD(In-Circuit Debugger,在线调试器)方式和监控器方式。 1.模拟器方式 调试工具和待调试的嵌入式软件都在主机上运行,通过软件手段模拟执行为某种嵌入式处理器编写的源程序。简单的模拟器可以通过指令解释方式逐条执行源程序,分配虚拟存储空间和外设,进行语法和逻辑上的调试。 2.在线仿真器方式 在线仿真器ICE是一种完全仿造调试目标CPU设计的仪器,目标系统对用户来说是完全透明的、可控的。仿真器与目标板通过仿真头连接,与主机有串口、并口、以太网口或USB口等连接方式。该仿真器可以真正地运行所有的CPU动作,并且可以在其使用的内存中设置非常多的硬件中断点,可以实时查看所有需要的数据,从而给调试过程带来很多便利。由于仿真器自成体系,调试时可以连接目标板,也可以不接目标板。 使用ICE同使用一般的目标硬件一样,只是在ICE上完成调试后,需要把调试好的程序重新下载到目标系统上而已。由于ICE价格昂贵,而且每种CPU都需要一种与之对应的ICE,使得开发成本非常高。 第3章 嵌入式系统的设计方法

10 主机和目标板通过某种接口(通常是串口)连接,主机上提供调试界面,被调试程序下载到目标板上运行
3.监控器方式 主机和目标板通过某种接口(通常是串口)连接,主机上提供调试界面,被调试程序下载到目标板上运行 监控程序是一段运行于目标机上的可执行程序,主要负责监控目标机上被调试程序的运行情况,与宿主机端的调试器一起完成对应用程序的调试。监控程序包含基本功能的启动代码,并完成必要的硬件初始化,等待宿主机的命令。被调试程序通过监控程序下载到目标机,就可以开始进行调试。监控器方式操作简单易行,功能强大,不需要专门的调试硬件,适用面广,能提高调试的效率,缩短产品的开发周期,降低开发成本。正因为以上原因,监控器方式才能够广泛应用于嵌入式系统的开发之中。 监控器调试主要用于调试运行在目标机操作系统上的应用程序,不适宜用来调试目标操作系统。有的微处理器需要在目标板工作正常的前提下,事先烧制监控程序,而且功能有限,特别是硬件调试能力较差。 4.在线调试器方式 使用ICD和目标板的调试端口连接,发送调试命令和接收调试信息,可以完成必要的调试功能。一般情况下,在ARM芯片的开发板上采用JTAG边界扫描口进行调试。摩托罗拉公司采用专用的BDM调试接口。 使用合适的开发工具可以利用这些接口。例如,ARM开发板,可以将JTAG调试器接在开发板的JTAG口上,通过JTAG口与ARM处理器核进行通信。由于JTAG调试的目标程序是在目标板上执行,仿真更接近于目标硬件,因此许多接口问题,如高频操作限制、电线长度的限制等被最小化了。该方式是目前采用最多的一种调试方式。 第3章 嵌入式系统的设计方法

11 3.3 ADS集成开发环境的使用 ADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0,该版本支持包括Windows和Linux在内的多种操作系统。 ADS组成介绍 命令行开发工具 利用ADS开发应用程序 编译和链接工程 第3章 嵌入式系统的设计方法

12 ADS组成介绍 1.编译器,ADS提供多种编译器,以支持ARM和Thumb指令的编译。  armcc是ARM C编译器,
 tcc是Thumb C编译器,  armcpp是ARM C++编译器,  tcpp是Thumb C++编译器,  armasm是ARM和Thumb的汇编器。 2.链接器 armlink是ARM链接器。该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。 3.符号调试器 armsd是ARM和Thumb的符号调试器。它能够进行源码级的程序调试。用户可以在用C或汇编语言写的代码中进行单步调试、设置断点、查看变量值和内存单元的内容。 4.fromELF 将ELF格式的文件转换为各种格式的输出文件,包括BIN格式映像文件、Motorola 32位S格式映像文件、Intel 32位格式映像文件和Verilog 16进制文件。FromELF命令也能够为输入映像文件产生文本信息,例如,代码和数据长度。 5.armar armar是ARM库函数生成器,它将一系列ELF格式的目标文件以库函数的形式集合在一起。用户可以把一个库传递给一个链接器以代替几个ELF文件。 第3章 嵌入式系统的设计方法

13 (1)ADS中包含有3个调试器:AXD、Armsd和ADW/ADU。
6.CodeWarrior CodeWarrior集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarrior IDE为ARM和Thumb处理器开发用C、C++或者ARM汇编语言编写的程序代码。 7.调试器 (1)ADS中包含有3个调试器:AXD、Armsd和ADW/ADU。 (2)在ARM体系中,可以选择多种调试方式:Multi-ICE(Multi-processor in-circuit emulator)、ARMulator或Angel。  Multi-ICE是一个独立的产品,是ARM公司自己的JTAG在线仿真器,不是由ADS提供的。  ARMulator是一个ARM指令集仿真器,集成在ARM的调试器AXD中,提供对ARM处理器的指令集的仿真,为ARM和Thumb提供精确的模拟。用户可以在硬件尚未做好的情况下,开发程序代码,利用模拟器方式调试。  Angel是ARM公司常驻在目标机Flash中的监控程序,只需通过RS-232C串口与PC主机相连,就可以对基于ARM架构处理器的目标机进行监控器方式的调试。 8.C和C++库 ADS提供ANSI C库函数和C++库函数,支持被编译的C和C++代码。用户可以把C库中的与目标相关的函数作为自己应用程序中的一部分,重新进行代码的实现。这就为用户带来了极大的方便,针对自己的应用程序的要求,对与目标无关的库函数进行适当的裁剪。在C库中有很多函数是独立于其他函数的,并且与目标硬件没有任何依赖关系。对于这类函数,用户可以很容易地从汇编代码中使用。 有了这些部件,用户可以为ARM系列的RISC处理器编写和调试自己的开发应用程序了。 第3章 嵌入式系统的设计方法

14 命令行开发工具 1.C和C++编译器:armcc、tcc、armcpp和tcpp,它们具有通用语法:
compiler [PCS-options] [source-language] [search-paths] [preprocessor-options] [output-format] [target-options] [debug-options] [code-generation-options] [warning-options] [additional-checks] [error-options] [source]  PCS-options:指定了要使用的过程调用标准。  source-language:指定了编译器可以接受的编写源程序的语言种类。  search-paths:该选项指定对包含的文件的搜索路径。  preprocessor-options:该选项指定预处理器的行为。  output-format:该选项指定编译器的输出格式,可以使用该项生成汇编语言输出列表文件和目标文件。  target-options:该选项指定目标处理器或ARM体系结构。  debug-options:该选项指定调试信息表是否生成,以及生成时的格式。  code-generation-options:该选项指定优化、字节顺序和由编译器产生的数据对齐格式等选项。  warning-options:该选项决定警告信息是否产生。  additional-checks:该选项指定几个能用于源码的附加检查,例如,检查数据流异常,检查没有使用的声明等。  error-options:该选项可以关闭指定的可恢复的错误,或者将一些指定的错误降级为警告。  source:该选项提供了包含有C或C++源代码的一个或多个文件名,编译器在当前路径寻找源文件和创建输出文件。 第3章 嵌入式系统的设计方法

15 完整的链接器armlink命令语法如下:
2.链接器 完整的链接器armlink命令语法如下: armlink [-help] [-vsn] [-partial] [-output file] [-elf] [-reloc][-ro-base address] [-ropi] [-rw-base address] [-rwpi] [-split] [-scatter file] [-debug| -nodebug][-remove?RO/RW/ZI/DBG]|-noremove] [-entry location ] [-keep section-id] [-first section-id] [-last section-id] [-libpath pathlist] [-scanlib|-noscanlib] [-locals|-nolocals] [-callgraph] [-info topics] [-map] [-symbols] [-symdefs file] [-edit file] [-xref] [-xreffrom object(section)] [-xrefto object(section)] [-errors file] [-list file] [-verbose] [-unmangled |-mangled] [-match crossmangled] [-via file] [-strict] [-unresolved symbol][-MI|-LI|-BI] [input-file-list]  -help:列出在命令行中常用的一些选项操作。  -vsn:显示出所用的armlink的版本信息。  -partial:创建的是部分链接的目标文件而不是可执行映像文件。  -output file:指定输出文件名,该文件可能是部分链接的目标文件,也可能是可执行映像文件。如果输出文件名没有特别指定的话,输出一个可执行映像文件,则生成的默认输出文件名为_image.axf;如果输出一个部分链接的目标文件,则生成的默认文件名为_object.o;如果没有指定输出文件的路径信息,则输出文件就在当前目录下生成。如果指定了路径信息,则在指定的路径下生成输出文件。  -elf:生成ELF格式的映像文件,这也是armlink所支持的惟一的一种输出格式。 第3章 嵌入式系统的设计方法

16  -reloc:生成可重定址的映像。一个可重定址的映像具有动态的段,这个段中包含可重定址信息,利用这些信息可以在链接后,进行映像文件的重新定址。-reloc、-rw-base 一起使用时,如果没有-split选项,链接时会产生错误。  -ro-base address:将包含有RO(Read-Only属性)输出段的加载地址和运行地址设置为address,该地址必须是字对齐的,如果没有指定这个选项,则默认的RO基地址值为0x8000。  -ropi:使得包含RO输出段的加载域和运行域是位置无关的。如果该选项没有使用,则相应的域被标记为绝对的。通常每一个只读属性的输入段必须是只读位置无关的。如果使用了这个选项,armlink将会检查各段之间的重定址是否有效,并确保任何由armlink自身生成的代码是只读位置无关的。 ARM工具直到armlink完成了对输入段的处理后,才能够决定最终的生成映像是否为只读位置无关的。这就意味着,即使为编译器和汇编器指定了ROPI选项,armlink也可能会产生ROPI错误信息。  -rw-base address:设置包含RW(Read/Write属性)输出段的域的运行时地址,该地址必须是字对齐的。如果这个选项和-split选项一起使用,包含RW输出段的域的加载和运行时地址都将设置在address处。  -rwpi:使得包含RW和ZI(Zero Initialization,初始化为0)属性的输出段的加载和运行域为位置无关的。如果该选项没有使用,相应域标记为绝对的。这个选项要求-rw-base选项后有值,如果-rw-base没有指定的话,默认其值为0,即相当于-rw-base 0。通常每一个可写的输入段必须是可读/可写位置无关的。 第3章 嵌入式系统的设计方法

17  -debug:使输出文件包含调试信息,调试信息包括调试输入段、符号和字符串表。这是默认的选项。
 -split:将包含RO和RW属性的输出段的加载域,分割成2个加载域。一个是包含RO输出段的加载域,默认的加载地址为0x8000,但是可以用-ro-base选项设置其他的地址值;另一个加载域包含RW属性的输出段,由-rw-base选项指定加载地址,如果没有使用-rw-base选项的话,默认使用的是-rw-base 0。  -scatter file:使用在file中包含的分组和定位信息来创建映像内存映射。如果使用了该选项的话,必须重新实现堆栈初始化函数_user_initial_stackheap()。  -debug:使输出文件包含调试信息,调试信息包括调试输入段、符号和字符串表。这是默认的选项。  -nodebug:使得在输出文件中不包含调试信息。生成的映像文件短小,但是不能进行源码级的调试。  -remove:使用这个选项会将在输入段中未使用的段从映像文件中删除。如果输入段中含有映像文件入口点或者该输入段被一个使用的段所引用,则armlink将这样的输入段当做已使用的段。  -noremove:保留映像文件中所有未被使用的段。  -entry location:指定映像文件中惟一的初始化入口点。一个映像文件可以包含多个入口点,使用这个命令定义的初始化入口点是存放在可执行文件的头部,以供加载程序加载时使用。 -keep section-id:指定保留一个输入段,这样,即使该输入段没有在映像文件中使用,也不会被删除。  -first section-id:将被选择的输入段放在运行域的开始。通过该选项,将包含复位和中断向量地址的段放置在映像文件的开始。  -last section-id:将所选择的输入段放在运行域的最后。例如,用这个选项能够强制性地将包含校验和的输入段放置在RW段的最后。 第3章 嵌入式系统的设计方法

18  -libpath pathlist:为ARM标准的C和C++库指定了搜索路径列表。注意,这个选项不会影响对用户库的搜索路径。
 -scanlib:启动对默认库(标准ARM C和C++库)的扫描以解析引用的符号。  -noscanlib:禁止在链接时扫描默认的库。  -locals:指导链接器在生成可执行映像文件的时候,将本地符号添加到输出符号信息表中。  -nolocals:指导链接器在生成可执行映像文件的时候,不要将本地符号添加到输出符号信息表中。如果想减小输出符号表的大小,可以使用该选项。  -callgraph:创建一个HTML格式的静态函数调用图。这个调用图给出了映像文件中所有函数的定义和引用信息。  -info topics:打印出关于指定种类的信息,这里的参数topics是指用逗号间隔的类型标志符列表。  -map:创建映像文件的信息图。映像文件信息图包括映像文件中的每个加载域、运行域和输入段的大小和地址,这里的输入段还包括调试信息和链接器产生的输入段。  -symbols:列出链接时使用的每一个局部和全局符号。该符号还包括链接生成的符号。  -symdefs file:创建一个包含来自输出映像文件的全局符号定义的符号定义文件。  -edit file:指定一个steering 类型的文件,该文件包含用于修改输出文件中的符号信息表的命令。可以在steering文件中指定隐藏全局符号和重命名全局符号。 第3章 嵌入式系统的设计方法

19  -xref:列出输入段间的所有交叉引用。
 -xreffrom object(section):列出目标文件中的输入段对其他输入段的交叉引用。如果想知道某个指定的输入段中的引用情况,就可以使用该选项。  -xrefto object(section):列出从其他输入段到目标文件输入段的引用。 -errors file:将诊断信息从标准输出流重定向到文件file中。 -list file:将-info,-map,-symbols,-xref,-xreffrom和–xrefto这几个选项的输出重新定向到文件file中。如果文件file没有指定路径信息,就会在默认输出路径创建该文件,该路径是输出映像文件所在的路径。  -verbose:将有关链接操作的细节打印出来,包括所使用的目标文件和要用到的库。  -unmangled:指定链接器在由xref,-xreffrom,-xrefto和-symbols所生成的诊断信息中显示出unmangled C++符号名。如果使用了这个选项,链接器将unmangle C++符号名以源码的形式显示出来。这个选项是默认的。  -mangled:指定链接器显示由-xref,-xreffrom,-xrefto和-symbols所产生的诊断信息中的mangled C++符号名。如果使用了该选项,链接器就不会显示unmangle C++符号名了。符号名是按照它们在目标符号表中显示的格式显示的。  -via file:表示从文件file中读取输入文件名列表和链接器选项。在armlink命令行可以输入多个-via选项,当然,-via选项也能够包含在一个via文件中。  -strict:指定链接器报告可能导致错误的条件。 第3章 嵌入式系统的设计方法

20  input-file-list:以空格作为间隔符的目标或库的列表。
 -unresolved symbol:将未被解析的符号指向全局符号symbol。symbol必须是已定义的全局符号,否则,symbol会当做一个未解析的符号,链接将以失败告终。这个选项在自上而下的开发中尤为有用,在这种情况下,通过将无法指向相应函数的引用指向一个伪函数的方法,可以测试一个部分实现的系统。该选项不会显示任何警告信息。  input-file-list:以空格作为间隔符的目标或库的列表。 有一类特殊的目标文件,即symdef文件,可以包含在文件列表中,为生成的映像文件提供全局的symbol值。在输入文件列表中有两种使用库的方法:  指定要从库中提取并作为目标文件添加到映像文件中的特定的成员。  指定某库文件,链接器根据需要从其中提取成员。 armlink按照以下的顺序处理输入文件列表: (1)无条件地添加目标文件; (2)使用匹配模式从库中选择成员加载到映像文件中去。例如使用下面的命令: armlink main.o mylib(stdio.o) mylib(a*.o) 将会无条件地把mylib库中所有的以字母a开头的目标文件和stdio.o链接到生成的映像文件中去。 (3)添加尚未解析的引用库到库文件列表中。 第3章 嵌入式系统的设计方法

21 利用ADS开发应用程序 工程将所有的源码文件组织在一起,并能够决定最终生成文件存放的路径、输出的格式等。在CodeWarrior中新建一个工程的方法有两种,可以在工具栏中单击“New”按钮,也可以在“File”菜单中选择“New…”菜单。这样就会打开一个如图3.4所示的对话框。 在这个对话框中为用户提供了7种可选择的工程类型。  ARM Executabl Image:用于由ARM指令代码生成一个ELF格式的可执行映像文件;  ARM Object Library:用于由ARM指令代码生成一个armar格式的目标文件库;  Empty Project:用于创建一个不包含任何库或源文件的工程;  Makefile Importer Wizard:用于将Visual C的nmake或GNU make文件转入到CodeWarrior IDE工程文件;  Thumb ARM Executable Image:用于由ARM指令和Thumb指令的混合代码生成一个可执行的ELF格式的映像文件;  Thumb Executable image:用于由Thumb指令创建一个可执行的ELF格式的映像文件;  Thumb Object Library:用于由Thumb指令的代码生成一个armar格式的目标文件库。 第3章 嵌入式系统的设计方法

22 第3章 嵌入式系统的设计方法

23 第3章 嵌入式系统的设计方法

24 第3章 嵌入式系统的设计方法

25 第3章 嵌入式系统的设计方法

26 第3章 嵌入式系统的设计方法

27 #include <stdlib.h> #include <string.h> #include "def.h"
#include "option.h" #include "2410addr.h" #include "2410lib.h" #include "2410slib.h" #include "mmu.h" #include "uart0.h" void Isr_Init(void); //========================== void Main(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); Led_Display(2); Led_Display(4); Led_Display(8); Uart_Printf("\n\nTest Program. FCLK = %d Hz\n\n", FCLK); } void Isr_Init(void){ rINTMOD = 0x0; rINTMSK = BIT_ALLMSK; rINTSUBMSK = BIT_SUB_ALLMSK; 第3章 嵌入式系统的设计方法

28  DebugRel:使用该目标,在生成目标的时候,会为每一个源文件生成调试信息;
函数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:使用该目标不会生成任何调试信息。 到目前为止,一个完整的工程已经建立,下面应该对工程进行编译和链接工作。 第3章 嵌入式系统的设计方法

29 编译和链接工程 图3.9 Edit菜单 在进行编译和链接前,首先讲述一下如何进行生成目标的配置。
单击“Edit”菜单,出现Edit菜单,选择“DebugRel Settings…”,如图3.9所示。 图3.9 Edit菜单 第3章 嵌入式系统的设计方法

30 图3.10 DebugRel Settings对话框
1.Target设置选项 Target Name文本框显示了当前的目标设置。 Linker选项供用户选择要使用的链接器。 Pre-linker:目前CodeWarrior IDE不支持该选项。 Post-Linker:选择在链接完成后,还要对输出文件进行的操作。 第3章 嵌入式系统的设计方法

31 2.Language Settings 因为本例中包含汇编源代码,所以要用到汇编器。首先看ARM汇编器。这个汇编器实际上就是armasm,ARM体系结构是ARM920T,字节顺序默认就是小端模式。在其他编译器的设置中,ARM体系结构均为ARM920T。 细心的读者可能会注意到,在设置框的右下角,当对某项设置进行修改后,该行中的某个选项就会发生相应的改动,如图3.11所示。事实上,这行文字显示的是相应的编译或链接选项,由于有了CodeWarrior,开发人员可以不用再去查看繁多的命令行选项,只要在界面中选中或撤销某个选项,软件就会自动生成相应的代码,这项功能为那些不习惯在DOS下键入命令行的用户提供了极大的方便。 图3.11 命令行工具选项设置 第3章 嵌入式系统的设计方法

32 3.Linker设置 鼠标选中ARM Linker,出现如图3.12所示的对话框。这里详细介绍该对话框的主要标签页选项,因为这些选项对最终生成的文件有着直接的影响。 在标签页Output中,Linktype中提供了3种链接方式。Partial方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple方式是默认的链接方式,也是使用最频繁的链接方式,它链接生成简单的ELF格式的目标文件,使用的是链接器选项中指定的地址映射方式。Scattered方式使得链接器根据scatter格式文件中指定的地址映射,生成复杂的ELF格式的映像文件。在一般情况下,该选项使用得不太多。 图3.12 链接器设置 第3章 嵌入式系统的设计方法

33 在选中Simple方式后,会出现Simple image选项。
(1)RO Base:这个文本框设置使包含有RO段的加载域和运行域为同一个地址,默认是0x8000。用户要根据自己硬件的实际SDRAM的地址空间来修改这个地址,保证在这里填写的地址是程序运行时,SDRAM地址空间所能覆盖的地址。 (2)RW Base:这个文本框设置了包含RW和ZI输出段的运行域地址。如果选中split选项,链接器生成的映像文件将包含两个加载域和两个运行域,此时,在RW Base中所输入的地址为包含RW和ZI输出段的域设置了加载域和运行域地址。 (3)Ropi:选中这个设置将告诉链接器,使包含有RO输出段的运行域位置无关。使用这个选项,链接器将保证下面的操作。  检查各段之间的重定址是否有效;  确保任何由armlink自身生成的代码是只读位置无关的。 (4)Rwpi:选中该选项将会告诉链接器,使包含RW和ZI输出段的运行域位置无关。该选项要求RW Base有值,如果没有给它指定数值的话,默认为0值。如果这个选项没有被选中,域就标识为绝对。每一个可写的输入段必须是读写位置无关的。 (5)Split Image:选择这个选项把包含RO和RW输出段的加载域分成2个加载域:一个是包含RO输出段的域,一个是包含RW输出段的域。这个选项要求RW Base有值,如果没有给RW Base选项设置,则默认值为RW Base 0。 (6)Relocatable:选择这个选项将保留映像文件的重定址偏移量。这些偏移量为程序加载器提供了有用信息。 在Options选项中,需要读者引起注意的是Image entry point文本框。该文本框用来指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该地址去执行。 第3章 嵌入式系统的设计方法

34 在Linker下还有一个ARM fromELF,如图所示。
fromELF就是在3.3.1节中介绍的一个实用工具,它将链接器、编译器或汇编器的输出代码进行格式转换。例如,将ELF格式的可执行映像文件转换成可以烧写到ROM的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小、符号和字符串表,以及重定址等信息。只有在Target设置中选择了Post-linker,才可以使用该选项。 在Output format下拉框中,为用户提供了多种可以转换的目标格式,本例选择Plain binary,这是一个二进制格式的可执行文件,可以被烧写到目标板的Flash中。 在Output file name文本框输入希望生成的输出文件存放的路径,或通过单击“Choose...”按钮从文件对话框中选择输出文件。如果不输入路径名,则生成的二进制文件存放在工程所在的目录下。 第3章 嵌入式系统的设计方法

35 完成这些相关的设置后,以后在对工程进行make的时候,CodeWarrior IDE就会在链接完成后调用fromELF来处理生成的映像文件。
对于本例的工程而言,到此就完成了make之前的设置工作了。对工程文件的编译和链接也非常简单。单击CodeWarrior IDE的菜单Project下的make菜单,就可以对工程进行编译和链接了。整个编译链接过程如图3.14所示。 在工程Test所在的目录下,生成一个名为工程名_data的目录,在本例中是Test_data目录,在这个目录下不同类别的目标对应不同的目录。本例中由于我们使用的是DebugRel目标,所以生成的最终文件都应该在该目录下。进入DebugRel目录后,读者会看到make后生成的映像文件和二进制文件,映像文件用于调试,二进制文件可以烧写到S3C2410X的Flash中运行。 图3.14 编译和链接过程 第3章 嵌入式系统的设计方法

36 用AXD进行代码调试 AXD是ADS软件中独立于CodeWarrior IDE的图形软件。打开AXD软件,默认打开的目标是ARMulator,这也是在不具备仿真器的条件下调试时最常用的一种调试工具。为了更贴近实际硬件,需要选择Multi-ICE Server作为仿真器。本节主要结合Multi-ICE Server介绍在AXD中进行代码调试的方法和过程,使读者对AXD的调试有初步的了解。在使用AXD进行代码调试之前,首先要保证Multi-ICE的正常连接,这样才能正常进入AXD环境。 调试架构 Multi-ICE的配置 使用AXD进行代码调试 生成.bin文件 第3章 嵌入式系统的设计方法

37 调试架构 第3章 嵌入式系统的设计方法

38 调试主机一般是一台运行调试软件的计算机,运行有ARM公司或者第三方提供的调试软件。常用的软件有ADS中的AXD、Linux下的arm-elf-gdb等。通过这些软件,调试主机可以发出一些高层的调试命令,例如,设置断点、访问内存等。 协议转换器负责转换Debug主控端发出的高级ARM调试命令,将其转换为底层的ARM JTAG调试命令和ARM内核通信的JTAG命令。调试主机和协议转换器之间的介质接口有很多种,比如,以太网、并口、USB和RS-232等。典型的协议转换器是ARM公司提供的Multi-ICE。 调试目标机一般是指基于ARM920T内核MCU的目标开发板。经过协议转换器进行命令解释,主机上运行的调试软件就可以通过JTAG接口直接与ARM920T内核通信。通过插入特定ARM/THUMB指令,可以检查、保存或者改变内核和系统的状态。 整个调试系统包括集成调试环境和硬件仿真器,它们组成了一个类似于“客户机-服务器”模型的系统。服务器端把所有硬件封装起来,给客户端只提供一个虚拟的处理器接口。由于客户端的调试工具软件通过一个动态链接库与服务器相连,所以服务器一侧的硬件和客户端的调试工具软件是相互独立的。在同一个动态链接库的基础上,双方可以各自升级或替换,同样也方便了用户选择不同的仿真器和调试软件来组合成自己的调试平台。一个具体的调试程序应该能够支持许多不同的链接库,不同的链接库又能够提供不同的功能调用。如图3.16所示,以ADS工具包为例,“ARMulate.dll”提供了一个软ARM内核,用做程序的逻辑验证。若要与Multi-ICE Server程序连接在一起进行实时仿真,则只要调入“MultiICE.dll”就可以了。该动态库文件在Multi-ICE Server的安装目录下可以找到。 第3章 嵌入式系统的设计方法

39 第3章 嵌入式系统的设计方法

40 第3章 嵌入式系统的设计方法

41 Multi-ICE的配置 Multi-ICE是ARM JTAG的配置程序,通过它可以使ARM JTAG与目标板建立通信连接,并能够反馈目标板上ARM处理器的硬件信息。在PC开发主机上,选择“Multi-ICE Server”,进入Multi-ICE Server主界面,如图3.18所示。Multi-ICE Server在运行时需要目标处理器的配置信息,比如,内核类型和IR(指令寄存器)长度等。对Multi-ICE Server进行配置,可分为自动配置和手动配置两种方式。 第3章 嵌入式系统的设计方法

42  TAP controller:目标系统中包含TAP控制器,若包含多个控制器,则按0、1、2依次取名;
1.自动配置 在Multi-ICE Server程序中,选择“File”→“Auto-configure”菜单或者工具栏上的自动配置按钮。如果目标处理器是ARM族的内核,ARM JTAG能够自动检测到并进行相应配置,且把结果显示在Multi-ICE Server的显示窗口中。 有时候检测ARM710T/720T/740T/940T这一系列内核时会返回一个UNKNOWN结果,这是ARM报告的一个硬件bug,此时就只能使用手动配置的方法。 经过自动配置后,JTAG的通信速率会自动设置为10Mb/s,用户可以在“Settings”→“JTAG Settings”菜单中按自己的要求选择合适的速率。 2.手动配置 手动配置是通过调用一个用户预先定义好的配置文件来完成对Multi-ICE Server的配置。配置文件可以从“File”→“Load configuration”菜单中调入,配置文件为文本格式文件,文件后缀名为“.cfg”。配置文件主要包括以下几个部分。  Title:给配置方案命名;  TAP controller:目标系统中包含TAP控制器,若包含多个控制器,则按0、1、2依次取名;  Devices attached to each controller:控制器上连接着的ARM内核;  JTAG timing information:JTAG口的时序设置;  Other options :主要为RISC开发人员测试芯片提供的选项。 第3章 嵌入式系统的设计方法

43 Double cores configuration demo ; [TAP 0] ARM7TDMI [TAP1] ARM7TDMI-S
配置文件格式示范: [TITLE] Double cores configuration demo ; [TAP 0] ARM7TDMI [TAP1] ARM7TDMI-S [Timing] High = 9 ;TCK信号的高电平时间 Low = 9 ;TCK信号的低电平时间 Adaptive = ON ;RTCK功能开关(ON或OFF) [TAPINFO] YES [Reset] nTRST 在上面的配置文件中定义了两个控制器,TAP0控制上连着一个ARM7TDMI核,TAP1上连着一个ARM7TDMI-S核。在“Timing”中定义了TCK信号的电平时间,High = 9表示TCK信号的高电平时间,Low = 9表示TCK信号的低电平时间。Adaptive = ON ,表示选择RTCK功能开关。“TAPINFO”选项主要是为RISC开发人员测试芯片时提供的。“Reset”选项用来定义ARM JTAG的复位动作。当用户按下Multi-ICE Server工具栏上的复位按钮时,“Reset”选项内定义的信号就有效。合法的选项包括“nTRST”或“nSRST”,或者两者都选中。“Timing”部分定义了JTAG端口的时序信息。 第3章 嵌入式系统的设计方法

44 图3.19 Multi-ICE Server配置后状态
ARM9的配置文件,请大家仔细分析。 [TITLE] Auto-detected TAP Configuration [TAP 0] ;IR_len=4, ID_code= D ARM920T [Timing] Adaptive=OFF 按照该文件对Multi-ICE Server进行配置之后,显示出的状态如图3.19所示。 图3.19 Multi-ICE Server配置后状态 第3章 嵌入式系统的设计方法

45 第3章 嵌入式系统的设计方法

46 图3.20 Multi-ICE Server连接后状态
通过自动检测,显示目标是一个ARM920T的单内核系统,在TAP配置显示区用图形的方式直观地显示出检测结果。内核的类型名称“ARM920T”显示为绿色,并且前面有一个表示内核状态的状态位,这里字母“X”表示Multi-ICE Server目前还没有连接到任何调试程序中。该状态位共有4种状态:  [S] 处理器处于暂停状态;  [R] 处理器忙(运行状态);  [D] 处理器处于下载状态;  [X] 处理器类型未知或没有被调用。 图3.20 Multi-ICE Server连接后状态 第3章 嵌入式系统的设计方法

47 使用AXD进行代码调试 在进行仿真之前要对AXD进行一些必要的设置工作。具体的操作步骤如下:
(1)进入AXD环境,如图3.21所示的是Multi-ICE Server连接后,还没有配置的界面 。 第3章 嵌入式系统的设计方法

48 (3)在Choose Target对话框中选择“Add”项,添加Multi-ICE的驱动程序,然后一路确定。
(2)选择“options”→“Configure Target”菜单栏进入“Choose Target”对话框,在该对话框下对仿真方式做出选择。如图3.22所示。 (3)在Choose Target对话框中选择“Add”项,添加Multi-ICE的驱动程序,然后一路确定。 第3章 嵌入式系统的设计方法

49 正常进入AXD的环境后会发现在Target栏内,多了一个“ARM920T_0”,如图3
正常进入AXD的环境后会发现在Target栏内,多了一个“ARM920T_0”,如图3.23所示,这表示已与S3C2410X目标板正确连接。接下来的工作就是装载映像文件了。 第3章 嵌入式系统的设计方法

50 在所打开的映像文件中会有一个蓝色的箭头指示当前执行的位置。对于本例,打开映像文件后,如图3.24所示。
在菜单File中选择“Load image…”选项,打开Load Image对话框,找到要装载的.axf映像文件,单击“打开”按钮,把映像文件装载到目标内存中。 在所打开的映像文件中会有一个蓝色的箭头指示当前执行的位置。对于本例,打开映像文件后,如图3.24所示。 在菜单Execute中选择“Go”,将全速运行代码。要想进行单步的代码调试,在Execute菜单中选择“Step”选项,或用F10即可单步执行代码,窗口中蓝色箭头会发生相应的移动。 第3章 嵌入式系统的设计方法

51 生成.bin文件 如果调试结果正确,就可以生成.bin文件,并把程序下载到目标板的Flash中去。在生成BIN文件之前,首先需要确认应用程序在DEBUG模式下运行正确。 在CodeWarrior中,对当前的工程“Test.mcp”进行设置。 (1)进入“Edit”→“DebugRel Settings”菜单,在“Target Settings”选项中的“Post-Linker”设置为“ARM formELF”;在“ARM Linker”选项的“Equivalent Command Line”中写为“-info totals –entry 0x0 –ro-base 0x0 –rw-base 0x5000”; (2)对“Test.mcp”进行Make,生成“Test.bin”文件。 此时,需要烧录的“Test.bin”文件已经生成,可以进行烧录了。 第3章 嵌入式系统的设计方法


Download ppt "第3章 嵌入式系统的设计方法 3.1 嵌入式系统的总体结构 3.2 嵌入式系统开发过程 3.3 ADS集成开发环境的使用"

Similar presentations


Ads by Google