这两天闲着没事在整整51,发现一个比较爽的东西----ISD51(In System Debug),这是一个在线仿真的好东西,只需串口无需昂贵的仿真器就能使用Keil IDE的大部分仿真功能.经过一番摸索,终于把它搞定.先把资料整理整理.
概况
ISD51 (在线调试器)为8051编程用户提供了新的监控调试技术。将 ISD51 进行配置后与您的用户程序连接起来用户就可以通过8051的一个串口直接在芯片上调试程序了。
ISD51的软件和硬件可以工作于最小模式。它可以运行于带有外部或内部程序空间的系统并且不要求增加像冯.诺伊曼架构的数据存储器等的特殊硬件部件。
ISD51 可以工作在像 Philips LPC 系列之类的微型单片机上并且可以完全访问其 CODE 和 XDATA 地址空间。
特 点
- 用单步和复合软件断点控制程序执行。
- 观察和改变CPU寄存器和存储器。
- 有权使用 SFR。
- 支持一些8051单片机可用寄存器的硬件断点 。
- 当没有设置软件断点时,8051用户程序可以全速运行。 硬件断点不影响运行速度。
要 求
- 一个8051兼容串口。
- 500-700 字节的程序代码在相应数量的特殊寄存器中运行。
- 6 字节堆栈空间。
- 1 字节 IDATA RAM 。
- 为每个软件断点预留2 字节 IDATA RAM 。
优 点
- 对目标系统没有电路上的特殊要求。
- ISD51 可以被用于任何标准8051派生系列。
- 程序代码可以写在单片机内部 Flash/EPROM/ROM 或者外部 EPROM 中。
- 不再要求有冯.诺伊曼架构的存储器, XDATA 空间, 寄存器和位可寻址空间。
- ISD51 可以被连接或存在于最终成品中。ISD51 固件是可以免费使用的。
- 由于它仅在最初原代码可以被访问,所以 ISD51 能保护您的软件投资。
ISD51是如何工作的?
ISD51 在你的8051系统里增加了一个串口中断函数 (ISD51 中断) 。 当 ISD51 连接到 uVision调试器时, 8051 输入 ISD51的中断函数。只要到程序运行一被停止, 8051 就只运行 ISD51 中断服务程序。当 uVision2 调试器发出一个"Go"的指令, 8051就脱离 ISD51 中断函数并且运行用户程序。
如果没有设置任何断点或者如果所有断点设置为硬件断点, 8051 就会全速运行用户程序。如果设置了软件断点, 8051在相应8051 CPU指令后面输入 ISD51 中断函数 。ISD51 中断服务程序会检查是否8051程序到了一个断点地址,如果是,开始和 uVision调试器通讯。所以, 当使用软件断点时,8051 的程序运行速度会变得相当慢(相差100倍左右)。
一旦“ISD51 系统在线调试器”被作为中断函数实现,其它和 ISD51 系统的中断优先级一样,甚至比ISD51优先级更高的中断函数中就不能再设置断点或者单步执行了。默认状态下, ISD51 中断函数使用的中断优先等级为0级。
uVision调试器发送一个 0xA5 的字符到 ISD51 的中断函数中,使用户程序停止并且开始与调试器通讯, 当 uVision调试器收到请求信号后,8051 就会开始执行程序。
ISD51 的副作用
- 仅在 ISD51 的中断和全局中断系统有效后才能运行。 当然可以使 ISD51 在程序片段调试时停止运行。
- 甚至允许ROM中的中断。 一旦软件断点被设置好, 8051 的程序在 ISD51 中断函数控制下运行并且执行速度会被降级100x (程序运行速度将会比原来慢100倍).
- 如果8051 中断函数拥有的中断优先级别相比 ISD51 相同或者更高级的中断,要实现断点或程序单步就不能了。
- 如果ISD51 中断被允许,就有可能在并未按 uVision调试器的 Stop 工具按扭情况下,使8051 程序停止运行。
使ISD51 和用户程序整合
要将ISD51加入你的设计,可以按以下步骤进行。
- 将 ISD51.A51 和 ISD51.H 从/C51/ISD51复制到你的项目夹(folder)里。
- 将 ISD51.A51 加入你的 uVision 项目(project)。
- 将 ISD51.H 加入到 C 主程序函数里面(即在main()内使用 #include "ISD51.H"语句).
- 检查ISD51.H的配置设置,如果有必要可以根据你目标硬件的需要修改。默认的配置适合标准的带有256字节DATA/IDATA和带有标准的8051内部串口的标准8051器件。
- 将串口的初始化代码加入到你的C主函数里面,主要是波特率,工作方式等
- 将适当的 ISD51 初始化函数 加入到你的 C 代码中。
- ISDinit: 初始化 ISD51 并开始用户程序。 当 uVision 调试器连接上, 程序就会停止运行。
- ISDwait: 初始化 ISD51 并等待一直到uVision调试器连接上。
- ISDcheck: 检查 uVision2 调试器是否已经连接上 8051。如果是, ISD51 中断就会被初始化。如同典型的嵌入式代码的主循环一样, ISDcheck 会被周期性的调用。
- 编译用户程序并且将其用一般编程器烧写到 8051 器件内。
ISD51 应用程序接口例行程序
ISD51 提供了数个定义您可以使用。这些宏指令定义原型在 /C51/ISD51/ISD51.H 可以找到。
-
void ISDinit (void)
这个例行函数用于初始化 ISD51 和 uVision调试器通讯。 当输入这个函数后你的用户程序会依然正常运行。 -
void ISDwait (void)
该函数出事始化 ISD51 使其与 uVision调试器通讯并且等待直到和其通讯已经正常了。这个函数将在 Vision2 调试器与 ISD51连接成功后才返回。 -
void ISDcheck (void)
该程序用于检查 uVision调试器正在与8051试图连接。如果是, ISD51 被初试化用于与 uVision调试器通讯。 ISDcheck 可能会被用户程序周期性地调用。 -
void ISDbreak (void)
该函数用于强迫执行ISD51 的中断功能。它允许你将核心中断加入你的用户程序。 在调用该函数之前,uVision 调试器应该已经和用户硬件建立了连接。 -
void ISDdisable (void)
该函数用于取消ISD51 中断,以允许你从你的用户程序的软件断点中保护临界程序序列。只要该函数被调用,就不再允许单步或设置软件断点直到 ISDenable 函数被调用。 -
void ISDenable (void)
该函数使 ISD51中断允许。 调用 ISDdisable 后, 你必须调用 ISDenable 使 ISD51 中断允许。
设置 uVision以适应 ISD51
一旦将ISD51加入到你的程序中, 你就可以设置 uVision调试器用于和 8051 目标系统的通讯。
- 在你开始 uVision调试器前,运行 8051 应用目标系统。
- 在uVision中, 选择 Project - Options for Target - Debug: Use: Keil ISD51 In-System Debugger.
- 在同一会话框中, 选中 Load Application at Startup 以便 uVision2 调试器为你的 8051 用户程序进行特征引导。
- 同一对话框中, 去掉 Go till main 的选择。你的用户程序将在8051目标系统的硬件复位后开始运行。
- 在同一对话框中, 打开 ISD51 驱动设置对话框设置以下各项:
COM 端口设置
- 端口: PC COM 端口用于连接至 8051 目标硬件。
- 波特率: 与 8051 目标硬件通讯的波特率。
- RTS 逻辑: 与 COM 端口的 RTS 信号线相连 (见下文)。
- DTS 逻辑: 与 COM 端口的 DTS 信号线相连 (见下文)。
RTS 和 DTS 的设置
- Active: 信号在 uVision调试器通讯的期间总是有效的。
- Inactive: 信号在 uVision调试器通讯期间总是无效的。
- Reset Active: 按 uVision 调试器的 Reset 命令后信号将会有500毫秒的有效。
- Reset Inactive: 按 uVision2 调试器的 Reset 命令后信号在500毫秒内是无效的。
存储器设置
ISD51 驱动工具数据缓存更快的在屏幕上更新。
- 关闭缓存选项用于当你停止程序运行后看到实际(非缓存) 来DATA (和 SFR), IDATA, 或者 XDATA空间。这个方法使你看到的是当前的来自 I/O 端口, 定时器或外围设备的存储映像的数据。
- 允许缓存设置以获得最大的性能。
代码的断点设置
这里的设置是 ISD51 究竟使用软件断点, 硬件断点, 还是两者的组合。
- 如果你的 8051 目标器件不支持硬件断点, 你只能选择软件断点。
- 如果你的 8051 目标器件支持硬件断点, 当没有硬件断点可用的时候,你必须使用软件断点。
各种各样的设置
核实ROM中的运用程序和当前项目 设置选择在初始化ISD51通讯时是否要让 uVision ISD51 Debugger 驱动程序比较 8051 目标系统的程序代码和当前项目的程序代码。为了速度加快调试器和目标系统连接时间,你可以取消这个选项。
ISD51 识别
当 uVision Debugger 连接到运行于 8051 目标系统的ISD51上时显示版本号和情况信息。在调试期间你可以打开 ISD51 驱动设置框查看这些信息。
使用ISD51进行调试
uVision Debugger 一经设定, 您就可以点击 Debug - Start/Stop 开始调试。 uVision Debugger 通过 ISD51 软件连接到 8051 目标系统。
ISD51 支持很多的 uVision debugger 功能。比如,你可以在整个代码期间执行单步,设置断点,并且运行您的应用系统。使用标准的调试器功能能看到变化量。
当使用 IDS51 时 uVision的约束
在使用 ISD51 和 uVision2 调试器的时候有一些您必须注意的约束。
- 是不可能使用DEBUG的 - 内存映像在改变 8051 系统的存储变换. 这是因为 8051 目标系统的内存变换依靠硬件组件。
- 分析器的性能,调用堆栈,代码覆盖,并且 ISD51 的单步命令是不可用的。
- 窗口定时更新设置可能会在使用 ISD51 时失效。
疑难解决
如果 uVision2 调试器没有能够和 ISD51 硬件连接起来,您首先应该核实目标系统的串口是否被正确配置。如果您在使用 uVision仿真时出现问题,应该检查以下各项:
- 选择 Project - Options for Target - Debug: Use Simulator.
- 用 Debug - Start/Stop Debug Session 开始进行程序的仿真。 这将用户代码装载到仿真模式。
- 开始运行用户代码 (Debug - Go).
- 核实 UART 在 Serial Port 对话框 (Peripherals - Serial)的设置。 如果你在 Project - Options for Target - Target - Xtal 中输入了正确的 XTAL 频率,波特率会被显示正确。 通常,波特率不会超过 PC 波特率的 100%,但也不能少于2.5%。
- 检查串口通讯
- 打开串口通讯窗口 (View - Serial Window).
- 在串口窗口上击右键并且相应的从菜单中选择 Hex 模式。
- 为了要在串行数据流中输入 0xA5 字符串,在命令窗口中输入 sin=0xA5 。
如果一切设置正确但一直不能连接到 IDS51 硬件, 您的 8051 代码可以在初始化串口后可以调用 following 函数。
/* * 测试功能: 使用超级终端核实串口通讯 */ void TestSerial (void) { char c = 'A'; TI = 1; while (1) { if (RI) { c = SBUF; RI = 0; } while (!TI); TI = 0; SBUF = c; } }
此函数通过串口输出 A 字符串。如果你通过串口传送一个字符串到用户程序,那个字符将会被替代传送。你可以像超文本终端一样检查这个用户终端程序并观察是否 8051 正确地输出一个 A 字符。