软件仿真方法和装置的制作方法

文档序号:6421393阅读:165来源:国知局
专利名称:软件仿真方法和装置的制作方法
技术领域
本发明涉及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的编译并没有采用,增加了编译时间,浪费了缓存区容量,或者每次仿真运行时都需要重新编译,效率下降;另外,由于在优化过程中指令形式改变,而且集中编译相邻的一组指令时起始指令和终点指令没有有效的控制机制,会导致和静态重编译类似的问题发生,即不利于设置断点、对目标程序进行调试。

发明内容
由于现有技术软件仿真方法在执行路径变化时的命中损失较大、仿真速度较低,本发明解决的技术问题在于提供一种可以进行路径分析从而减少命中损失、提高仿真速度的软件仿真方法。
在此基础上,本发明解决的另一技术问题在于提供一种便于对目标程序进行调试的软件仿真方法。
本发明还提供一种可以进行路径分析从而减少命中损失、提高仿真速度的软件仿真装置。
为此,本发明解决技术问题的技术方案是提供一种软件仿真方法,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括地址查找步骤,在岐点链表存储区的岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则进入宿主指令执行步骤,如果没找到则进入路径转换步骤;路径转换步骤,确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;宿主指令执行步骤,从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。
本发明进一步的改进在于还包括步骤确定需设置为岐点的目标指令的地址;在岐点链表中查找与所述目标指令的地址相邻的岐点项;将所述目标指令的地址作为岐点插入岐点链表;将所述目标指令的地址对应的岐点项及其相邻的岐点项的宿主指令缓存地址置为空。
本发明还提供一种软件仿真装置,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括用于存放宿主指令的宿主指令缓存区,其特征在于,还包括岐点链表存储区,用于存放岐点链表的岐点项,所述岐点链表的岐点项包括岐点地址和宿主指令缓存地址;地址查找单元,用于在岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则启动宿主指令执行单元,如果没找到则启动路径转换单元;路径转换单元,用于确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;宿主指令执行单元,用于从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。
相对于现有技术,本发明的有益效果是由于本发明进行路径转换时进行动态路径分析,确定执行路径的终点,并基于执行路径进行指令变换,而不是像现有技术的动态重编译方式只简单的变换相邻的一组指令,这样可以在提高编译效率的同时减少由于执行路线变化产生的命中损失,进一步提高仿真速度;同时由于生成岐点链表,实现目标指令的地址和宿主指令缓存地址的映射,从而允许动态调整执行路径分割方式,改善断点设定或是单步执行时的调试能力,方便调试目标程序。


