仿真器仿真器的功能概念1).执 行断点(Exebreakpoint)这是最普通的一个断点,所有的仿真器都必须有,其实现方式二种
一种是硬件断点,一般来说是用硬件的比较器去做的;另一种是软件断点,如用TRAP指令
评价执行断点的标准点:当用户在调试用户板EPROM中的程序时,还能不能设断点,往往一些低档的仿真器是做不到这一点的
2).总线断点(Busbreakpoint)光有执行断点是不够满足实际需求的,总线断点是一个地址断点,若用户的系统需要调数据总线,或中断,定时器/记数器,并且要实时调试时,这时候就需要有总线断点
总线断点可以设定为地址总线,数据总线,CPU的一些状态
当这时设定匹配时,让CPU停下来,所以,这样的仿真器的功能就比较强大,很容易找问题,但是在实现这些功能时,所用到的硬件设计就要复杂得多了
3).寄存器断点(RegisterBreakpoint)这种断点往往需要CPU能支持这功能
CPU内部要有一个比较器,当所设定的CPU的值与之匹配时,仿真器就停下来
像PowerPC是可以做到这一点的
4).事件(Event)以上所说的总线断点,可以看成是事件的一种要素
事件可以是某些CPU的信息的组合,也可以是外部的触发输入,并且可以有逻辑的组合,时序上分先后顺序,具有记数功能等等
这种事件功能,在一些高档的仿真器中是一种最基本的功能
5).触发(Trigger)事件的最终目的是产生触发,这种触发不见得要让CPU马上停下来,往往用户在调试时,有可能是想看当设定的条件满足要求之后的几个CPUCycle时的CPU情况
所以,触发要满足这方面的需求,并且触发最好能和追踪存储器配合使用
6).追踪存储器(TraceMemory)追踪存储器就像是一台摄像机,在CPU全速运行时,能抓取CPU的一些信息,如地址/数据总线,CPU的状态,I/O管脚情况
所以,追踪存储器就必须要有一定的宽度与深度,很快就爆满的追踪存储器就不存在什么意义
目前,大多数人都是在以C,C++的方式写程序,对于追踪存储器中抓下来的数据,就必须要能翻译或链接到相应的C代码才有意义
7).追踪过滤(Qualify)若是只有追踪存储器,没有追踪过滤,这样的追踪存储器是没有什么用处的!为什么这么说呢:追踪存储器就像以上说的是一台摄像机
用户总不可能去摄像时,一出家门就开始不作任何刷选地去摄像
往往大家只有感兴趣的景点才作摄像
所以,在使用追踪存储器时,一定要有一个硬件上的过滤,只挑选有用的信息才存下来,这样才不会导致追踪存储器爆满
当然,对于已追踪记录下来的数据,最好是还有一个软件过滤的动作,就像是电影的再剪辑
有些仿真器号称提供追踪或“逻辑分析仪”功能,但没有硬件过滤
用户程序停下来之后,追踪存储器中往往是大量的无用信息,真正有用的数据可能反而被覆盖了
8).软件性能分析(SPA)大家在开始一个项目时,往往在项目刚开始时,追求的是功能,而到了一定时候,就要开始追求性能,这时,往往需要作程序代码的优化动作
但是,总不可能把整个用户程序从头到尾全部优化一次,这是非常没有效率的
有了软件性能分析,就可以分析出那些代码在整个系统的运行过程中占的时间百分比比较高,则在优化时,就只需要针对这一部分去优化就行了,这样的效率才能最高
9).代码覆盖率分析(CodeCoverage)代码覆盖率分析能帮助用户分析出用户的那些代码是废代码
现在,用户系统越来越大,往往一个项目不是一个人开发的,或者花了好多时间才开发完,往往会存在着大量的废代码,在系统的运行过程中,根本就没有被调用过,但有时又不敢轻易地把它删除
有了代码覆盖率分析的功能,就很容易地分析出那些是废代码,可以放心地删除了
10).时间节拍(TimeStamp)在一些高档的CPU,如486,Pentium,内部都已有MMU,Cache等,用户已根本无法按CPU时钟及cycle来算出到每一条指令的执行时间了,有时误差会有好几倍的出入
这时,有了时间节拍的功能,用户就能很清楚地知道到每一条指令的执行时间了
时间节拍器记录是在追踪存储器中的,如果要保证记录足够长的时间和足够的精度,需要大量的存储器
11).仿真存储器(EmulationMemory)仿真存储器,也是仿真器的一个最基本的功能
对于窄地址空间的CPU,要看它是否能提供全空间的仿真存储器,对于宽地址空间的CPU,要看它能提供多少深度,并且是否能与编译器的Linker/Locater配合随意搬移使用
评价一个仿真器的仿真存储器,还要看它是否一点都不占用用户空间,能否读到用户板EPROM中的程序,能否帮用户反汇编并存成文件,能否接在用户板EPROM上调试
12).仿真存储器块扩展(BankSwitch)一些窄地址空间的CPU,就像8051,其程序空间只有64K,往往有的用户会觉得不够用,如要存放一些语音,图像数据到EPROM中,这时候,就需要有块扩展功能
往往一些编译器能支持块扩展功能,像Keil的C51编译器
这时,最好仿真器也与一起支持,这样,用户在使用时就根本不需要再去考虑是否能平稳地做到块切换,全局变量与局部变量的问题
13).内存映射(MAP)一般来说,仿真器都会提供内部与外部内存映射
但其实,好的仿真器还能做更复杂的属性,如警式(Guard),只读(Read-Only)等等
像这种属性是非常有用的
像Guard,它的意思是对于不存在的空间,用户可以设定成Guard
这样,当程序一旦跑飞进入这空间之后,CPU就马上停下来
配合上追踪功能,用户能很快定位出程序是从哪儿跑飞的,原因是什么,有可能是push/pop少写了一个,或者干扰因素等
14).内存飞速(Memoryon-the-fly),追踪飞速(Traceon-the-fly)在某些场合,如PWM调试马达,马达是用PWM的占空比来作马达速度的控制,有可能CPU不能停下来,一旦CPU停下来,PWM保持高电平
这样,马达就要飞转起来
所以,CPU不能停
这时候,用户有可能想看仿真存储器中及追踪存储器中的资料,就需要仿真器能支持这方面的功能
这时候有一点非常重要,不能是偷偷地把仿真CPU停下来,读一下之后再让CPU跑起来
这样做就是假的,不存在任何意义,可以采用双端口RAM或者采用影子内存的方式(类似Cache)
15).支持的工具链(ToolChains)一个好的仿真器,应能支持众多的编译器,就像51,做编译器的厂商就非常多,如Keil,2500AD,BSOTasking,PLM等
不能要求用户买了这台仿真器之后,指定用户只能用某一家的编译器,而让用户去重新熟悉一套编译器的环境
16).协议软件的支持(SupportProtocolS/W)目前,用户的系统都越来越复杂,像USB,PCMCIA1394,LCD,Ethernet等,就需要相应的协议,如TCP/IP协议,有许多专业写这方面协议软件的公司,如Interniche等
一个好的开发系统,最好能直接支持第三方写好的协议软件
17).支持实时操作系统(SupportRTOS)操作系统很多,特别是在嵌入式系统中,如VxWorks,ThreadX,Linux等
如是一个开发系统不能支持用户购买的操作系统的话,那么那些操作系统就成了一堆废代码,根本就不能调试
开发系统要帮用户显示出哪些Task在运行,哪些Task被挂起,挂起的原因是因为Semaphore,Eventflag等,还要帮用户显示出Mailbox,messagequeue和memorypool等系统定义的结构
最佳的开发系统更要支持多项目和多CPU的环境
以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。