软件仿真方法和装置制造方法及图纸

技术编号:2861968 阅读:236 留言:0更新日期:2012-04-11 18:40
一种软件仿真方法,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括:    地址查找步骤,在岐点链表存储区的岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则进入宿主指令执行步骤,如果没找到则进入路径转换步骤;    路径转换步骤,确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;    宿主指令执行步骤,从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。(*该技术在2023年保护过期,可自由使用*)

【技术实现步骤摘要】

本专利技术涉及CPU仿真领域,特别是涉及一种软件仿真方法和软件仿真装置。
技术介绍
目前,单片机因其诸多特点,在各行各业中得到了广泛的应用,单片机的开发也日益受到重视。由于单片机本身没有自开发功能,因此必须借助于开发工具。近年来,随着个人计算机系统的不断普及,国内外推出了不少以计算机为基础的单片机开发系统。其中,软件仿真方法是一种新型的开发方法,此方法是在宿主机(如计算机上或工作站平台)上,以其CPU(如x86)及其系统资源来模拟目标机(如单片机)的CPU,并执行用户的目标程序的指令,使得一种设备(目标机)上的软件可以在完全不同的设备(宿主机)上运行,这样可以实现某个设备而完全不采用那个设备的硬件,用其他硬件系统代替,然后再采用软件仿真去实现。此方法需要配置软件仿真装置和一系列相关的服务程序。使用时,只要在宿主机上运行软件仿真装置,就可以对目标指令进行调试。对于那些只是用到单片机内部资源的设计来说,可以在软件仿真装置内完成仿真工作。软件仿真装置可以集成在嵌入式系统的集成开发环境(IDE)中来仿真目标机中CPU的运行,软件仿真装置运行起来和实际的目标机一样,但是增加了其它功能,例如能够通过调试界面来观察目标机CPU中的程序和数据,并控制目标机CPU的运行;还可以用作程序性能评估工具(Profiler),可以在仿真执行的过程中取得许多真正硬体无法取得的信息,这样可以帮助程序开发者分析目标程序执行性能,如指令数/秒(软件仿真装置每秒执行的指令数)和CPI(Cycle per Instruction,平均每条指令的时钟周期数)。目标程序的调试是通过设置断点、使程序在指定的目标指令位置停止运行来实现的。在目标程序中止的时候,检查存储器和寄存器的内容,作为发现程序错误的线索。现有技术的软件仿真方法包括三种逐条指令解释、静态重编译和动态编译。其中,所谓逐条指令解释是指逐条对目标程序指令进行仿真操作。其具体流程与真正目标机CPU的动作流程相似,先取出一个Opcode(运算码),然后译码,执行这个Opcode指令的动作,然后再把结果写回到目标地址或寄存器。所述方法的缺点在于执行一个指令所需要的动作很多,并且每次执行到同一指令时都需要同样的过程而不能减少步骤,其仿真的速度较慢,一般只能达到宿主机速度的1/100,而且重复执行的步骤越多,速度越慢。所谓静态重编译可以克服逐条指令解释速度较慢的缺陷,类似编译器的动作,将目标指令作为输入语言编译成宿主机的指令。其具体流程是集中的将所有的目标指令一次编译成宿主机指令并进行存储,而到执行的时候不再进行编译的动作,只是执行宿主机指令完成原来的目标指令的功能就行了。该方法虽然编译时速度较慢,但是执行的时候速度较快,而且只需要进行一次编译。该方法的缺点是对于动态的数据改变缺少应对措施,因为被编译的目标程序有可能设计成在执行时动态的修改Opcode,来实现动态的程序执行,而由于目标机指令已经被一次性编译成宿主机指令,这样如果被执行的段落想要修改Opcode就会造成混乱,导致当目标机的指令(或数据)动态改变时执行结果错误。另外,由于在翻译和优化过程中改变了原来的指令形式,使得作为调试用途的使用变得较不方便。因为指令的形态和指令间的关系已经彻底变化了,使得观察单个指令的结果、单步执行、断点设置都会变得混乱而难以使用。所谓动态编译相对于静态重编译是一种折衷的方案,可以避免出错的情形,在执行期间动态的对目标指令进行重编译,也被称作Thread Code技术。该方法类似于静态重编译,但是在指令的执行中,编译一条执行一条,而不是一次性的集中编译,其缺点在于由于必须逐个对指令编译,使得对指令间行为的优化不能进行,从而降低优化效率及编译效率;并且由于编译效率降低导致代码量增大,一般缓存区只是缓存最近的代码(包括物理地址和一些调试信息),运行时,先在缓存区中查找要执行的指令的地址,如果有就转去执行,如果没有就再次翻译,因此该方法的命中损失较大,仿真速度提高有限;对于大型目标程序更容易造成执行速度不平稳,因为小的循环执行段落缓存区能够容纳,速度较快,而大的循环执行段落将导致缓存溢出,造成一些指令需要频繁的反复编译,速度大幅下降。一种现有技术的软件仿真方法属于改进的动态编译方法,其将相邻的一组目标指令一起编译并存放在缓存区内,从而在一定程度上进行优化,提高编译效率。但是由于现有技术选择相邻的一组指令进行编译,如果目标指令执行的路径经常变化,即含有跳转条件的指令较多时会导致更大的命中损失,引起更频繁的重新编译。例如当目标程序的指令具有1-2-3-4-5-6和1-2-5-6两种执行顺序(即执行指令2可能发生跳转)时,如果选择相邻的一组指令1-2-3-4进行编译,而实际运行到指令2时发生跳转,会导致对指令3和4的编译并没有采用,增加了编译时间,浪费了缓存区容量,或者每次仿真运行时都需要重新编译,效率下降;另外,由于在优化过程中指令形式改变,而且集中编译相邻的一组指令时起始指令和终点指令没有有效的控制机制,会导致和静态重编译类似的问题发生,即不利于设置断点、对目标程序进行调试。
技术实现思路
由于现有技术软件仿真方法在执行路径变化时的命中损失较大、仿真速度较低,本专利技术解决的技术问题在于提供一种可以进行路径分析从而减少命中损失、提高仿真速度的软件仿真方法。在此基础上,本专利技术解决的另一技术问题在于提供一种便于对目标程序进行调试的软件仿真方法。本专利技术还提供一种可以进行路径分析从而减少命中损失、提高仿真速度的软件仿真装置。为此,本专利技术解决技术问题的技术方案是提供一种软件仿真方法,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括地址查找步骤,在岐点链表存储区的岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则进入宿主指令执行步骤,如果没找到则进入路径转换步骤;路径转换步骤,确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;宿主指令执行步骤,从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。本专利技术进一步的改进在于还包括步骤确定需设置为岐点的目标指令的地址;在岐点链表中查找与所述目标指令的地址相邻的岐点项;将所述目标指令的地址作为岐点插入岐点链表;将所述目标指令的地址对应的岐点项及其相邻的岐点项的宿主指令缓存地址置为空。本专利技术还提供一种软件仿真装置,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括用于存放宿主指令的宿主指令缓存区,其特征在于,还包括岐点链表存储区,用于存放岐点链表的岐点项,所述岐点链表的岐点项包括岐点地址和宿主指令缓存地址;地址查找单元,用于在岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则启动宿主指令执行单元,如果没找到则启动路径转换单元;路径转换单元,用于确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;宿主指令执行单元,用于从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指本文档来自技高网
...

【技术保护点】

【技术特征摘要】

【专利技术属性】
技术研发人员:张岩
申请(专利权)人:北京北阳电子技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1