1.单步性能的测试 测试说明:单步是仿真器设计中比较难实现的功能。照通常的理解,用户每执行一个单步应该准确实现理想运行的单步性能。例如,运行一个机器周期的指令,内部的所有时序应该都动作一个机器周 期而不能出现不动作或动作过度的现象。不过很遗憾的看到国内的仿真器多数不能达到这个指标。 测试程序: ORG 0000H SETB TR0 /* 打开定时器0 */ TestStart: NOP /* 定时器0 运行1个机器周期, TL0 加1 */ MOV A,#0FFH /* 定时器0 运行1个机器周期, TL0 加1 */ MUL AB /* 定时器0 运行4 个机器周期, TL0 加4 */ LJMP TestStart /* 定时器0 运行2 个机器周期, TL0 加2 */ END 测试步骤 (1) 照您当前使用的仿真器要求测试上面的程序; (2) 在运行前打开TL0 的显示,以便单步运行后能观察TL0 的变化; (3) 使用当前仿真器环境提供的单步功能开始单步运行; (4) 单步运行后检查TL0 变化的数值是否与指令的周期数相同。 测试结论:仿真器如果没有照严格正规的设计,程序的单步运行性能将不准确,一般会出现实际运行时间变长的现象,这在时间要求较高的单步运行将不能仿真程序的真正运行。 2.中断性能的测试 测试说明:中断是一种非正常的程序跳转,单步仿真有一定的难度,尤其在低档仿真器中。在当前 采用Bondout 技术制作的仿真器中一般可以做到正确仿真,但是仍有一些仿真器不能正确单步仿真中断。 测试程序: ORG 0000H LJMP TestStart ORG 000BH /* 定时器0 的中断服务程序 */ RETI TestStart: SETB EA /* 开放全局中断允许 */ SETB ET0 /* 开放T0 中断允许 */ TestLoop: SETB TF0 /* 设置T0 的中断标志 */ INC A /* A 数值加一,以便观察程序持续运行 */ LJMP TestLoop /* 连续运行 */ END 测试步骤 (1) 照您当前使用的仿真器要求测试上面的程序。 (2) 每次SETB TF0 后程序将进入T0 的中断服务程序,执行完毕后返回主程序继续运行。 (3) 主程序能在TestLoop 中连续运行,因此A 能连续加一,但是每循环一次就进入一次中断。 测试结论:仿真器如果没有照严格正规设计,程序的中断性能将不准确。可能出现程序不能跳转到中断服务程序,或没有返回到正确的主程序,或A 不能每次循环连续的加1。 3.连续中断性能的测试 测试说明:在80C51 的中断系统中,串口中断比较特殊。进入串口中断服务程序后中断标志TI 或RI不会自动清除,如果用户程序不对TI 或RI进行清除操作则可能会出现连续进入中断服务程序的情况。根据80C51 的中断处理,在退出中断后必须执行完一条指令后才能重新进入中断服务程序,因此即使连续中断的情况下主程序也能得到连续执行。 测试程序: ORG 0000H LJMP TestStart ORG 0023H /* 定时器0 的中断服务程序 */ RETI TestStart: SETB EA /* 开放全局中断允许 */ SETB ES /* 开放串口中断允许 */ SETB TI TestLoop: NOP NOP INC A /* A 数值加一,以便观察程序持续运行 */ LJMP TestLoop /* 连续运行 */ END 测试步骤 (1) 照您当前使用的仿真器要求测试上面的程序。 (2) 进入TestLoop 后,每次单步运行完一条程序都会进入串口中断,退出后继续运行一条下面的程序,然后又进入中断服务程序,A 的数值可以得到递增。 (3) 主程序能在TestLoop 中连续运行,因此A 能连续加一,但是每循环一次就进入一次中断。 测试结论:仿真器如果没有照严格正规设计,程序连续运行中断程序性能将不准确。可能出现程序不能跳转到中断服务程序,或没有返回到正确的主程序,或A 不能每次循环连续的加1。 测试小结 上述的几个测试程序对仿真器的性能要求很高,如果仿真器通过测试说明被测试的仿真器仿真性能指标较高;如果仿真器没有通过测试只能判断仿真器性能不是最好,具体的综合性能要有待其它检验。