资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第3章 嵌入式系统的设计方法,*,第,3,章 嵌入式系统的设计方法,3.1,嵌入式系统的总体结构,3.2,嵌入式系统开发过程,3.3 ADS,集成开发环境的使用,3.4,用,AXD,进行代码调试,3.1,嵌入式系统的总体结构,在不同的应用场合,嵌入式系统呈现出的外观和形式各不相同。但通过对其内部结构进行分析,可以发现,一个嵌入式系统一般都由嵌入式微处理器系统和被控对象组成,如图,3.1,所示。其中嵌入式微处理器系统是整个系统的核心,由硬件层、中间层、软件层和功能层组成。被控对象可以是各种传感器、电机等,可以接受嵌入式微处理器系统发出的控制命令,执行所规定的操作或任务。,2,第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,第3章 嵌入式系统的设计方法,硬件层与软件层之间为中间层,也称为,BSP,(,Board Support Package,,板级支持包),将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关,一般应具有相关硬件的初始化、数据的输入,/,输出操作和硬件设备的配置等功能。,BSP,是主板硬件环境和操作系统的中间接口,是软件平台中具有硬件依赖性的那一部分,主要目的是为了支持操作系统,使之能够更好地运行于硬件主板上。,纯粹的,BSP,所包含的内容一般说来是与系统有关的驱动程序,如网络驱动程序和系统中的网络协议有关,串口驱动程序和系统的下载调试有关,等等。离开这些驱动程序系统就不能正常工作。,软件层主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。操作系统是嵌入式应用软件的基础和开发平台,实际上是一段程序,系统复位后首先执行,相当于用户的主程序,用户的其他应用程序都建立在操作系统之上。操作系统是一个标准的内核,将中断、,I/O,、定时器等资源都封装起来,以方便用户使用。,操作系统的引入大大提高了嵌入式系统的功能,方便了应用软件的设计,但同时也占用了宝贵的嵌入式系统资源。一般在大型的或需要多任务的应用场合才考虑使用嵌入式操作系统。,功能层由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。功能层是面向被控对象和用户的,为了方便用户操作,往往需要具有友好的人机界面。,对于一些复杂的系统,在系统设计的初期阶段就要对系统的需求进行分析,确定系统的功能,然后将系统的功能映射到整个系统的硬件、软件和执行装置的设计过程中,这个过程称为系统的功能实现。,4,第3章 嵌入式系统的设计方法,3.2,嵌入式系统开发过程,嵌入式软件的开发与传统的软件有许多共同点,它继承了许多传统软件开发的开发习惯。但由于嵌入式软件运行于特定的目标环境,与传统软件的开发又有着很大的不同。,3.2.1,嵌入式系统的开发特点,3.2.2,嵌入式系统的开发流程,3.2.3,调试嵌入式系统,5,第3章 嵌入式系统的设计方法,嵌入式系统的开发特点,1,采用宿主机,/,目标机方式,嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的。嵌入式软件以宿主机,/,目标机模式开发,所需要的开发环境称为交叉开发环境,分为宿主机部分和目标机部分,两者以统一的通信协议进行通信,宿主机向目标机发送命令,目标机接收、执行命令并将结果返回宿主机,从而实现两机之间的交互控制。,2,为了保证稳定性和实时性,选用,RTOS,开发平台,对简单系统可以用传统方法,从底层用汇编语言编写程序,利用在线仿真器(,ICE,)、在线调试器(,ICD,)等开发工具进行软件的调试。对于那些复杂的嵌入式系统,需要在优化级可控的情况下预测其运行状态,不利用实时操作系统和嵌入式系统开发平台进行开发,是很难、甚至是不可能达到预定要求的。为了合理地调度多任务、利用系统资源,用户必须选配,RTOS,开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保证软件质量。,3,生成代码需要固态化存储,嵌入式应用程序开发环境是,PC,机,但运行的目标环境却千差万别,可以是,PDA,,也可以是仪器设备。而且应用软件在目标环境下必须存储在非易失性存储器中,保证系统在掉电重启后仍能正常使用。所以,应用软件在开发完成以后,应生成固化版本,都固化在单片机本身或烧写到目标环境的,Flash,中运行。,4,软件代码具有高质量、高可靠性,6,第3章 嵌入式系统的设计方法,嵌入式系统的开发流程,嵌入式系统的应用开发是按照如图,3.2,所示的流程进行的,一般由,5,个阶段构成:需求分析、体系结构设计、硬件,/,软件设计、系统集成和代码固化。各个阶段之间往往要求不断地反复和修改,直到完成最终完成设计目标。,7,第3章 嵌入式系统的设计方法,1,需求分析阶段,在需求分析阶段需要分析系统的需求,系统的需求一般分功能需求和非功能需求两方面。根据系统的需求,确定设计任务和设计目标,并提炼出设计规格说明书,作为正式指导设计和验收的标准。,2,体系结构设计,需求分析完成后,根据提炼出的设计规格说明书,进行体系结构的设计。系统的体系结构描述了系统如何实现所述的功能和非功能需求,包括对硬件、软件的功能划分,以及系统的软件、硬件和操作系统的选型等。,3,硬件,/,软件设计,基于体系结构,对系统的软、硬件进行详细设计。对于一个完整的嵌入式应用系统的开发,应用系统的程序设计是嵌入式系统设计一个非常重要的方面,程序的质量直接影响整个系统功能的实现,好的程序设计可以克服系统硬件设计的不足,提高应用系统的性能,反之,会使整个应用系统无法正常工作。,4,系统集成,把系统中的软件、硬件集成在一起,进行调试,发现并改进单元设计过程中的错误。,5,代码固化,嵌入式软件开发完成以后,大多数要在目标环境的非易失性存储器中运行,程序写入到,Flash,中固化,保证每次运行后下一次运行无误,所以嵌入式软件开发与普通软件开发相比,增加了固化阶段。,8,第3章 嵌入式系统的设计方法,调试嵌入式系统,调试是任何项目开发过程中必不可少的一部分,特别是在软硬件结合非常紧密的嵌入式系统开发中。一般来说,大多数的调试工作是在,RAM,中进行的,只有当程序完成并能运行后才切换到,ROM,上。嵌入式系统的调试有多种方法,可分为模拟器方式、,ICE,(,In-Circuit Emulator,,在线仿真器)方式、,ICD,(,In-Circuit Debugger,,在线调试器)方式和监控器方式。,1,模拟器方式,调试工具和待调试的嵌入式软件都在主机上运行,通过软件手段模拟执行为某种嵌入式处理器编写的源程序。简单的模拟器可以通过指令解释方式逐条执行源程序,分配虚拟存储空间和外设,进行语法和逻辑上的调试。,2,在线仿真器方式,在线仿真器,ICE,是一种完全仿造调试目标,CPU,设计的仪器,目标系统对用户来说是完全透明的、可控的。仿真器与目标板通过仿真头连接,与主机有串口、并口、以太网口或,USB,口等连接方式。该仿真器可以真正地运行所有的,CPU,动作,并且可以在其使用的内存中设置非常多的硬件中断点,可以实时查看所有需要的数据,从而给调试过程带来很多便利。由于仿真器自成体系,调试时可以连接目标板,也可以不接目标板。,使用,ICE,同使用一般的目标硬件一样,只是在,ICE,上完成调试后,需要把调试好的程序重新下载到目标系统上而已。由于,ICE,价格昂贵,而且每种,CPU,都需要一种与之对应的,ICE,,使得开发成本非常高。,9,第3章 嵌入式系统的设计方法,。,3,监控器方式,主机和目标板通过某种接口(通常是串口)连接,主机上提供调试界面,被调试程序下载到目标板上运行,监控程序是一段运行于目标机上的可执行程序,主要负责监控目标机上被调试程序的运行情况,与宿主机端的调试器一起完成对应用程序的调试。监控程序包含基本功能的启动代码,并完成必要的硬件初始化,等待宿主机的命令。被调试程序通过监控程序下载到目标机,就可以开始进行调试。监控器方式操作简单易行,功能强大,不需要专门的调试硬件,适用面广,能提高调试的效率,缩短产品的开发周期,降低开发成本。正因为以上原因,监控器方式才能够广泛应用于嵌入式系统的开发之中。,监控器调试主要用于调试运行在目标机操作系统上的应用程序,不适宜用来调试目标操作系统。有的微处理器需要在目标板工作正常的前提下,事先烧制监控程序,而且功能有限,特别是硬件调试能力较差。,4,在线调试器方式,使用,ICD,和目标板的调试端口连接,发送调试命令和接收调试信息,可以完成必要的调试功能。一般情况下,在,ARM,芯片的开发板上采用,JTAG,边界扫描口进行调试。摩托罗拉公司采用专用的,BDM,调试接口。,使用合适的开发工具可以利用这些接口。例如,,ARM,开发板,可以将,JTAG,调试器接在开发板的,JTAG,口上,通过,JTAG,口与,ARM,处理器核进行通信。由于,JTAG,调试的目标程序是在目标板上执行,仿真更接近于目标硬件,因此许多接口问题,如高频操作限制、电线长度的限制等被最小化了。该方式是目前采用最多的一种调试方式。,10,第3章 嵌入式系统的设计方法,3.3 ADS,集成开发环境的使用,3.3.1 ADS,组成介绍,3.3.2,命令行开发工具,3.3.3,利用,ADS,开发应用程序,3.3.4,编译和链接工程,ADS,全称为,ARM Developer Suite,,是,ARM,公司推出的新一代,ARM,集成开发工具。现在,ADS,的最新版本是,1.2,,它取代了早期的,ADS1.1,和,ADS1.0,,该版本支持包括,Windows,和,Linux,在内的多种操作系统。,11,第3章 嵌入式系统的设计方法,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,文件。,12,第3章 嵌入式系统的设计方法,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,处理器编写和调试自己的开发应用程序了。,13,第3章 嵌入式系统的设计方法,命令行开发工具,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+,源代码的一个或多个文件名,编译器在当前路径寻找源文件和创建输出文件。,14,第3章 嵌入式系统的设计方法,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,所支持的惟一的一种输出格式。,15,第3章 嵌入式系统的设计方法,-,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,。通常每一个可写的输入段必须是可读,/,可写位置无关的。,16,第3章 嵌入式系统的设计方法,-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,段的最后。,17,第3章 嵌入式系统的设计方法,-,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,文件中指定隐藏全局符号和重命名全局符号。,18,第3章 嵌入式系统的设计方法,-,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,:指定链接器报告可能导致错误的条件。,19,第3章 嵌入式系统的设计方法,-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,)添加尚未解析的引用库到库文件列表中。,20,第3章 嵌入式系统的设计方法,利用,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,格式的目标文件库。,21,第3章 嵌入式系统的设计方法,22,第3章 嵌入式系统的设计方法,23,第3章 嵌入式系统的设计方法,24,第3章 嵌入式系统的设计方法,25,第3章 嵌入式系统的设计方法,26,第3章 嵌入式系统的设计方法,#include ,#include ,#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);,Delay(1000);,Led_Display(2);,Delay(1000);,Led_Display(4);,Delay(1000);,Led_Display(8);,Delay(1000);,Uart_Printf(nnTest,Program. FCLK = %d Hz,nn, FCLK);,void,Isr_Init(void,),rINTMOD,= 0x0;,rINTMSK,= BIT_ALLMSK;,rINTSUBMSK,= BIT_SUB_ALLMSK;,27,第3章 嵌入式系统的设计方法,函数,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,:使用该目标不会生成任何调试信息。,到目前为止,一个完整的工程已经建立,下面应该对工程进行编译和链接工作。,28,第3章 嵌入式系统的设计方法,编译和链接工程,在进行编译和链接前,首先讲述一下如何进行生成目标的配置。,单击“,Edit,”,菜单,出现,Edit,菜单,选择“,DebugRel,Settings,”,,如图,3.9,所示。,图,3.9 Edit,菜单,29,第3章 嵌入式系统的设计方法,单击“,DebugRel,Settings,”,后,出现如图,3.10,所示的对话框。这个对话框中的设置很多,在这里只介绍一些最常用的设置选项,读者若对其他未涉及的选项感兴趣,可以查看相应的帮助文件。,图,3.10,DebugRel,Settings,对话框,1,Target,设置选项,Target Name,文本框显示了当前的目标设置。,Linker,选项供用户选择要使用的链接器。,Pre-linker,:目前,CodeWarrior IDE,不支持该选项。,Post-Linker,:选择在链接完成后,还要对输出文件进行的操作。,30,第3章 嵌入式系统的设计方法,2,Language Settings,因为本例中包含汇编源代码,所以要用到汇编器。首先看,ARM,汇编器。这个汇编器实际上就是,armasm,,,ARM,体系结构是,ARM920T,,字节顺序默认就是小端模式。在其他编译器的设置中,,ARM,体系结构均为,ARM920T,。,细心的读者可能会注意到,在设置框的右下角,当对某项设置进行修改后,该行中的某个选项就会发生相应的改动,如图,3.11,所示。事实上,这行文字显示的是相应的编译或链接选项,由于有了,CodeWarrior,,开发人员可以不用再去查看繁多的命令行选项,只要在界面中选中或撤销某个选项,软件就会自动生成相应的代码,这项功能为那些不习惯在,DOS,下键入命令行的用户提供了极大的方便。,图,3.11,命令行工具选项设置,31,第3章 嵌入式系统的设计方法,3,Linker,设置,鼠标选中,ARM Linker,,出现如图,3.12,所示的对话框。这里详细介绍该对话框的主要标签页选项,因为这些选项对最终生成的文件有着直接的影响。,在标签页,Output,中,,Linktype,中提供了,3,种链接方式。,Partial,方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。,Simple,方式是默认的链接方式,也是使用最频繁的链接方式,它链接生成简单的,ELF,格式的目标文件,使用的是链接器选项中指定的地址映射方式。,Scattered,方式使得链接器根据,scatter,格式文件中指定的地址映射,生成复杂的,ELF,格式的映像文件。在一般情况下,该选项使用得不太多。,图,3.12,链接器设置,32,第3章 嵌入式系统的设计方法,在选中,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,文本框。该文本框用来指定映像文件的初始入口点地址值,当映像文件被加载程序加载时,加载程序会跳转到该地址去执行。,33,第3章 嵌入式系统的设计方法,在,Linker,下还有一个,ARM,fromELF,,如图所示。,fromELF,就是在,3.3.1,节中介绍的一个实用工具,它将链接器、编译器或汇编器的输出代码进行格式转换。例如,将,ELF,格式的可执行映像文件转换成可以烧写到,ROM,的二进制格式文件;对输出文件进行反汇编,从而提取出有关目标文件的大小、符号和字符串表,以及重定址等信息。只有在,Target,设置中选择了,Post-linker,,才可以使用该选项。,在,Output format,下拉框中,为用户提供了多种可以转换的目标格式,本例选择,Plain binary,,这是一个二进制格式的可执行文件,可以被烧写到目标板的,Flash,中。,在,Output file name,文本框输入希望生成的输出文件存放的路径,或通过单击“,Choose.,”,按钮从文件对话框中选择输出文件。如果不输入路径名,则生成的二进制文件存放在工程所在的目录下。,34,第3章 嵌入式系统的设计方法,完成这些相关的设置后,以后在对工程进行,make,的时候,,CodeWarrior IDE,就会在链接完成后调用,fromELF,来处理生成的映像文件。,对于本例的工程而言,到此就完成了,make,之前的设置工作了。对工程文件的编译和链接也非常简单。单击,CodeWarrior IDE,的菜单,Project,下的,make,菜单,就可以对工程进行编译和链接了。整个编译链接过程如图,3.14,所示。,在工程,Test,所在的目录下,生成一个名为工程名,_data,的目录,在本例中是,Test_data,目录,在这个目录下不同类别的目标对应不同的目录。本例中由于我们使用的是,DebugRel,目标,所以生成的最终文件都应该在该目录下。进入,DebugRel,目录后,读者会看到,make,后生成的映像文件和二进制文件,映像文件用于调试,二进制文件可以烧写到,S3C2410X,的,Flash,中运行。,图,3.14,编译和链接过程,35,第3章 嵌入式系统的设计方法,用,AXD,进行代码调试,AXD,是,ADS,软件中独立于,CodeWarrior IDE,的图形软件。打开,AXD,软件,默认打开的目标是,ARMulator,,这也是在不具备仿真器的条件下调试时最常用的一种调试工具。为了更贴近实际硬件,需要选择,Multi-ICE Server,作为仿真器。本节主要结合,Multi-ICE Server,介绍在,AXD,中进行代码调试的方法和过程,使读者对,AXD,的调试有初步的了解。在使用,AXD,进行代码调试之前,首先要保证,Multi-ICE,的正常连接,这样才能正常进入,AXD,环境。,3.4.1,调试架构,3.4.2 Multi-ICE,的配置,3.4.3,使用,AXD,进行代码调试,3.4.4,生成,.bin,文件,36,第3章 嵌入式系统的设计方法,调试架构,37,第3章 嵌入式系统的设计方法,调试主机一般是一台运行调试软件的计算机,运行有,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,的安装目录下可以找到。,38,第3章 嵌入式系统的设计方法,39,第3章 嵌入式系统的设计方法,40,第3章 嵌入式系统的设计方法,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,进行配置,可分为自动配置和手动配置两种方式。,41,第3章 嵌入式系统的设计方法,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,开发人员测试芯片提供的选项。,42,第3章 嵌入式系统的设计方法,配置文件格式示范:,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,信
展开阅读全文