毕业设计(论文)外文资料翻译系:电气工程学院专业:姓名:学号:0414731外文出处:GettingStartedwithμVision2附件:1.外文资料翻译译文;2.外文原文。指导教师评语:签名:年月日(用外文写)附件1:外文资料翻译译文嵌入式系统程序的下载和调试当你已经在主机上有了一个可执行二进制映像文件的时候,你就需要有一种途径来把这个映像文件下载到嵌入式系统运行了,可执行二进制影响一般是要下载到目标板上的存储器里并在那里执行,并且如果你配备了适当的工具的话,还可以在程序里设置断点或以一种不干扰的方式来观察运行情况,本章介绍了可用于下载,运行和调试嵌入式软件是各种技术。4.1在ROM中的时候…….下载嵌入式软件的最明显的方式,是把二进制映像载入一片存储片并把它插在目标板上,虽然一个整整的只读是不能再覆盖写入的,不过你会在第六章“存储器”里看到,嵌入式系统通常使用了一种特殊的只读存储器,这种存储器可以用特殊的编程器来编程(或重新写入程序).编程器是一种计算机系统,它上面有各种各样的形状和大小的芯片插座,可以用来为各种存储芯片编程。在一个理想的开发条件下,设备编程器应该和主机接在同一个网络上。这样,可执行二进制映像文件就很容易传给它来对ROM芯片编程。首先把映像文件传到编程器,然后把存储器芯片插入大小形状何时的插座里并冲编程器屏幕上的菜单里悬着芯片的型号。实际的编程过程可能需要几秒到几分钟,这要看二进制映像文件的大小和你所用的芯片型号来定。变成结束以后,你就可以把ROM插进板上的插座了,当然,不能在嵌入式系统还在加电的时候做这件事。应该在插入芯片之前关掉电源,插入之后在打开。一旦加电,处理器就开始从ROM里取出代码并执行。不过,要注意到每一种处理器对第一条指令的位置都有自己的要求。例如,当Intel80188EB处理器复位以后,它就会取位于物理地址FFFF0h的指令来执行。这个地址叫做复位地址,位于那里的指令就叫复位代码。如果你的程序看起来像是没有正确运行,那可能是你复位代码出了问题。你必须保证ROM里你的二进制映像格式要遵从目标处理器的复位要求。在开发过程中,我发现在复位代码执行之后打开板子上的一个LED非常有用,这样我一眼就知道我的芯ROM程序是不是满足了处理器的基本要求。注意:调试技巧#1:一个最简单的调试技巧就是利用LED来指示成功或者失败。基本思路是慢慢地从LED驱动代码过渡到更大的程序,把LED驱动代码挪到下一个运行标记的地方。这个方式最适合启动代码那样简单的,线性执行的程序。如果你没有本章后面提到的远程调试器或者任何其他调试工具的话,这也许是你唯一的调试办法了。Arcom电路板特殊的在线可编程存储器,叫做快闪存储器(简称闪存),它可以在不从板上移走的情况下编程。实际上,板上的另外一块存储器中已经包含了可以对这个快闪存储器编程的功能。你知道吗,Arcom电路板上实际带了两个只读存储器,一个是真正的ROM,其中包含了可以让用户对另外一片(即快闪存储器)在线编程的简单程序。主机只需通过一个串行通信口和一个终端程序就可以和这个监控程序沟通了。随板提供的“Target188EBMonitorUser’sManual”包含了把一个Intel十六进制格式文件,比如blink.hex,载入到闪存里的指令。这种下载技术的最大缺点是没有一种简单的方法来调试运行在ROM外面的软件,处理器以一种很高的速度提取指令并执行,并没有提供任何使你观察程序内部状态的手段。这在你已经知道你的软件工作正常并且你在计划分发这个系统的时候看起来是不错的,不过对于正在开发的软件是一点用多没有。当然,你还是可以检查LED的状态和其他外部可视硬件指示,但这永远不会比一个调试器提供更多的信息和反馈。4.2远程调试器如果可能的话,一个远程调试器可以通过主机和目标机之间的串行网络连接来下载、执行和调试嵌入式软件。一个远程调试器的前端和你可能用过的其他调试器都一样,通常有一个基于文本或GUI(图形用户界面)的主窗口和几个小一点的窗口来显示正在运行的程序的源代码、寄存器内容和其他相关信息。所不同的是,在嵌入式系统的情况下,调试器和被调试的软件分别运行在两台不同的计算机上。一个远程调试器实际上包含两部分软件。前端运行在主机上并提供前述的人机界面。但还有一个运行在目标处理器上的隐藏的后端软件来负责通过某种通信链路和前端通信。后端一般被称作调试监控器,它提供了对目标处理器的低层控制。监视控制器通常是你或生产厂以前讲过的方式放置在ROM里的,它在目标处理器复位的时候会自动启动。它监控和主机的通信链路并对远程调试器的请求做出回应。当然,这些请求和监控器的响应必须符合某种预先定义好的通信协议,而且这些协议通常是很底层的。远程调试器的请求的一些示例就如“读寄存器x”、“修改寄存器y”、读从address开始的内存的n字节”还有“修改位于address的数据”等等。远程调试器通过组合利用这些低层命令来完成诸如下载程序、单步执行和设置断点等高级调试任务。GUN调试器(gdb)就是这样一个调试器,像其他GUN工具一样,它一开始是被设计用来完成本机调试,后来才具有了跨平台调试的能力。所以你可以创建一个运行在任何被支持的主机上的GDB前端,它就会理解任何被支持的目标上的操作码和寄存器名称。一个兼容的调试兼容器的源代码包含在GDB软件包里面,并需要被移植到目标平台上,不过,要知道这个移植可能需要一些技巧,特别是如果你的配置里只能通过LED来调试的话(参见调试技巧#1)。GDB前端和调试监控器之间的通信专门被设计来通过串行连接进行字节传输。表4-1显示了命令格式和一些主要的命令。这些命令示范了发生在典型的远程调试器前端和调试器之间的交互类型。Table4-1.GDB调试监控器命令命令请求格式响应格式读存储器gdata写存储器GdataOK读某地址数据maddress,lengthdata写某地址数据Maddress,length:dataOK启动/重启执行cSsignal从某地址执行caddressSsignal单步执行sSsignal从某地址开始单步执行saddressSsignal重置/中止程序knoresponse远程调试器是嵌入式软件里最常用到的下载和测试工具。这主要是因为它们一般比较便宜。嵌入式软件开发人员已经有了所需的主机了,任何一个远程调试器的价格并不会在全套跨平台开发工具(编译器、连接器、定址器等等)的价格上增加多少,还有调试器的供应商们通常会提供他们的调试监控器的源代码,以增加他们的用户群。Arcom电路板在交付的时候在快闪存储器里包含了一个免费的调试系统。和Arcom提供的主机软件一起使用,这个调试监控器就可以把程序直接下载到目标板的RAM里并运行,你可以用tload工具来完成这一任务。按照“SourceVIEWforTarget188EBUser’sManual”的指示简单地把SourceVIEW串行通信适配器接到目标板和主机上,然后在主机PC上执行下述命令:tload-gblink.exeSourceViewTargetLoaderv1.4Copyright(c)ArcomControlSystemsLtd1994Opening'blink.exe'...downloadsize750Hbytes(2K)CheckingCOM1(pressESCkeytoexit)...Remoteident:TDR188EBversion1.02DownloadsuccessfulSending'GO'commandtotargetsystem-g选项告诉调试监控器程序下载一结束就马上开始运行,这样一来,运行就是和ROM里的程序完全对应的RAM里的程序了。在这种情况下,我们也许会以可重定址程序来开始,那么tload工具也会自动地在RAM里第一个可利用的地址处为我们的程序重新定址。对于远程调试的目的,Arcom的调试监控器可以用Borland的TurboDebugger做前端。然后TurboDebugger就可以单步执行你的C/C++和汇编程序,在程序里设置断点,并可以在程序运行时监控变量、寄存器和堆栈(注1),下面是你可能用来启动一个对闪烁LED程序的调试会话的命令:tdrblink.exetver-3.1TargetDebuggerVersionChangerv1.2Copyright(c)ArcomControlSystemsLtd1994CheckingCOM1(pressESCkeytoexit)...Remoteident:TDR188EBversion1.02TDR88setforTDversion3.1td-rp1-rs3blink.exeTurboDebuggerVersion3.1Copyright(c)1988,92BorlandInternationalWaitingforhandshakefromremotedriver(Ctrl-Breaktoquit)Tdr命令实际是调用另外两个命令的一个批处理文件。第一个命令告诉板上的调试监控器你用的是哪个版本的TurboDebugger,第二个才实际调用TurboDebugger,每一次用Arcom板启动一个调试会话的时候都会发出这两条命令、tdr.bat批处理文件只是用来把它们组合成一个单一的命令。这里我们再一次使用了程序的可重定址版本,因为我们要把程序下载到RAM里并在那里执行它。调试器启动选项-rpl和-rp3设置了到调试监控器的通信链路的参数。-rpl代表“remote-port(远程端口)=1”(COM1),-rp3代表“remote-speed(远程速率)=3”(38400波特率),这些是同Arcom调试监控器通信所要求的参数。在建立了和调试监控器的联系后,TurboDebugger就可以开始运行了。如果没成功的话,可能是串行连接出了问题。把你的安装过程和SourceView用户手册中的描述对照一下。一旦进入TurboDebugger,你就会看到一个对话框显示“Programoutofdateonremote,sentoverlink?(远程的程序已过期,是否通过链路发送?)”,选择“yes”后,blink.exe的内容就会被下载到目录RAM中,然后调试器会在main处设置第一个断点并指示调试监控器运行程序到此处。所以你现在看到的就是main的C源代码,一个光标指示着嵌入式处理器的指令指针正指向这个例程的入口点。使用标准的TurboDebugger命令,你可以单步执行程序、设置断点、监控变量和寄存器的值、做调试器允许的任何事。或者可以按下F9立即运行程序的剩下部分、这样做了以后,你就能看到板上的绿色LED开始闪烁了。确认程序和调试器都正常工作之后,按下Arcom板上的复位开关来复位复位嵌入式处理器,然后LED会停止闪烁,TurboDebugger又可以响应你指令了。4.3仿真器远程调试器用来监视和控制嵌入式软件的状态是很有用,不过只有用在线仿真器(In-CircuitEmulator,ICE)才能检查运行程序的处理器状态。实际上,ICE取代了(或者仿真了)目标板上的处理器。它自己就是一个嵌入式系统,有它自己的目标处理器、RAM、ROM和自己的嵌入式软件,结果在线仿真器一样非常贵,往往要比目标硬件还贵。但是这是一种强有力的工具,在某些严格的环境下可以帮你很大忙。同调试监控器一样,仿真器也有一个远程调试器作为用户界面。某些情况下,甚至能使用相同的前端调试器。但是仿真器有自己的目标处理器,所以就有可能实时的监视和控制处理器的状态。这就允许仿真器在调试监控器提供的功能外支持一些高级的调试特性,如:硬件断点额实时跟踪。使用调试监控器,你可以在你的程序里设置断点。不过这些软断点只能到指令提取级别,也就是相当于“在提取该指令前停止运行”。相比之下,仿真器同时支持硬件断点。硬件断点允许响应多种事件来停止运行。这些事件不仅包括指令提取,还有内存和I/O读写以及中断。例如,你可以对事件“当变量foo等于15同