图1是本发明软件仿真装置的框图;图2是本发明软件仿真方法采用的岐点链表和宿主指令缓存区示意图;图3是本发明软件仿真方法的流程图;图4是本发明软件仿真方法的路径转换的流程图;图5至图7是应用本发明软件仿真方法的具体实例示意图;图8是本发明软件仿真方法的岐点设置的流程图;图9是应用本发明软件仿真方法设置岐点的具体实例示意图。
具体实施例方式
请参阅图1,本发明软件仿真装置100用于在宿主机上仿真目标机的运行,将目标机的目标程序的指令翻译成宿主机的宿主指令并执行所述宿主指令。所述软件仿真装置100包括地址查找单元110、路径转换单元120、指令执行单元130、宿主指令缓存区140和岐点链表存储区150。
请一并参阅图1和图2,所述宿主指令缓存区140用于存放宿主指令;所述岐点链表存储区150用于存储岐点链表20,所述岐点链表20包含若干岐点项21,各岐点项21均包含岐点地址211、宿主指令缓存地址212、上一岐点指针213和下一岐点指针214等数据;所述地址查找单元110用于在程序运行时查找岐点链表20,判断当前目标指令的地址是否已存在于岐点链表20中;所述路径转换单元120用于将目标指令编译成宿主指令并将其存储于宿主指令缓存区140、同时根据需要更新岐点链表存储区150中的数据;所述指令执行单元130用于执行宿主指令缓存区140中的宿主指令。
为了便于对目标程序的调试,本发明软件仿真装置100还包括岐点设置单元160,用于在岐点链表20中增加岐点项21。
本发明所述宿主机和目标机泛指一切具有数据处理能力的电子设备,宿主机包括但不限于各种个人计算机、小型计算机、数据处理工作站以及各种专用数据处理系统,目标机包括但不限于单片机、嵌入式控制系统等。
本发明中,所述岐点是指各执行路径的第一条目标指令,所述执行路径是指软件仿真装置100仿真的目标指令的地址序列。
请一并参阅图1至图3,本发明软件仿真方法的主流程包括步骤S1至步骤S6。
步骤S1是根据当前执行路径的终点确定转向的目标指令的地址,所述转向的目标指令的地址根据当前执行路径的运行结果由宿主机的存储器或寄存器中的数据动态决定。
如果所述软件仿真装置100刚开始工作,则当前的终点就是CPU的启动向量,此时转向的目标指令的地址就是启动向量指向的地址,也就是软件仿真装置100仿真的第一个目标指令。
步骤S2是地址查找步骤,由地址查找单元110执行,对岐点链表存储区150中的岐点链表20进行查找,具体的做法是查找岐点链表存储区150是否包含一个岐点项21。如果岐点链表存储区150不是空的,则同时判断转向的目标指令的地址是否已经包含在岐点链表20的岐点项21中。如果没有包含,也就是说所述转向的目标指令没有翻译,那么继续执行步骤S3;如果已经包含,也就是说已经找到一个有效的岐点项21,即所述转向的目标指令已经翻译,那么跳到步骤S4。
如果当前的终点是CPU的启动向量,则岐点链表存储区150应该是空的,即并不存在有效的、已经转换完成的岐点链表20中的岐点项21,此时执行步骤S3。
步骤S3是路径转换步骤,由路径转换单元120对前述转向的目标指令即当前目标指令与下一个岐点项之间的目标指令进行编译,同时更新岐点链表存储区150中的数据,将所述当前目标指令的地址作为岐点项21添加入岐点链表20。
在路径变换步骤S3中,也可以限定执行路径长度,将一个较长的路径拆分成多个较短路径。
步骤S4到步骤S6是宿主指令执行步骤,由指令执行单元130进行。首先是步骤S4,从岐点链表20中的岐点项21中获得宿主指令缓存地址212的数据;其次,实施步骤S5,转到宿主指令缓存区150的执行对应的宿主指令;然后当执行到所述执行路径的终点时,跳到步骤S1继续处理。
请一并参阅图1、图2和图4,是本发明软件仿真方法中路径转换的流程图,包括步骤S31至步骤S37。
步骤S31是确认所述需转换的执行路径的终点。具体是沿着要转向的目标指令的方向在岐点链表20中寻找最近的岐点项21,如果找到,则以该岐点项21为所述执行路径的终点;如果找不到,则证明没有合适的岐点项。
步骤S32至步骤S35是编译目标指令的循环操作。首先是步骤S32,将目标指令分解成多个微操作码;步骤S33是将微操作码重组为宿主指令;步骤S34中,将宿主指令写入宿主指令缓存区140。
完成一条目标指令的分解后,即可获悉当前的目标指令是否含有跳转动作,如果不含有,则继续下一步操作;如果含有,则直接跳到步骤S36,准备完成路径转换。
下一步操作是判断是否已到达步骤S31中查找到的终点。如果已经到达,则跳到步骤S36,准备完成路径转换;如果没有到达,则继续步骤S35。如果步骤S31中没有找到终点,则不进行这一步操作,直接执行步骤S35。
步骤S35是获取下一条目标指令,并转到步骤S32,进行循环操作,直到路径转换完成。
当然,重组微操作码成宿主指令的步骤S33和写入宿主指令缓存区140的步骤S34也可以在步骤S35之后进行,即在循环操作后集中完成目标指令的编译。
步骤S36和步骤S37是更新岐点链表存储区150中的数据。首先实施步骤S36,将当前岐点项21插入岐点链表20,在其中写入岐点地址211、对应的上一岐点指针213和下一岐点指针214,如果没有与其相邻的岐点,则设置上一岐点指针213和/或下一岐点指针214为空。然后实施步骤S37,在岐点项21中写入该执行路径对应的宿主指令的宿主指令缓存地址214。
请一并参阅图5至图6,为了便于理解本发明,下面结合具体实例进行描述。
所述软件仿真装置100动态编译目标程序300的指令301-313(其中包含三条含跳转动作的目标指令303,309和311),将宿主指令存放在宿主指令缓存区140,同时在岐点链表存储区150生成岐点链表20。运行软件仿真装置100,启动向量将指向某一条目标指令,开始进入本发明软件仿真方法的流程。
若启动向量指向地址为301的第一条目标指令,则步骤S1确定的当前目标指令的地址为301;地址查找单元实施步骤S2,查找岐点链表存储区150,由于此时岐点链表存储区150没有岐点链表,因此进入步骤S3,开始转换岐点为第一条目标指令的执行路径。
步骤S3是转换路径子流程。首先执行步骤S31,确认所述需转换的执行路径的终点。具体是沿着第一目标指令的方向在岐点链表20中寻找最近的岐点项21,由于此时没有合适的岐点项,直接进入循环操作,直到路径转换完成。
执行步骤S32至步骤S34,将第一条目标指令分解为多个微操作码,重组微操作码成宿主指令,将宿主指令写入宿主指令缓存区140,存放地址可以随机确定,本实例中宿主指令缓存地址设为142。
由于当前指令不含跳转动作,并且找不到最近的岐点,因此进入步骤S35,转到下一条目标指令,继续处理。
当处理到地址为303的目标指令时,由于该目标指令含有跳转动作,因此在翻译该目标指令后,实施步骤S36和步骤S37,中止编译,更新岐点链表20,写入第一个岐点项21,其岐点地址211的数据为301,上一岐点指针212和下一岐点指针213均设置为空,宿主指令缓存地址212的数据为142。
然后回到主流程,实施步骤S4至步骤S6,由指令执行单元130进行宿主指令的运行。首先是步骤S4,从岐点链表20中的岐点项21中获得宿主指令缓存地址212的数据为142;其次,实施步骤S5,转到宿主指令缓存区150的对应的缓存地址142执行所述指令;然后当执行到所述执行路径的终点时,根据执行路径的运算结果,跳到步骤S1,确定转向的目标指令。
设该执行路径此次运算的结果将导致跳转到地址为307的目标指令,实施步骤S2,由于此时岐点链表20中不含有地址307,因此转换以该目标指令为岐点的执行路径,直到完成对含有跳转动作的地址为309的目标指令的翻译,同时将目标指令的地址307作为岐点,更新岐点链表20,其岐点地址211的数据为307,上一岐点指针212和下一岐点指针213分别设置为301和空,宿主指令缓存地址212的数据为144。
随后转换以310为第一条目标指令的执行路径,直到完成对含有跳转动作的指令311的翻译,将目标指令的地址310作为岐点,更新岐点链表20。
随后转换以312为第一条目标指令的执行路径,由于313是目标程序的地址最大的一条指令,将导致回到地址为301的目标指令。
请参阅图7,由于此时目标指令的地址301已包含于岐点链表20的岐点项21中,因此直接执行步骤S4至S5,设该执行路径此次运算的结果将不会导致跳转到地址为307的目标指令,则步骤S1确定的转向的目标指令的地址为304。
实施步骤S2,由于此时岐点链表20中不含有地址304,因此转换以该目标指令的地址为岐点的执行路径,直到来到最近的下一个岐点307,完成路径转换,将目标指令的地址304作为岐点,更新岐点链表20。
请参阅图8,是本发明软件仿真方法设置岐点的流程图,设置岐点通过在岐点链表20中增加岐点项来实现。
请一并参阅图9,在确定要设置岐点的目标地址后,例如需要在目标地址305处设置岐点,首先执行步骤D1,在岐点链表20中查找得到与该新的岐点项相邻的上一岐点304和下一岐点307。
做为保护性的措施,如果没有找到与新的岐点项相邻的上一岐点和下一岐点之一,则此时这个新岐点将是第一个或者是最后一个岐点,其插入的位置就是岐点链表20的头或尾。
随后实施步骤D2,在上一岐点304和下一岐点307之间,插入该新的岐点项,上一岐点304的下一岐点指针214的数据修改为305,新岐点302的下一岐点指针214的数据设置为307。
然后实施步骤D3,将这个新岐点305以及上下相邻岐点304、307的宿主指令缓存地址212均设置为空,这样就相当于执行路径没有转换过。当下次执行到这里时,就会重新转换执行路径。这也是一个强制刷新的动作,因为上次转换完成的可能是对应于原来的起点和终点的,而现在要把原来的一个执行路径拆成两段,所以就把岐点项21的宿主指令缓存地址212添成空的,强制重新转换这一段。
所述设置岐点的步骤可以将需设置为岐点的目标指令的地址作为岐点插入岐点链表20,从而允许动态调整执行路径分割方式,改善目标指令的断点设置或是单步执行时的调试能力,方便调试目标程序。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
权利要求
1.一种软件仿真方法,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括地址查找步骤,在岐点链表存储区的岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则进入宿主指令执行步骤,如果没找到则进入路径转换步骤;路径转换步骤,确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;宿主指令执行步骤,从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。
2.根据权利要求1所述的软件仿真方法,其特征在于所述路径转换步骤包括在岐点链表中查找沿当前目标指令的地址方向最近的岐点项;分解当前目标指令成微操作码,判断是否含有跳转动作,如果含有跳转动作则以当前目标指令的地址为所述执行路径的终点;如果不含有跳转动作则判断是否到达最近的岐点,如果到达则以当前目标指令的地址为所述执行路径的终点;如果没有到达最近的岐点,则继续分解下一条目标指令,直到到达所述执行路径的终点。
3.根据权利要求2所述的软件仿真方法,其特征在于所述路径转换步骤包括将微操作码逐条重组为宿主指令或者将执行路径的所有目标指令的微操作码集中重组为宿主指令。
4.根据权利要求2所述的软件仿真方法,其特征在于所述路径转换步骤还包括限定执行路径的长度,当执行路径达到预定长度时,以当前目标指令的地址为所述执行路径的终点。
5.根据权利要求1至权利要求4任一项所述的软件仿真方法,其特征在于,还包括步骤确定需设置为岐点的目标指令的地址;在岐点链表中查找与所述目标指令的地址相邻的岐点项;将所述目标指令的地址作为岐点插入岐点链表;将所述目标指令的地址对应的岐点项及其相邻的岐点项的宿主指令缓存地址置为空。
6.根据权利要求5所述的软件仿真方法,其特征在于在岐点链表中查找与所述目标指令的地址相邻的岐点项时,如果没有找到与所述地址上、下相邻的岐点项之一,则将对应于所述地址的岐点项插入岐点链表的头或尾。
7.一种软件仿真装置,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括用于存放宿主指令的宿主指令缓存区,其特征在于,还包括岐点链表存储区,用于存放岐点链表的岐点项,所述岐点链表的岐点项包括岐点地址和宿主指令缓存地址;地址查找单元,用于在岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则启动宿主指令执行单元,如果没找到则启动路径转换单元;路径转换单元,用于确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令的地址为岐点在岐点链表中添加岐点项;宿主指令执行单元,用于从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。
8.根据权利要求7所述的软件仿真装置,其特征在于还包括岐点设置单元,用于将需设置为岐点的目标指令的地址作为岐点插入岐点链表。
9.根据权利要求7或8所述的软件仿真装置,其特征在于所述岐点链表的岐点项还包括与该岐点上、下相邻的岐点指针。
全文摘要
本发明公开了一种软件仿真方法,用于将目标机的目标指令转化为宿主机的宿主指令并运行所述宿主指令,包括地址查找步骤,在岐点链表存储区的岐点链表中查找包含当前目标指令的地址的岐点项,如果找到则进入宿主指令执行步骤,如果没找到则进入路径转换步骤;路径转换步骤,确定以所述当前目标指令为起始指令的执行路径、编译该执行路径的目标指令并存放于宿主指令缓存区、以所述起始指令为岐点在岐点链表中添加岐点项;宿主指令执行步骤,从岐点链表的岐点项中获取所述目标指令的地址对应的宿主指令缓存地址,并转去宿主指令缓存区执行宿主指令。本发明减少由于执行路线变化产生的命中损失,提高了仿真速度;同时方便调试目标程序。
文档编号G06F9/455GK1635474SQ200310124219
公开日2005年7月6日 申请日期2003年12月31日 优先权日2003年12月31日
发明者张岩 申请人:北京北阳电子技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1