摘要:针对控制系统开发中程序调试难的问题,分析了计算机体系结构和指令系统,研究异构计算机软件移植可视化仿真技术,并设计了软件移植的可视化仿真系统。实验表明,该方法能解决异构机之间软件兼容和移植问题,提高了控制系统开发的效率。
关键词:异构计算机;软件移植;可视化仿真;指令系统
微机已经广泛应用于各种控制系统、智能仪器仪表、智能家电等领域。单片机性价比的提高,使单片机成为嵌入式系统的主流芯片。
目前,控制系统开发的常用方法是在pc机上编写和调试单片机系统程序。虽然,国内外有不少单片机开发系统,但由于单片机与pc机体系结构不同,用单片机指令编写的程序无法直接在pc机上运行,因此,系统开发时要有仿真器、编程器等专用设备,程序运行不能脱离单片机开发装置。因此,基于单片机的系统开发,源程序调试工作非常复杂,操作繁琐,调试结果的显示不够直观。针对上述情况,研究异构计算机软件移植可视化仿真技术,设计独立于单片机开发装置的可视化仿真系统,应用于控制系统和嵌入式系统的开发和实验具有重要的意义。本文在研究异构计算机软件移植可视化仿真技术的基础上,实现了在ibm-pc机上运行51系列单片机指令的可视化仿真系统,该仿真系统完全独立于单片机开发装置。
1软件移植概述
1.1软件移植方法
计算机系统层次模型[1]说明了各层次之间的关系及程序的执行情况。指令在计算机中执行的过程,实际上是指令由系统的高层逐级向低层转换的过程,从应用语言级直到微程序语言级,最后产生各种控制命令,驱动计算机的硬件完成指令功能。WWW.133229.coM高层语言转换为低层语言的实现方法有翻译法和解释法:翻译法是将高层程序变换成低一层等效程序,其处理流程可描述为
while(excutingflag)
{取指令;
分析指令;
转换成本层指令并保存;
}
执行转换后的指令;
上述流程中变量excutingflag为执行程序是否结束标志,其值为0表示程序结束。翻译法又分为动态翻译和静态翻译。动态翻译在程序运行过程中,将被仿真的指令逐条转换成仿真程序代码;静态翻译是代一次将所有被仿真的程序转换为仿真代码后执行。解释法是低层机器仿真高层机器级语句或指令,即对高层机器级语言进行解释并执行。其处理流程可描述为
while(excutingflag)
{取读指令;
分析指令;
解释执行;
}
翻译法速度快,但编程和调试困难;解释法易实现和调试,但速度慢。异构机之间的软件移植实际上也可以看成是将一台机器上所描述的语言在另一台机器上从高层向低层转换的过程。要实现异构机之间的软件移植,可以采用模拟和仿真两种方法[1]。模拟就是用一台机器(宿主机)的机器语言解释另一台机器(虚拟机)的指令系统来实现软件移植方法。但是这种方法运行速度显著降低、实时性差、编写程序困难。仿真是用微程序(宿主机)直接解释另一种机器(目标机)指令系统的方法。这种方法速度快,但微程序机器结构依赖于传统机器级结构,开发人员需要了解微程序机器的逻辑结构,当两种机器结构差别较大时很难仿真。
1.2软件移植步骤
在实际应用中,为了解决异构计算机之间软件移植问题,可以根据设计人员的需要开发指令仿真系统。指令仿真系统开发的一般步骤为
(1)分析仿真计算机和被仿真计算机的系统结构、指令系统、指令功能和指令结构;
(2)需求分析,编写程序模块和各模块流程图;
(3)选择合适的编程语言并编写程序;
(4)程序调试和优化;
2数据结构描述
数据结构描述关系到程序运行效率。在实际应用中,我们设计的仿真系统主要解决在ibm-pc机上执行由mcs51系列单片机指令系统所编写的汇编源程序,在分析mcs51单片机内部结构[2]的基础上,根据c语言的特点,同时兼顾程序运行的效率,合理地描述了系统设计所需的数据结构。
2.1程序存储器结构
mcs51内部虽然只有4kb的程序存储器,但在实际应用中可以在外部扩展至64kb,其内部有一个16位的程序计数器pc可寻址64kb以访问程序存储器。根据单片机指令结构[2]及c语言的数据类型关系,并考虑到程序仿真时并不会用到所有的存储单元,因此采用链式存储结构。程序存储器的数据结构描述如下:
typedefstructprogmem
{charopcode;
unsignedlabel;
//该条指令如果有标号,则存放其地址
charopnum1;
charopnum2;
charopnum3;
pmemrecaddr;
//存放当前指令的地址
pmemnextis;
//指向下一条指令的地址
}memdata,*pmem;
pmempc;
在结构体中,几个字符型变量分别用于存放指令的操作码和操作数,并用结构体指针变量存放当前指令及下一条指令的地址。仿真系统将单片机源程序翻译成目标代码放在程序存储器(结构体)中,通过结构体类型的指针变量可以访问程序存储器中的指令。
2.2数据存储器结构
mcs51将工作寄存器、端口和数据存储器统一编址,存储空间为256b。堆栈区设在30h~7fh,由堆栈指针sp指向栈顶。内部ram,除了工作寄存器、位标志、堆栈以外的单元,其余都可以当一般数据寄存器使用。如果内部数据存储器不够用,可以外接数据存储器,扩展至64kb。内部数据存储器在程序调试时需经常查看单元内容,且数量不大,因此将内部数据存储器定义为数组,堆栈指针定义为整型,并初始化为30h。
chardataram[256];
intramsp=0x30;
数据存储器单元的地址和数组的下标对应,这样在程序调试时,如果要查看内部数据存储器的内容,只要查看数据相应元素的值即可。另外定义一个结构体类型,模拟外部扩展的数据存储器,结构体定义如下:
typedefexdataram
{chardata;
unsignedaddrram;
//存放存储单元的地址,用于查询
exramptexdatap;
}ramdata,*exrampt;
如果用到外部数据存储器,则将数据存在动态链式存储结构中,由于仿真程序运行时使用本机的存储器,因此其地址与仿真的单片机的地址不同,用一个变量addrram存放数据存储器的地址,以便于地址单元内的数据查询。
3软件移植的可视化仿真
软件移植可视化仿真系统,不仅要完成汇编指令的功能,而且应该根据要求查询程序执行后各寄存器的内容、端口的状态和运行结果。在系统开发过程中,我们详细分析了单片机指令格式[2]和计算机执行指令的过程[3],并根据仿真的速度要求,通过比较各语言的特点,选用visualc++语言和80x86汇编语言,采用c语言环境下的在线汇编技术,用解释法实现可视化指令仿真系统。
3.1软件移植过程
解释法完成异构机指令仿真,需要对源程序中的每一条指令执行如下操作:
step1对指令从右向左扫描,如果有注释,则去掉注释;
setp2对指令从左向右扫描,如果有标号,则去掉标号,并记录标号所在位置;
step3将无标号和注释的指令从左向右逐步分离出操作码和操作数;
step4保存操作码和操作数;
step5分析操作码的功能并执行该指令。重复执行以上步骤直到程序结束,对分离出的操作码和操作数存入结构体progmem定义的变量中。实现这一过程的函数结构如下:
pmemstringsplit(char*istructionstring)
{iscode_num=newmemdata;
⋯
if(scan_char==’;’)
{去除分号后的内容;}
if(scan_char==’:’)
{保存该指令所在单元地址;}
if(scan_char==’’)
{保存空格前的字符串;}
//得到的第一个字符串为操作码
⋯
return(iscode)
}
该函数入口参数为指令字符串,返回指向保存该指令的结构体变量的指针。生成目标代码和执行指令的过程可以用switch语句或事先设计函数跳转表实现[4],本文采用switch语句实现,实现函数结构如下:
voidgetcode(pmemincode)
{⋯
switch(opcode)
{casecode1:excucode1();break;
casecode2:excucode2();break;
⋯
casecoden:excucoden();break;
}
⋯
}
以上代码中excucoden的入口参数为指令的操作码和相应的操作数。
3.2可视化仿真的实现
可视化仿真系统应该提供一个集成开发环境,在此环境下可以编辑新的汇编程序和打开已经存在的源程序,并能将用被仿真计算机语言所编写的源程序汇编(编译或解释)成ibm-pc所能识别的代码及执行所需的操作,根据需要查询相应存储器单元的内容和端口的状态并显示查询结果。本系统在实现集成开发环境时,设计一个文本窗口,在窗口内输入的每条指令占用一行,程序输入后,选择工具菜单中的“执行”命令,则对窗口内的指令逐行扫描,完成对程序的解释执行。程序执行分单步执行和连续执行,如果是单步执行,则执行一条指令后显示相应存储单元或寄存器的内容。连续执行,则在执行完所有的指令后,弹出一个对话窗口,根据实际,可以查看所有数据存储器和特殊功能寄存器的内容,或者输入要查看的寄存器或内存单元的地址,显示相应单元内容,结果显示采用十进制或二进制。对于端口状态,显示数据为二进制形式。结果的可视化查询对于存储器和寄存器采用不同的技术,为每一个寄存器设置一个文本框,用以显示对应寄存器的内容,而所有程序中涉及到的存储单元的内容显示在同一个文本窗口中。
4结束语
本文介绍的可视化仿真系统的开发技术,使用图形用户界面(gui),实验结果表明,该方法显示直观、结果查询方便,而且应用vc环境下在线汇编技术,编写的程序代码占用系统资源少,又能保证系统运行效率。虽然本文以ibm-pc和单片机作为应用实例,但是详细分析其它异构计算机的体系结构和指令功能,使用本文提出的软件移植的可视化仿真技术,不仅可以解决各种系统开发中的难题,而且可以解决各种异构计算机之间的软件兼容性和移植性问题。
参考文献
1张吉锋,徐炜民,严允中.计算机系统结构.北京:电子工业出版社,1997
2徐君毅,张友德,余宝洪等.单片微型计算机原理与应用.上海:上海科学技术出版社,1990
3kaihwang.advancedcomputerarchitecture.beijing:chinamach-inepress,1999
4王萍,王险峰.cpu仿真程序的编程方法与优化.计算机应用研究,2000,(8)