KEIL中的ISD51仿真软件详细使用说明

发布者:meilidaowl最新更新时间:2017-12-29 来源: eefocus关键字:KEIL中  ISD51  仿真软件 手机看文章 扫描二维码
随时随地手机看文章

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
#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的断点不会有效,即使断点工作,也不可能区分是读访问还是写访问。 


关键字:KEIL中  ISD51  仿真软件 引用地址:KEIL中的ISD51仿真软件详细使用说明

上一篇:8*8点阵流水显示程序与原理
下一篇:利用51单片机实现IO口模拟串口

推荐阅读最新更新时间:2024-03-16 15:50

keil的51单片机仿真调试如何查看内存的内容
在Keil中,玩过51的朋友都知道,调试时编译器给出了寄存器窗口(Register)、中断系统窗口(Interrupt System)、I/O口查看窗口(I/O ports)、串口和定时器设置窗口(serial、Timer)但是如何查看某一块内存区域的内容呢? 在Memory窗口中输入址值,得到的结果是程序代码区的内容,由于51是采用的是哈佛结构,程序指令存储和数据存储分开。要查看各种内存区域的内容,只要在Address框内输入 字母:地址 即可显示相应的内存值。其中字母可以是C、D、I、X,分别代表的意义是: C:代码存储空间 D:直接寻址片内存储空间 I :间接寻址片内存储空间
[单片机]
keil mdk如何确保某一段程序不被优化掉
使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它: void (*UserProgram)();        //函数指针 UserProgram = (void (*)()) (0x00002000);  //定位到指定的入口地址0x00002000 (*UserProgram)();               //调用test()函数 这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默
[单片机]
Keil C51单片机变量的使用方法解析
8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 一、CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在
[单片机]
<font color='red'>Keil</font> C51单片机<font color='red'>中</font>变量的使用方法解析
【STM32】KeilDebug模式下全局变量的实时查看
在使用Keil开发环境编写stm32程序时我们经常会用到硬件在线仿真的功能,能在watch窗口中看到我们在程序中定义的全局变量。我们希望在程序实时运行中看到变量的变化情况,但有时不能实时查看,原因是软件的设置不对。 在Debug模式下,点击菜单栏下的View,在下面有一个Periodic Window update 点一下,选定一下就行了。
[单片机]
ARM硬件仿真软件SkyEye使用简介
SkyEye是一个开源软件(opensource software)项目,中文名字是“天目”。SkyEye的目标是在通用的Linux和Windows平台实现一个仿真集成开发环境,模拟常见的嵌入式计算机系统(目前支持基于arm7tdmi的AT91开发板);可在SkyEye上运行uclinux以及uC/OS-II等多种嵌入式操作系统,并对它们进行源码级的分析和测试。SkyEye的推出具有下面两方面的意义:   首先,通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境的用户来说,它将是一个非常有效的学习工具和开发手段。因此,如果您想学习Liunx操作系统或者进行嵌入式系统开
[单片机]
keilstartup.a51的作用
startup.a51 的作用:和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char DATA xxx= 100 ;,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51 ==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域, 如堆栈区,将不会有赋值或清零动作。 有人喜欢改 startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改 startup.a51来实现是很笨的方法,实际只要利用非变量
[单片机]
keil5找不到lpc2368的解决方法
在用lpc2368的时候在MDK5 Software Packs找不到lpc236 在官网搜寻了一番找到了这个 下载后完美解决问题
[单片机]
<font color='red'>keil</font>5<font color='red'>中</font>找不到lpc2368的解决方法
珞石RokaeStudio机器人离线编程与仿真软件重磅发布
广告摘要声明广告 近日,珞石机器人重磅推出机器人离线编程与仿真软件——RokaeStudio。RokaeStudio融合了多项核心技术,可满足不同用户不同项目的多重需求,包括方案设计、设备选型、轨迹生成、轨迹优化、仿真调试和代码生成等,覆盖机器人应用的完整生命周期,一站式解决机器人应用时的各种难题。 RokaeStudio 核心功能与特点 #01 更简单的操作界面 RokaeStudio操作界面简洁易用,功能布局清晰流畅,用户可轻松上手使用,使得工作效率倍增。 图|软件操作界面 #02 更开放的场景搭建 ■ RokaeStudio提供机器人库、设备库、工具库等丰富的云端资源库,涵盖珞石工业机器人、协作机器人所
[机器人]
珞石RokaeStudio机器人离线编程与<font color='red'>仿真软件</font>重磅发布
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved