主要的仿真调试软件帮手有如下几个:watch 窗口;memory 窗口,register 窗口。读者在程序编译暂停时可以对程序中的各种变量和寄存器进行观测。具体的方法是选中要观测的变量,然后右键点击,在弹出的菜单中选择watch 便会出现图6-8 所示的watch 框。

Watch 选择框由3 部分中第一部分为变量名,第二部分为变量类型,第三部分为观测变量的取样个数。这里是第二部分需要注意,但读者不选择观测变量的类型会默认为自动,即C language 。该类型的含义是指由读者在编程中所定义的各种变量,但不包括硬件中的寄存器。如果读者要观测的是一个寄存器的值,而使用的类型时自动或者C 语言,则此时观测的实际为该寄存器在硬件中的存储地址。然后读者要根据地址在memory 窗口中去查找该地址下实际的值,才能真正找到正确的存储器值。当然更简单的方法是当观测值为寄存器值时,将类型选择为第三个Assembler 。这时在watch 窗口下观测到的便是该寄存器的实际值了。
watch 窗口只能在程序仿真运行的中断期间,才能显示,故无法对要观测的值进行连续的测试。

memory 窗口,memory 窗口主要用于对连续地址下的存储值进行有效的观测。它在总线传输中,判断传输是否正确能起到非常重要的作用。具体的应用将在异步传输中结合实例作进一步说明。
在调试程序时,为了对程序的部分段代码的逻辑进行细致的观测,我们通常会设置断点。设置断点的方法很简单,只要在Debugger 的暂停模式下,点击要设置断点的代码前的小圆圈即可。设置好断点的区域如图6-10 所示。

当要解除掉这些断点时,可以在设置断点的红叉处在点下,即可取消。也可以在主菜单中,选择Debug 。在Debug 的下拉菜单中选择Breakpoints ,便会看到如图6-11 的弹出菜单。

以清楚地看到已有断点所在的地址和代码段,并可以根据自己的需要设置新的断点或删除已有断点。上面的Debugger 的工具均可以在软件仿真和硬件仿真中,合理的使用这些工具可以有效的提高检查各种语法和逻辑错误的效率,节约时间,更快更好的编写出代码。
Mix Display
在Debug 中选择Mix Display 时,C 语言源程序与对应反汇编代码将会同时在代码中显示,同时程序执行时也将按照汇编代码段一步一步地进行运行。具体操作方法是在Debug 下右键点击,然后在弹出框中选择Mix Display 即可得到下面编译结果:

可以看到当运行Mix Display 时,断点设置也将按照反汇编代码的每一步进行设置。同时由于Softune V3 支持在C 中嵌入汇编代码,因此当有些地方必须要用到汇编,而编写人员又想不起汇编代码该如何编写时,便可以使用Mix Display 。先将要用到汇编用C 写出,再由Mix Display 自动编译为汇编,再带入到程序中即可。
执行和中止程序
要连续执行程序可以点击如图6-12 ,点击程序将一直运行,除非遇到中断或断点,否则不会停下。

有些时候为了进行对代码段进行局部的检测,除了设置断点外,我们还会是用到单步运行和一些其他运行方式。这里如图6-13 所示

