打印

求助:Mon51仿真器原理?

[复制链接]
4022|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rubest|  楼主 | 2008-7-9 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了Keil自带的MON51.pdf文件,基本上是说怎么做的,却也没怎么介绍原理。
百度上找啊找啊找啊,找到一堆都是原理图、PCB,没多大用处啊。
哪位DX有这方面的资料的发我一份吧,感激不尽。最好有结合软、硬件讲解的,能够从单片机的内部结构分析。就像OPEN-JTAG开发小组写的《ARM JTAG 调试原理》介绍JTAG很棒。
小弟在这谢过了。谢谢:)

相关帖子

沙发
古道热肠| | 2008-7-9 17:37 | 只看该作者

这个东西会怎么用更能产生效益

至于工作原理,可以不求甚解,工作原理是分时复用CPU,保护好现场,最后由PC做控制台.

使用特权

评论回复
板凳
rubest|  楼主 | 2008-7-9 17:52 | 只看该作者

谢谢DX:)

不是很明白啊……
不知道用MON51仿真好不好的说……

使用特权

评论回复
地板
zt1234| | 2008-7-12 02:14 | 只看该作者

可以,主要是IAP

使用特权

评论回复
5
McuPlayer| | 2008-7-12 11:52 | 只看该作者

有标准MON51和变种MON51之说

Keil的标准MON51是用外部总线的,外部RAM放程序。挂RAM的话,373就少不了了。监控程序随时可以修改用户程序实现断点,变量查看等功能。

后来SST的IAP片子(54和58)出来后,他们(应该是SST的人)把Keil的Mon51程序做了改动,把RAM的读写改成FLASH的读写,于是只用一个IC的简易仿真器出现了。

使用特权

评论回复
6
lxr89c51| | 2008-7-17 10:28 | 只看该作者

Mon51仿真机杂谈

致词: 

       在尽3年多的时间里,我收到几百封关于MON51仿真机的问题的邮件。由于种种原因,只对少数人做了回答。非产抱歉,现就借此文,来回答许多未回答的问题。 

简述: 

       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芯片的硬件特性感兴趣的用户可以到 

欢迎到Http://www.mon51.cn/ 看看 

http://www.sst.com/products.xhtml/embedded_controllers/89/SST89E516RD2 查看它的资料。 

7 还有许多关于MON51仿真原理的细节问题,请来信联系。 

未完。。。。。。有时间再写! 

                                                                                                         李杰 

QQ:77524829 

E-Mail:Mon51@163.com 

使用特权

评论回复
7
边锋软件| | 2008-7-17 11:21 | 只看该作者

留个脚印先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

22

帖子

0

粉丝