为什么你的仿真机单步运行比51emb-32k更快?


答:我的仿真机的单步执行速度是60毫秒,而emb-32k的执行时间是120毫秒。如果同时作跟踪记录,我的仿真机的单步执行时间是70毫秒。(emb-32k不支持跟踪记录)

为什么我的仿真机的单步执行要60毫秒?以下是分析:

执行一条用户程序,需要做如下的操作:

  老古仿真机 emb-32k    
复制用户代码到断点运行区 5毫秒 X
保存监控程序的128字节的ram 11毫秒 11毫秒    
保存监控程序的sfr 6毫秒 X    
恢复用户程序的256字节的ram 2毫秒 2毫秒    
恢复用户程序的sfr 1毫秒 1毫秒    
执行一条指令返回监控        
保存用户程序的256字节的ram 22毫秒 22毫秒    
保存用户程序的sfr 2毫秒 2毫秒    
恢复监控程序的128字节的ram 4毫秒 4毫秒    
恢复监控程序的sfr 2毫秒 2毫秒    
跟电脑通讯的时间 5毫秒 5毫秒    
共: 60毫秒 120毫秒    

 

差别在于断点处理和保存监控程序的sfr。

我的系统用到的rom为512字节(共4个扇区,SST89C58的128字节为一个扇区)

执行一次单步操作需要写入4个扇区,每写入一个扇区耗时11毫秒(擦除1.4毫秒,写入9.6毫秒),共耗时44毫秒,加上其他执行时间需要60毫秒。

而emb32k要写入的扇区的次数要多好几次。

对一个扇区的读写,我的仿真机只需要执行一次擦写操作,使用128字节的ram作为高速缓存,读写都在ram里执行,只有在返回用户程序时,才将高速缓存里的内容写到rom里。而etool可能没有使用缓存功能。

keil 的mon51 使用了256字节的ram,跨越两个扇区,如果使用跟keil一样的内存结构,至少要写入2个扇区(etool的就是这样)。如果一会儿要写入第一个扇区,一会儿要写入第二个扇区,就必须进行反复的擦写操作,就不止写入2次了(每写入一次耗时11毫秒)(keil 的mon51正是需要来回操作)。emb-32k至少要写入4次。

而我的仿真机把256字节的这两个扇区压缩到一个扇区里,只使用128个字节作为断点运行区和sfr保存区,不存在两个扇区的切换,就只要写入一次。