在连续运行的右边第一个,便是单步运行(Step in),点击该图标时,程序将完全按照代码一步一步的执行。在单步运行右边是Step over,其作用是直接跳过循环运行下一句代码。运行它主要是在确定部分程序正确性的条件下,节约时间。再右边的是Step out ,即跳出循环。它的作用和Step over 类似都是为了节约调试时间,提升效率。最右边的是Reset,顾名思义就是重置MCU,这在进行完一次调试后,到需要带MCU 重置下,以防对接下来的调试产生干扰。
中止运行,当然就是为了停止目前正在执行的程序。图标为:
。
当工程建立完成,Softune V3 配置完成,工程代码通过编译,那么最后就是要进行仿真了。在工程窗口可以看到最下面有一个Debug 文件夹,Debug 文件夹要装的就是软件仿真和硬件仿真文件,而在设置之前装的是一个*.sup 的文件。双击该文件,就可以弹出仿真对话框,然后按照对话框的指示设定软件和硬件仿真。
6.3.1 软件仿真(Simulator Debugger)
Softune V3 的软件仿真(Simulator Debugger )设定如下,要进行8FX 芯片的仿真右键点击Debug 文件夹,选择Add Setup ,再选择New。这时便会弹出Create New Setup 窗口,输入要创建的新的Debug 文件名。创建完Debug 文件名后,按照指示便可以进入Setup Wizard 对话框了,如图6-14 所示。

Simulator Debugger 点击下一步,然后一直选择默认的设置即可。这里结合下面的程序介绍如何软件仿真调试
#include "mb95100.h"
const unsigned char seg_display[12] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0xff, 0x00 };
/*************************************************************************/
/* Main Routine */
/*************************************************************************/
unsigned long delay;
char counter;
void main(void)
{// initialize I/O-ports
PDR0 = 0xff; // Port 0:
DDR0 = 0xff; // 7-Segment display (all segments off)
PDR1 = 0x00; // Port 1:
DDR1 = 0xfe; // P10 = UI0 = Input; other pins are set to output 'L'
// 初始计数设为0
counter = 0;
// 进入主循环,LED 将在循环中不停的显示各种值
while(1)
{
PDR0 = 0xFF;
PDR0 = seg_display[counter];
for(delay = 0; delay < 10000; delay++)
asm("\tNOP");
counter = counter + 1;
if (counter == 10)
counter = 0;
}
}
进入Simulator 后,选中counter 后点击右键,在弹出的选项框中通过watch 窗口观测counter 的值。前面介绍过入watch 窗口观测的值为变量,则设为C 语言;为寄存器则设为Assembler ;这里设置C 语言。按照类似的规则,再在watch 窗口中观测PDR0 端口寄存器。可以得到如图6-15。

在该窗口下可以看到counter 和PDR0 的值,初始值为0。然后可以在程序中设置断点,让其进行周期性的运行,就可以看到counter 和PDR0 的值发生变化。可以看到当counter = H’01 时PDR0 = H’06。因为PDR0 输出的是counter 的LED 显示码。如果在P0 口接入了7 段LED,同时执行的是硬件仿真那么LED 就应该会显示1。同时当程序执行了10 次后,就
应该让counter 回到0。
由上可知,通过watch 窗口和寄存器窗口,Simulator Debugger 可以对程序的一些基本语法和逻辑进行检测,但因为是脱离了硬件进行的测试。所以对于实际中各种硬件在时序以及其他的一些要求是否满足上,并不能找到答案,帮助有限。例如如果要涉及到必需的硬件支持,如ADC ,各种总线调试。由于在调试时,必须使用硬件功能,那么软件将几乎无法对最终的硬件调试起到任何的帮助作用。
此外软仿真使用的工具和可以实现的功能如watch 窗口和寄存器窗口,硬件仿真都可以完成,而且部分工具如寄存器窗口在进行一些特定的硬件调试中,可以对程序的验证起非常好的帮助作用。故现在不十分推荐使用软仿真功能。
6.3.2 硬件仿真(Emulator Debugger)

由于现在用户所使用的8FX 系列的晶振统一为4MHz 所以在设定主时钟频率时,也要设定为4MHz ,否则在编译时序时会出现问题。其他方面用户可以直接采用默认设置便可。
使用Emulator 时,必须连接用户开发的目标系统,通过借助于Emulator 来排除目标系统样机中的程序错误和硬件故障。
6.3.3 Monitor Debugger 在线仿真
Monitor Debugger 是目前富士通公司正对目前单片机程序硬件调试困难,而专门编写的新的软件。通常的硬件调试及程序编写,需要使用评估板先对编写程序进行调试,在烧写到实际的单片机MCU 中,这样既麻烦又费时费力费钱。Monitor Debugger 出现后,使得程序直接在实际使用的单片机MCU 中进行调试变为可能。
在使用Monitor Debugger 在线仿真之前,首先必须要注意的是使用Monitor Debugger 在线仿真的工程代码与之前的用软硬件仿真代码有很大的不同。使用Monitor Debugger 在线仿真的工程代码如图6-17 所示

