ISD51仿真软件的使用
Keil公司推出的Keil7.0以上的版本,均带有一个ISD51(In System Debugger)的工具软件,它可以让使用者在无
硬件仿真器的情况下,借用目标硬件的
串口(UART),完成单步、断点的仿真。这对许多
开发者,尤其是初学者来说无疑是一个最节省开发成本的方法。
一、ISD51的介绍
ISD51文件位于\Keil\C51\ISD51目录下,由两个文件组成:ISD51.A51,ISD51.H。其中还有一个ISD51.HTMML说明文件,说明ISD51的使用。
ISD51。H是一个头文件,内部定义了许多变量、宏等功能子
程序,运行函数全部在ISD51。A51中。如果要使用ISD功能,必须要将上述两个文件蕴涵进用户程序中!同时在主程序中还要不断地调用ISD51的子程序ISDcheck(),才能完成仿真!
ISD51有近600个字节,连接进用户程序后,加大了用户程序的长度,也许会造成本来可以放入89C51的程序而不得不放入89C52。为此必须在用户程序中进行必要的条件编译,调试时选用89C52,而运行时不把ISD51编译进来,这样就可解决问题。
二、ISD51的使用
ISD51仿真是借用串口(UART)与Keil通讯完成仿真的。因此用户的UART口被禁止,同时还需要添加一个RS232电平转换
接口(见图1)。采用3线式完成通讯!
图表 1
例程见下:
#include <reg51.h>
#include "Isd51.h"
#define DEBUG 1 //调试时打开
void InitUart(char bps); //UART初始化
void main (void)//主程序
{
#if DEBUG
InitUart(4); //波特率=9600 @ 11。0592MHz
#endif
while(1)
{
#if DEBUG
ISDcheck();不断通讯
#endif
/* 用户程序
。。。。。。。
*/
}
}
//串口初始化程序
void InitUart(char bps){
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
if (bps==1) TH1=0xE8; //BPS=1200
if (bps==2) TH1=0xF4 ;//BPS=2400
if (bps==3) TH1=0xFA;//BPS=4800
if (bps==4) TH1 =0xFD;//BPS=9600
if (bps==5) {
PCON|=Ox80;//BPS=19。2K
TH1 =0xFd;
}
TL1=TH1;
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
}
编程时必须将ISD51。H,ISD51。A51考入目标目录下。void Inituart(char bps)是通讯波特率设置函数,程序开始必须调用,可根据目标板的实际情况改变。程序中定义了DEBUG条件编译
开关,通过它控制ISD51是否被编译进用户程序。
三、调试步骤
1:用Keil软件编译用户程序生成HEX文件烧入MCU,连接好硬件。
2:在Keil开发软件中对用户项目进行如下设置:(必须!)
打开“project”->"OPtions for target XXXX"菜单出现:
图表 2
选择好工作频率。
3:选择“DEBUG”出现:
图表 3
选择Keil ISD51 In-System Debugger。
4:选择“Settings”出现:
图表 4
根据目标板的
参数,设置通讯口,波特率。
5:退出设置菜单,启动“DEBUG”菜单,便可以开始ISD51仿真!
四、总结
ISD51软件仿真为用户提供了一种廉价的开发方法与目前流行的JTAG仿真类似。但毕竟是通过软件完成各项功能的,因此存在占用资源多、速度慢等缺点。
五、ISD51的中文注释:
ISD51综述
ISD51工作
原理将ISD51功能添加到用户程序
ISD51 API 函数
配置uVision2 和 ISD51
使用ISD51调试
错误排除
已知问题
TechnICal Support
Contact Details
ISD51 In-System Debugger 综述
ISD51 (In-System Debugger 在系统调试) 为8051用户程度提供了一种新的调试监测
技术。 ISD51是可配置的函数库,你可以连接到你的用户程序,通过8051片上串口来实现程序测试。
ISD51的软件和硬件需求都很小。它可以运行在片外或片内代码空间,并且不需要特殊的硬件支持,例如: von Neumann-wired memory。
ISD51可以工作在象Philps LPC这样的非常小的8051器件上,同时也可以工作在一个访问完全CODE和XDATA空间的完整8051系统上。
特性使用单步运行和多个软件断点来控制程序的运行。
查看、修改CPU 寄存器和存储器内容。
访问特殊功能寄存器(SFRs)。
支持硬件断点寄存器(在某些8051派生器件中存在这些寄存器)。
当没有设置软件断点时,全速执行8051用户程序。硬件断点不影响执行速度。
资源需求
一个8051兼容的片上串口(UART)。
使用8051指令集的8051兼容器件。
500-700 bytes的程序空间—取决于SFRs的数量。
6 bytes的堆栈空间。
1 byte IDATA RAM.
每定一个一个软件断点增加2 bytes IDATA RAM。
限制
目前版本的ISD51有以下限制:
不支持8051扩展
指令集。这表明ISD51不能工作在Philips的80C51MX或Dallas的Contigious模式下。
不支持Code banking。
优点
不需要对你的硬件系统作特别的修改。
ISD51可以在任何标准8051系列器件上。ISD51不能工作在使用扩展指令集的Philips的80C51MX或Dallas的Contigious模式下。
程序代码可以存储在片内Flash/EPROM/ROM或片外EPROM。
不需要von Neumann memory、XDATA空间、寄存器、位可寻址空间。
ISD51可以使用在用户的最终产品上。 ISD51 firmware是不需要特许权使用费的。
ISD51 protects your SOFtware investment since it may only be used when the original source code is available.
工作原理
ISD51在你的用户程序中为8051 UART添加一个串口中断函数(ISD51中断)。 当ISD51连接到uVision2调试器时,8051进入ISD51中断函数。当用户程序停止运行时,8051程序只运行ISD51中断函数。 当uVision2调试器发出Go命令,8051离开ISD51中断函数并执行用户程序。
如果没有设置断点或所有断点都是硬件断点,8051以全速执行用户程序。如果设置了软件断点,8051在每个CPU指令后进入ISD51中断函数。ISD51中断函数检查8051程序是否已经到达一个断点,如果已经到达一个断点,ISD51开始和uVision2调试器通讯。因此在使用 软件断点后,8051程序以比较慢的速度执行(大概为100倍)。
当其他中断的优先级被设置和ISD51一样或更高时,这个中断函数是不能被设置断点或单步执行的。ISD51中断函数缺省使用中断优先级0.
uVision2调试器发送一个0xA5字符给ISD51中断函数来停止用户程序并开始和调试器通信。基于这个原因,当调用uVison2调试器时,用户程序必须被开始。
ISD51 Side Effects
只有在ISD51中断和中断系统被允许时ISD51才工作。你可以在运行关键程序段的时候关闭ISD51操作。
允许在ROM设置断点。如果设置了软件断点,8051程序在ISD51中断函数控制下以慢大概100倍的速度运行。
当其他中断的优先级被设置和ISD51一样或更高时,这个中断函数是不能被设置断点或单步执行的。
当ISD51中断被允许后,可以通过uVision2调试器的Stop按钮来停止8051程序的执行。
将ISD51集成在用户程序中
将ISD51功能加入到你的
应用中,以下几步是必须的:
1:把\C51\ISD51目录下的ISD51.A51、ISD51.H复制到你的项目文件夹中。
2:把ISD51.A51 添加到你的uVision2项目中。
3:在main函数所在的模块中包含ISD51.H 。(使用 #include "ISD51.H")
4:检查ISD51.H 中的配置设定并根据你的目标硬件修改设置。缺省配置为:有256 Bytes的内部DATA/IDATA和8051兼容片上串口的标准8051器件。
5:在你的C主函数中为片上串口添加波特率初始化代码。你可以从以下示例代码中复制这段6:初始化代码:\C51\EXAMPLES\HELLO 。
7:在你的代码中添加适当的ISD51 启动函数 。
8:ISDinit: 初始化ISD51并启动用户程序。当连接到uVision2调试器时,用户程序执行被暂停。
9:ISDwait: 初始化ISD51并等待与uVision2连接。
10:ISDcheck: 检查uVision2调试器是否已经连接到8051;如果已经连接,ISD51中断被初始化。 ISDcheck 必须被定时调用,例如在一个典型的嵌入式程序中,将它放在main函数的主循环中。
11:创建用户程序并烧写到8051器件中。
12:将ISD51添加到用户程序中的示例在\C51\ISD51\EXAMPLES文件夹中。
ISD51 API 函数
ISD51提供了几个可以在用户程序中使用的函数。这些函数和宏定义在\C51\ISD51文件夹中的ISD51.H文件中。
void ISDinit (void)
这个函数初始化ISD51与uVision2调试器的通信。在调用这个函数后,你的用户程序以正常速度连续运行。
void ISDwait (void)
这个函数初始化ISD51与uVision2的通讯并且一直等待到与调试器通信成功。这个函数在调试器连接到8051前不会返回。
void ISDcheck (void)
这个函数检查uVision2调试器是不是尝试与8051连接,如果是,ISD51初始化与uVision2调试器的通信。 这个函数应该在你的8051用户程序中周期性调用。
void ISDbreak (void)
这个函数强制执行ISD51中断函数。这允许你添加硬代码断点(hard-code breakpoints,指断点写死在代码中)到你的用户程序中。在调用这个函数前,uVision调试器必须已经连接到你的硬件。
void ISDdISAble (void)
这个函数禁止ISD51的中断,这样你可以保证你的关键程序段不会被软件断点打断。调用这个函数后,不能使用单步执行和软件断点功能,一直到 ISDenable 被调用为止。
void ISDenable (void)
这个函数允许ISD51的中断。在调用ISDdisable 函数后,你必须调用ISDenable 来重新允许ISD51中断。
Configuring uVision2 for ISD51
当把ISD51添加到你的程序中,你可能需要配置uVision2调试器与8051目标系统的通信。
在你开始uVision2调试器前,运行目标系统上的8051程序。
在uVision2,选择Project - Options for Target - Debug: Use: Keil ISD51 In-System Debugger.
在同一个对话框中,允许Load Application
at Startup,这样uVision2调试器就可以调入你的8051程序的符号(标号、断点等)信息。
在同一个对话框中,禁止Go till main。你的用户程序将有8051目标系统的硬件复位启动。
在同一个对话框,打开ISD51 Driver Settings对话框设置以下选项:
COM Port Settings(PC串口设置)
Port(端口): 选择用于连接到8051目标系统的PC串口。
Baudrate(波特率): 与8051目标系统通信的波特率。
RTS Logical(RTS逻辑): PC串口的RTS线的
信号电平(参见下面)。
DTS Logical(DTS逻辑): PC串口的DTS线的信号电平(参见下面)。
RTS 和DTS 设置
Active(有效): 在uVision2调试器通信期间一直为有效电平。
Inactive(无效): 在uVision2调试器通信期间一直为无效电平。
Reset Active(复位有效): 在uVision2调试器的复位命令后保持有效电平500毫秒。
Reset Inactive(复位无效): 在uVision2调试器的复位命令后保持无效电平500毫秒。
Cache Options(缓存设置)
ISD51可以使用数据缓存来提高屏幕更新速度。
禁止缓存可以在你暂停运行程序时观察DATA (包括SFR), IDATA, 或XDATA空间的实际数值。这样设置你可以确信你正在观察的就是I/O端口、定时器、基于存储器编址外设的实际数值。
允许缓存提供最高性能。
Code Breakpoint Options(代码断点选项)
这个设置设置ISD51使用软件断点还是硬件断点,或者同时使用两种断点。
如果你的8051器件不支持硬件断点,你必须选择software breakpoints only(只使用软件断点)。
如果你的8051器件支持硬件断点,当没有硬件断点可以使用时,你必须使用软件断点。
Miscellaneous Options(杂项设置)
Verify if Application in ROM is identical to current Project 这个选项允许uVision2 ISD51 调试器
驱动在初始化ISD51通信时比较8051目标程序代码和当前项目代码是否相同。为了提高调试器连接到目标系统的时间,你可以禁止这个选项。
ISD51 Identification(ISD51识别)
当uVision2调试器连接到8051目标系统中正在运行的ISD51时,这个框显示ISD51的版本和其他信息。在调试中,你可以打开ISD51驱动设置对话框来查看这些信息。
Debugging with ISD51(使用ISD51调试)
当uVision2调试器配置好以后,你可以用菜单Debug - Start/Stop Debug Session来开始调试。 uVision2调试器通过ISD51软件来连接8051目标系统。
ISD51支持大部分的uVision2调试器功能。例如:你可以单步运行代码、设置断点、运行你的应用程序,变量可以通过调试器的标准功能来查看。
uVision2 Restrictions When Using IDS51(使用ISD51的限制)
当使用uVision调试器和ISD51时,你必须考虑以下几个限制:
不太可能使用调试--8051系统改变存储器的编址方式。因为这时的存储器编址依赖于硬件器件。
ISD51不支持性能分析(Performance Analyzer),调用堆栈(Call Stack)、代码覆盖(Code Coverage)、步出命令(Step Out command)。
可能不能使用PerioDIC Window Update(周期窗口刷新)选项。
Troubleshooting
如果uVision2调试器不能连接到ISD51硬件,你首先应该检查目标系统的串行通信是否正确配置。你可以通过以下的uVision2仿真功能来检查。
选择Project - Options for Target - Debug: Use Simulator。
使用菜单Debug - Start/Stop Debug Session开始仿真。
开始运行用户程序(Debug - Go).
使用串口对话框检查UART(Peripherals - Serial)的设置。如果你在项目属性里输入了正确的晶振速度(使用Project - Options for Target - Target - Xtal输入),这时显示的波特率就是实际你的串口波特率。这个波特率不一定和PC串口的波特率100%相同,当应该在相差2.5%之内。
检查串行通信。
打开串口通信窗口 (View - Serial Window).
在窗口内点击鼠标右键,选择Hex Mode。
在命令窗口内输入sin=0xA5。
uVision2仿真器应该会仿真ISD51中断并在串口通信窗口显示0xF7和6个以上十六进制数值。
如果一切配置都正确仍无法连接ISD51硬件,你的8051程序可以在初始化串口后调用这个函数。
/*
* Test Function: verify serial communication with HyperTerminal
*/
void TestSerial (void) {
char c = 'A';
TI = 1;
while (1) {
if (RI) {
c = SBUF;
RI = 0;
}
while (!TI);
TI = 0;
SBUF = c;
}
}
这个函数不断从串行口输出一个字符 A 。如果你通过串行口传送一个字符给用户程序,那么用户程序将不断发送这个字符。你可以在PC机通过超级终端之类的软件来测试8051是不是成功发送字符 A ,当你改变这个字符是,是不是会发生相应的改变。
已知问题
这一节列出ISD51 In-System Debugger的已知问题.
TI MSC1210的硬件断点
TI MSC1210提供硬件断点寄存器,使用硬件断点后,可能会产生以下问题:
在断点后执行两条CPU指令以上,程序执行可能会停止。
在断点后立即执行单字节或双字节CPU指令可能会导致程序停止运行。
访问XDATA的断点不会有效,即使断点工作,也不可能区分是读访问还是写访问。