早期的说明:完全是自行开发。非转载!
MON51仿真机,从第一代开始至今,已经推出了3个不同的版本。性能上有了质的飞跃!原来开发它,也是一个偶然的机会,就是配合实物上课用。当时采用最早的MON51仿真机,用户地址在0X8000,我自己用起来都嫌麻烦,还经常出错,更何况初学者。后来便分析、追踪Keil的输出命令,再配合原来具有的仿真机开发知识(本人原来从事过专业仿真机的开发)。开发出了第1代MON51仿真机,全部是用汇编编制,但当时对Keil的一些特定的命令,没有掌握,自然存在许多BUG。后来通过用户的反馈,都逐一解决,而问题最多的是单片机的FLASHROM损坏,再深入研究,做破坏性的实验后发现,号称10万次的写入,有的只有几千次的寿命。尤其是单步运行区和保存用户程序数据区,损坏的居多。所以决定不再用FLASHROM保存数据,而改成XDATA RAM保存数据。这样便推出了第2代MON51仿真机,后来发现由于改用RAM保存数据,减少了耗时的FLASHROM操作,无论是跨步,还是单步执行的速度奇快,性能也大大提高,但单步执行区还是存在频繁写入的问题,经过反复推敲,决定采用循环写入法,用多个FLASHROM来做单步执行区,减少对某一个固定字节的写入,从而将寿命问题解决。当时采用一个扇区128个字节,寿命提高14倍。但无论如何也解决不了占用UART口、T2定时器的问题。有些简单用户(初学者),不用开发串口,使用MON51第二代仿真机,还是绝对超值!
去年至今,有许多学生、工程师、单片机爱好者都希望我能设计出采用USB口通讯、零资源占用的仿真机。我开始并不想再设计,因为网上卖的人太多。但后来觉得技术上实现并不困难,让更多的人掌握单片机技术,使用方便才是关键。所以用C51重新编写了MON51仿真机的源代码,采用C语言编制,主要是为了便于维护和移植。这样就推出了第3代MON51仿真机。用空间换取了FLASHROM的寿命,采用了512个字节来做单步执行区,还做了坏字节标记处理,可以自动跳过坏的字节区。这样FLASHROM的寿命提高了56倍!并且优化了下载程序和断点处理程序,这样一来下载、单步执行等操作速度如飞!释放了UART口、T2定时器是最大的改进!采用USB口通讯,非常适合现在电脑!
现在用SST公司的公版HEX做的仿真机到处都有。为了推广自己的产品,把Keil的许多功能加进来,说成是自己仿真机所具有的。例如:
可单步、断点、全速,可参考变量、RAM变量
支持汇编,C语言,混合调试。
这些难道不是Keil仿真机软件的功能吗?
有的人甚至把仿真空间大小,硬件锁定功能,加以评论。这些对专业人士来说,很可笑!无论如何,没有掌握技术,当出现问题,就说是用户使用不当而蹚塞。。。。。。
现在就对一些有针对性的问题,加以回答!如有不对,请指正!
问题:
1:如何区分是否为SST公司的公版程序?
要区分是否为SST公司的公版程序,只要看它具不具有脱机功能就行。因为SST公司的公版程序是不具有脱机功能的。要加入这个功能,就必须改程序代码。
2:MON51仿真机的工作原理是什么?
这个问题很专业,也是问的最多。一句话是无法回答的。只能简单说明:就是通过Keil开发平台,将用户的程序下载到MON51仿真机中,根据Keil开发平台的命令,不断地执行用户程序,再将临时数据传回Keil开发平台的过程。MON51仿真机的软件,基本上由:通讯模块、Keil命令解析模块、51系列单片机的指令分析模块、断点处理模块、运行模块、单步执行模块等组成。
3:MON51仿真机的“运行到断点处(光标处)”和“单步运行” 、“跨步”、“全速运行”有什么区别?
这些功能是每一个仿真机所具有的。但它们实现的方法是不同的。MON51仿真机是借用单片机的IAP功能,来实现仿真的。所以上述几种运行模式(除开单步运行),全部改写了用户下载到FLASGROM中的程序代码。在断点表中保存了断点的地址,和用户代码。MON51监控程序,会在用户要设立断点的地址处写入一条指令: LCALL STOP 。STOP是停止用户程序,保存用户数据,并恢复MON51监控程序的数据后,再进入MON51监控程序的一段处理程序。实际上就是任务切换。当用户执行到断点处时,会通过LCALL STOP,自动进入MON51监控程序。再把用户的数据发送到Keil平台。
“跨步”运行实际上也是一种变相的断点运行模式。只不过断点,不是用户定义的,而是Keil开发平台计算的。是隐含处理的。
这里很明显,如果改用FLASHROM保存中间数据,则要频繁地删除、写入数据,STOP的执行速度就会明显下降。而用RAM保存,是最快的。而且没有寿命问题。
“全速运行” 有2中方式:
一种是不带中断响应运行。它完全不再受Keil平台的控制,一旦开始运行,用户只有通过手动复位,停止用户程序。
另一种是带中断运行。既勾选Serial Interrupt 选项。这样便会在用户程序的串口中断向量处,写入一条指令LJMP BREAK ,这样发生中断后,就跳转到MON51监控程序的中断处理程序。BREAK程序判别Keil平台是否发来停机命令。如果是停机命令(0x1B),便会进入STOP程序,保存用户程序数据,并进入MON51监控程序。如果不是,则退出中断程序,继续运行应户程序!这也是所谓的“夭折功能”。它也不是什么新技术,任何仿真机都有。而且实现也很简单!
现在C51-III仿真机由于释放了UART口,所以将中断向量转移到0x3b。
“单步运行”是比较繁杂的一种运行模式。仔细分析51系列单片机的指令,可以知道,虽然有100多条指令,但把转移指令、判位指令、数据转移指令、运算指令等归类后,实际只有10种类型的指令。首先MON51监控程序分析是哪一种指令,如果是转移类指令(LJMP、AJMP 、SJMP、 LCALL、 ACAL、RET、 RETI),MON51监控程直接计算PC指针的地址,并不执行。而其它类的指令则,全部复制到单步执行区(最大9个字节)。再在后面添加2条转移指令 LCALL STOP 、LCALL STOP。为什么要2个LCALL STOP 。主要是用来判别:判位指令是否发生了跳转而设的。进入“单步运行”后,MON51监控程跳转到单步执行区,就可以执行用户的一条指令。然后进入STOP程序。完成一次单步!如果大量采用单步执行的话,单步执行区会被频繁修改,严重影响寿命!这是现在所有采用IAP技术仿真的弊病!如果有个单片机内部有9个字节的RAM执行区就好了,专业仿真机就要下岗了。
实际上MON51监控程在读取、写入特殊功能寄存器时,也要用“单步运行”方法来实现!例如:“mov a,direct ; mov direct,R0”这俩条指令必须要用“单步运行”来实现。如果用户程序有大量的此类指令,寿命问题就会暴露出来。我们做破坏性实验,就是循环执行它。
现在市面上所有的仿真机,都不会去说明FLASHROM是在什么地方被写入?寿命是如何受影响的?也许是扬长避短吧,或许是根本就不知道。
通过上面的分析就知道,FLASHROM中到底是哪里被频繁写入了。有些网站要求,尽量少用“单步”,也就是回避这个问题!
第3代MON51仿真机。采用了512个字节来做单步执行区,还做了坏字节标记处理,可以自动跳过坏的字节区。寿命问题基本解决了!如果需要,还可以扩展到1024个字节。但这样减少了仿真空间。
4:SP堆栈占用了2个字节,是什么意思?
这个问题,我被无数次问起,但我首先问一下:你做的软件预留了多少个字节做堆栈?一般的回答是:把剩余的字节全部做堆栈!试想一下,谁做软件只预留几个字节做堆栈。更何况是2个字节!
MON51监控程占用用户堆栈,是在STOP程序运行时占用的,进入STOP程序时,单片机的硬件已经将PC指针自动压入用户堆栈。此时占用2个字节。随后因为要保护用户的临时数据,必须要用到ACC、DPTR。所以必须先保存好这3个寄存器的值才行。直接压入用户堆栈,最简单!但占用了3个字节!(实际上用户的堆栈,绝对不应该是5个字节的余量)。所以许多网站上,都说采用了新技术,占用2个字节的堆栈。实际上不压入堆栈,用单片机内部不用的寄存器就可以保存就可以了!例如:看门狗寄存器WDTD或IAP操作的寄存器组:SFAL、SFAH、SFDT(但不能用SFCM寄存器)所以SP堆栈占用了2个字节的技术并不神秘!
C51-II仿真机、C51-III仿真机全部是占用2个字节!
5:MON51监控程可以移植到其他公司的芯片上吗?
现在许多专业生产仿真机的公司,他们都可以与Keil开发平台联机。就是用的MON51驱动程序。原理上一样的,只是实现的方法不用而已。所以MON51监控程可以任意移植。但做为简易仿真机,它对单片机有一定的要求:1、必须具有IAP功能。2、启动向量可以控制。现在的华邦、PHILIPS公司的LPC9XX系列等都可以做。但前提是必须要掌握技术和拥有源程序。
6:C51-II仿真机采用XDATA保存数据,哪我要使用它们,怎么办?
首先我要说明:简单的东西,肯定是有弊端的。现在C51-II仿真机、C51-III仿真机都是采用XDATA保存数据。如果要用它们,就只有自己扩展RAM了。当用户使用自己扩展的外部RAM时(必须定义AUXR寄存器的EXTRAM位!),地址可以从00H开始,连续存放。C51-III仿真机会自动将数据保存到内部XDATA 中,但是当用户使用内部的XDATA时,必须注意要跳开0x180—0x2FF的地址空间。方法可以看C51-III说明书!
这些都是SST芯片的硬件特性感兴趣的用户可以到
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
楼主好纠结,不过也不错,难得有共享成果的想法就值得表扬。
一周热门 更多>