在图6-17 中,可以发现相比普通的工程代码,在线仿真代码多了很多新的子文件。其中,与在线仿真极为相关的有ASM 文件夹里的fgm_cfg.asm,C 文件里面的FGM.rel, autoboot.c 以及Include Files 里面的fgm.h 和fgm_cfg.h 。这几个文件直接涉及在线仿真,不能进行随意修改。笔者建议如果要进行在线仿真,则最好不要修改上述的任何文件。这些文件可以在富士通公司的网站以及本书的附录里面找到。
在这几个文件中,fgm_cfg.h 头文件会对读者的在线仿真设置产生影响,期代码如下:
/* Start address */
.IMPORT __start
#define USER_STARTADR __start
/* Stack top */
.IMPORT STACK_TOP
#define USER_STACKTOP STACK_TOP
/* Auto-boot address */
.IMPORT _AutoBootCheck
#define USER_ABOOTADR _AutoBootCheck
/* password (4byte) */
#define USER_PASSWORD 0xFFFFFFFF
这里需要注意的是最后一句:#define USER_PASSWORD 0xFFFFFFFF。在进行在线仿真设置时,会要求程序员输入在线仿真密码,就是这里的0xFFFFFFFF。
要进行在线仿真的流程如下,必须首先将调试好工程后生成的.mhx 工程对应机器代码烧入进单片机中。即使用Monitor Debugger 的USB 编程器烧入进实际的单片机,可以进入如图6-18 的烧录界面,根据用户实际拥有的富士通单片机选择该单片机的家族和对应的型号,同时选择晶振频率,一般均为4MHz 。然后点击Full Operation(D+E+B+P) 就可以将整个编写的程序烧录进取。当然也可以由下面的Download 按键一步一步依次完成,结果也是一样的。

烧入完成后,回到Softune V3 界面中。和软硬件仿真类似,在Debug 文件夹里面选中Monitor Debugger ,或者单击右键,依照提示执行后会出现如图6-17 的界面。

选择Monitor Debugger 点击下一步。系统会询问你进行Debug 的开始密码,这里按照刚才所介绍的输入进密码,点击下一步。然后会要你设置接口,选项其实只有一个就是默认项USB 接口,以后会要求你设置时钟晶振,和普通设置一样通常为4MHz 。以后按照默认设置即可。设置完成后Softune V3 界面会进入和普通软硬件仿真类似的调试界面,既说明你已经进入到在线仿真的调试中去。
Monitor Debugger 在线仿真作为富士通最新设计的调试工具,有其出色的一面也有其不足之处。总结如下:
使用Monitor Debugger 在线仿真的优点在于可以直接在单片机中烧写和调试,保证调试的准确性,调试成功则立即可以在单片机中实现功能,避免了因为仿真器与实际芯片差异所导致的在仿真器中调试通过的程序可能无法在芯片中完全实现功能的尴尬。同时出现此类情况时,要进行矫正是非常麻烦和困难的。
缺点在于因为仿真程序代码都必须直接拷入对应单片机中进行调试,而实际单片机在调试时不如测试芯片和仿真硬件那样进行过专门的优化,所以调试速度很慢。在进行单步调试时,这种缺陷表现得尤为明显。
此外,使用Monitor Debugger 在线仿真在设置断点时,最多只能设置两个断点。而如果是普通的硬件仿真,可以设置大量的断点,以方便监测。


