1、 毕业设计 (论文 )外文资料翻译 系 : 电气工程学院 专 业: 电气工程及其自动化 指导教师评语: 签名: 年 月 日 附件 1:外文资料翻译译文 嵌入式系统程序的 下载和调试 当你已经在主机上有了 一个可执行二进制映像文件的时候,你就需要有一种途径来把这个映像文件下载到嵌入式系统运行了,可执行二进制影响一般是要下载到目标板上的存储器里并在那里执行,并且如果你配备了适当的工具的话,还可以在程序里设置断点或以一种不干扰的方式来观察运行情况,本章介绍了可用于下载,运行和调试嵌入式软件是各种技术。 4.1 在 ROM 中的时候 . 下载嵌入式软件的最明显的方式 ,是把二进制映像载入一片存储片并把
2、它插在目标板上 ,虽然一个整整的只读是不能再覆盖写入的 ,不过你会在第六章“存储器 ”里看到 ,嵌入式系统通常使用了一种特殊的只 读存储器 ,这种存储器可以用特殊的编程器来编程 (或重新写入程序 ).编程器是一种计算机系统 ,它上面有各种各样的形状和大小的芯片插座,可以用来为各种存储芯片编程。 在一个理想的开发条件下,设备编程器应该和主机接在同一个网络上。这样,可执行二进制映像文件就很容易传给它来对 ROM 芯片编程。首先把映像文件传到编程器,然后把存储器芯片插入大小形状何时的插座里并冲编程器屏幕上的菜单里悬着芯片的型号。实际的编程过程可能需要几秒到几分钟,这要看二进制映像文件的大小和你所用的
3、芯片型号来定。 变成结束以后,你就可以把 ROM 插进板上 的插座了,当然,不能在嵌入式系统还在加电的时候做这件事。应该在插入芯片之前关掉电源,插入之后在打开。 一旦加电,处理器就开始从 ROM 里取出代码并执行。不过,要注意到每一种处理器对第一条指令的位置都有自己的要求。例如,当 Intel80188EB 处理器复位以后,它就会取位于物理地址 FFFF0h 的指令来执行。这个地址叫做复位地址,位于那里的指令就叫复位代码。 如果你的程序看起来像是没有正确运行,那可能是你复位代码出了问题。你必须保证 ROM 里你的二进制映像格式要遵从目标处理器的复位要求。在开发过程中,我发现在复位代 码执行之后
4、打开板子上的一个 LED 非常有用,这样我一眼就知道我的芯 ROM 程序是不是满足了处理器的基本要求。 注意 :调试技巧 #1:一个最简单的调试技巧就是利用 LED 来指示成功或者失败。基本思路是慢慢地从 LED 驱动代码过渡到更大的程序,把 LED 驱动代码挪到下一个运行标记的地方。这个方式最适合启动代码那样简单的,线性执行的程序。如果你没有本章后面提到的远程调试器或者任何其他调试工具的话,这也许是你唯一的调试办法了。 Arcom 电路板 特殊的在线可编程存储器,叫做快闪存储器(简称闪存),它可以在不从板上移走的情况下编 程。实际上,板上的另外一块存储器中已经包含了可以对这个快闪存储器编程的
5、功能。你知道吗, Arcom 电路板上实际带了两个只读存储器,一个是真正的 ROM,其中包含了可以让用户对另外一片(即快闪存储器)在线编程的简单程序。主机只需通过一个串行通信口和一个终端程序就可以和这个监控程序沟通了。随板提供的“ Target188EB Monitor User s Manual”包含了把一个 Intel 十六进制格式文件,比如 blink.hex,载入到闪存里的指令。 这种下载技术的最大缺点是没有一种简单的方法来调试运行在 ROM 外面 的软件,处理器以一种很高的速度提取指令并执行,并没有提供任何使你观察程序内部状态的手段。这在你已经知道你的软件工作正常并且你在计划分发这个
6、系统的时候看起来是不错的,不过对于正在开发的软件是一点用多没有。当然,你还是可以检查 LED 的状态和其他外部可视硬件指示,但这永远不会比一个调试器提供更多的信息和反馈。 4.2 远程调试器 如果可能的话,一个远程调试器可以通过主机和目标机之间的串行网络连接来下载、执行和调试嵌入式软件。一个远程调试器的前端和你可能用过的其他调试器都一样,通常有一个基于文本或 GUI(图形用户 界面)的主窗口和几个小一点的窗口来显示正在运行的程序的源代码、寄存器内容和其他相关信息。所不同的是,在嵌入式系统的情况下,调试器和被调试的软件分别运行在两台不同的计算机上。 一个远程调试器实际上包含两部分软件。前端运行在
7、主机上并提供前述的人机界面。但还有一个运行在目标处理器上的隐藏的后端软件来负责通过某种通信链路和前端通信。后端一般被称作调试监控器,它提供了对目标处理器的低层控制。 监视控制器通常是你或生产厂以前讲过的方式放置在 ROM 里的,它在目标处理器复位的时候会自动启动。它监控和主机的通信链路并对远程调 试器的请求做出回应。当然,这些请求和监控器的响应必须符合某种预先定义好的通信协议,而且这些协议通常是很底层的。远程调试器的请求的一些示例就如“读寄存器 x”、“修改寄存器 y”、读从 address 开始的内存的 n 字节 ” 还有“修改位于 address 的数据”等等。远程调试器通过组合利用这些低
8、层命令来完成诸如下载程序、单步执行和设置断点等高级调试任务。 GUN 调试器( gdb)就是这样一个调试器,像其他 GUN 工具一样,它一开始是被设计用来完成本机调试,后来才具有了跨平台调试的能力。所以你可以创建一个运行在任何被支持的主机 上的 GDB 前端,它就会理解任何被支持的目标上的操作码和寄存器名称。一个兼容的调试兼容器的源代码包含在 GDB 软件包里面,并需要被移植到目标平台上,不过,要知道这个移植可能需要一些技巧,特别是如果你的配置里只能通过 LED 来调试的话(参见调试技巧 #1)。 GDB 前端和调试监控器之间的通信专门被设计来通过串行连接进行字节传输。表 4-1 显示了命令格式和一些主要的命令。这些命令示范了发生在典型的远程调试器前端和调试器之间的交互类型。 Table 4-1. GDB 调试监控器命令 命令 请求格式 响应格式 读存储器 g data 写存储器 Gdata OK 读某地址数据 maddress,length data 写某地址数据 Maddress,length:data OK 启动 /重启执行 c Ssignal 从某地址执行 caddress Ssignal 单步执行 s Ssignal 从某地址开始单步执行 saddress Ssignal 重置 /中止程序 k no response