跟51emb-32k的特殊寄存器SFR读取有什么不同?


答:在仿真时打开特殊寄存器窗口如图:

d:80H表示显示的是特殊寄存器窗口。这时候使用emb-32k来仿真,进行单步操作,你会发现,emb-32k运行很慢,一条指令的执行时间长达2-3秒。为什么打开sfr窗口之后运行会变的很慢呢?下面将讲述keil mon51的原理(etool的emb-32k使用的执行过程跟keil 的一样):

对于sfr的读取,keil的mon51程序把它分为两种情况,一是读取的寄存器是已经保存的特殊寄存器(ACC,PSW,IE,SP,DPH,DPL,B,R0-R7),就从保存区直接读出送回电脑。二,如果不是这些寄存器,例如要读取TH0,keil是通过运行一条指令的方式来进行的,而运行一条指令的过程很复杂:

在断点运行区写入一条MOV ACC,TH0

指令

     
保存监控程序的128字节的ram      
保存监控程序的sfr      
恢复用户程序的256字节的ram      
恢复用户程序的sfr      
运行上面的MOV ACC,TH0指令后返回监控系统      
保存用户的256字节的ram      
保存用户的sfr      
恢复监控程序的256字节的ram      
恢复监控程序的sfr      
将读出的TH0送到电脑      
       

这一系列的操作至少耗时60毫秒。每读出一个sfr的值就要耗这么多的时间,读出所有128个sfr,耗时要2-3秒。

可以看出keil的程序拐了一个很大的弯,实际上直接读出TH0送到电脑就可以了,何必做这么多的保存和恢复的过程呢?

我的仿真机改用新的办法:

判断是读TH0吗?

是: MOV ACC,TH0

将ACC的值送回电脑。

执行速度至少要提高10倍以上。我的仿真机的执行要快很多,这种情况下的执行时间不会超过200毫秒。