optimus
驱动牛犊
驱动牛犊
  • 注册日期2004-05-16
  • 最后登录2004-07-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3028回复:1

一个通用嵌入式系统模拟器的开发

楼主#
更多 发布于:2004-05-16 12:03
以下是我正在撰写的毕业论文的部分内容,关于我的嵌入式系统模拟器软件(ProEmulator)的研究与开发。软件介绍可以看这贴:
http://www.driverdevelop.com/forum/html_68059.html?1084679818



软件网站:
http://proemulator.sourceforge.net/
http://sourceforge.net/projects/proemulator/


嵌入式系统的基本概念

一个嵌入式系统(Embedded system)就是一个计算机硬件和软件的集合体,可能还包括其他一些机械部件,它是为完成某种特定的功能而设计的,它常常是一些更大的系统中的一个组成部分。

所有的嵌入式系统都包含处理器和软件。要执行软件,就一定要有存储执行代码的地方和存放运行时数据的临时存储区,这就分别要用到ROM和RAM;任何嵌入式系统都会有存储器。所有嵌入式系统都包含某种输入和输出,因此它都具有输入输出接口。嵌入式系统的输出几乎总是它的输入和其他一些因素的函数。

除了上述的几个共同点,嵌入式系统的其他部分通常是互不相同的。系统之间的差异是由不同的设计侧重导致的。每个系统都是可能面向完全不同的一整套需求,这些需求的这种考虑直接影响了产品的开发过程。

模拟器的用途及现有模拟器的优缺点

模拟器必须使应用程序\"认为\"自己运行在实际上不存在的硬件上,应用程序的每一条被执行的指令都必须忠实地被模拟器软件\"冒充\"。
模拟器的优点在于它们如何使工程师和程序员在没有真正的硬件的条件下就能展开一些实在的开发工作。应用程序在逻辑上的错误能用模拟器很快地被暴露和定位,甚至有些硬件相关地故障也能被纠正。当然要取决于仿真器的功能。例如,有些模拟器可以提供输入模拟文件,一种使你能通过写一组输入的脚本来操作模拟器的功能,你可以告诉模拟器在应用程序开始10毫秒后发送一个中断,20毫秒后再发送一个中断等等。用这种方法,用户可以一种精确的控制方法来操作应用程序,这是别的方法不可能实现或昂贵得不可实现的(若用硬件)。

模拟器的缺点是运行比真正的硬件慢很多。目前大多数模拟器的最大不足是仅能模拟处理器,而嵌入式系统经常包含一个或更多重要的外围设备。和这些设备的交互有时会限制模拟器的工作内容,而这些用模拟器很难产生的工作内容又会是很重要的。

ProEmulator的主要特点

嵌入式系统架构是非常多样的,这种多样性型导致每一个系统平台都有自己的开发工具,其中就可能包括形形色色的IDE环境、调试器和模拟器。不同系统的开发工具可能会有大相径庭的界面和特点,在这种情况下,嵌入式系统的开发者就会经常面对一个新的开发环境,这就使他们需要花费额外的时间和精力去学习和适应。此外,不同的系统需要不同的开发工具,这些开发工具的功能都是基本相同的,区别仅仅在于面向不同的平台。这种情况下开发工具的开发也会存在重复投入。

一个通用的多目标的系统开发工具可以基本解决以上的问题。ProEmulator就是这样一个具有统一IDE界面,支持多种处理器模拟和调试,支持多种编译器,支持多种外设模拟的开发工具。

ProEmulator首先是一个多目标模拟器,它可以模拟多种设备。这种特性源于它独特的插件机制。这种机制稍候我会详细介绍。模拟的对象主要分成处理器和外设,处理器的模拟由ProEmulator中的处理器插件完成,其中包括对指令集、片内存储器、片内定时器、片内UART和输入输出端口的模拟。外设模拟由外设插件完成,其中包括外设外部形态模拟(如果有的话)、设备逻辑模拟和输入输出端口模拟,通过模拟的输入输出端口,ProEmulator把处理器和外设连接在一起(可以由用户自由地把处理器和外设的引脚连接起来),并在模拟过程中使它们进行互动。不同的处理器一般会有不同的编译器,而这些编译器一般会有不同的命令格式和输出格式,在ProEmulator中,对编译器的调用由不同的编译器插件来完成,编译器插件根据要求生成不同的编译器命令行参数,然后调用编译器程序,待编译器完成编译后读取和转换编译器的输出结果,并返回给ProEmulator。ProEmulator不仅可以模拟不存在的硬件设备,还可以连接真实的设备,比如试验仪或开发板,并对其进行操作和控制。ProEmulator更是一个集成的开发和调试环境。它具有一个界面友好的代码编辑器,可即时修改的存储器和寄存器查看窗口。它具有各种传统的调试功能,包括单步(step over)、断点(breakpoint)和观察(watch)等。

ProEmulator的插件机制
要在统一的界面和环境下支持多种系统平台的模拟,需要一种灵活的软件架构。著名的Winamp音乐播放器软件是一个很好的借鉴。它在统一的界面下支持多种格式的音乐格式,支持多种输出方式,并可以方便地对功能进行扩充。这得益于它独特的插件(plugin)机制。一个插件是一个完成一些特定功能的代码的集合,而区分这些功能的依据往往是其对象和目标不同。它们一般不在程序启动时装入,而是在用户需要它们时被装入。一个软件可以有很多插件,它们支持不同的对象,对于主程序,它们提供统一的接口,这有点类似驱动程序的概念,插件可以看作一个抽象层,它使主程序和具体的目标无关。
插件机制的实现基础是动态链接技术,现代操作系统都具备了这种技术。在Windows中DLL就是实现动态链接的载体。一个DLL和EXE一样包含着可执行代码,但它们不在编译时被链接入主程序,而在主程序运行期间载入执行,并且可以随时载入随时卸载。这种机制大大方便了插件的实现。

ProEmulator的体系结构中涉及三种插件,这在前面已经提到过。他们分别是:处理器插件、编译器插件和外设插件。为了编写插件更加容易,ProEmulator向插件提供一些实用的API函数,这些函数可以由插件程序调用。

处理器插件
处理器插件的作用就是模拟目标处理器。拿一个8051微控制器模拟插件来说,他必须模拟8051的指令集,包括指令解码过程和具体的指令功能的实现。它还必须模拟8051的指令存储器、数据存储器和外部存储器(如果有的话)和IO端口,如果要更完善的话,它还要模拟8051的计时器/计数器和串行口的行为。如何编写处理器插件和实现目标处理器模拟的方法是非常灵活和多样的,只要符合定义好的插件基本程序结构,插件编写者有非常大的自由发挥的空间。ProEmulator的图形界面(包括存储器、寄存器和引脚查看/修改窗口)的操作都是针对处理器插件的,因此处理器插件一般不需要编写界面。

处理器插件不仅可以担当模拟一个处理器的工作,更可以与真实的硬件模拟器进行沟通,使在ProEmulator界面上的操作被映射到硬件模拟器中进行。一个很好的例子就是EICE51实验仪(一种8051实验仪)和EICE51插件。当用户在界面上修改内存数据,普通的处理器插件会修改模拟存储器中的数据,而EICE51插件会生EICE51修改存储器的命令,并通过串口发送给实验仪;当用户在界面上选择单步运行的时候,普通的处理器插件会进行一条指令的模拟,而EICE51插件会生成EICE51单步运行指令,并发送给实验仪。这样,ProEmulator不仅可以模拟一个处理器,通过编写特殊的处理器插件,它就可以连接实验仪或开发板并以图形方式对其进行控制。

编译器插件
正如前面所说的,不同的处理器一般会有不同的指令集,因此需要不同的汇编器和编译器来将源程序翻译成机器代码。为了统一不同的编译器之间的输入输出差异,使ProEmulator可以以统一的方式对其进行调用,编译器插件很自然地被引入了。编译器插件的编写和程序结构相对处理器较为简单,它所做的就是根据用户的要求生成相应的编译器参数,并调用编译器,然后将编译器的结果传递给ProEmulator。如果要支持调试,编译器插件还需要能理解编译器生成的调试信息(比如符号表),并将其翻译并传递给ProEmulator。同一时刻可以有一个编译器插件被设置为活动编译器,此时所以编译工作都由这个活动编译器完成。

编译器插件可以包含一个或几个窗口界面,提供给用户对编译器进行各种设置。用户在ProEmulator选择编译器选项设置时该窗口就可以被显示。通过编译器插件,ProEmulator可以支持各种语言的源代码编译,包括汇编语言,C语言和C++等。

外围设备插件
外设的模拟是ProEmulator的特色之一。外设插件就是用来实现外设的模拟。虽然模拟目标不同,但是它和处理器插件有着完全相同的程序结构。这种设计是出于以下几点考虑:首先,任何外设都可以被抽象成一个非常简易的处理器,一个外设(比如一个网络控制器或LCD控制器)可能会有几个寄存器和很小的RAM,它可能也有ROM存放启动代码,它和处理器一样具有外部引脚(输入输出端口),它可能也有一个简单的指令集,因此它和处理器有很多相似点;第二,外设插件和处理器插件具有相同的结构,这样可以在必要时使一个处理器插件当作外设插件来使用,这样一来可以模拟两个处理器互动的情况,二来用户可以在一个处理器上编写一段简单的程序用来产生中断或引脚信号,然后将其作为一个外设和另一个处理器相连,用来调试另一个处理器的程序;第三,相同的程序结构还可以在一定程度上简化ProEmulator软件的开发。外设插件一般提供一个GUI界面,用来反映外设的内部状态或模拟外设的外部形态。和处理器插件一样,外设插件的编写也有相当大的自由度。

外设插件和处理器插件一样可以(不是一定)模拟设备的引脚。有了这些模拟的引脚,用户就可以自由地把处理器和外设连接起来。这通过设置引脚映射完成,换句话说,就是设置外设的各个引脚和处理器的哪个引脚相连。

外设插件不一定是现实存在的外设的模拟,它可以被用来完成任何需要的功能,比如一个引脚状态显示器(把这想成几个连接在处理器引脚上的发光二极管也没什么不可以)或者一个CPU内部状态的监视器。

ProEmulator的其它特点

ProEmulator可以将模拟的串行口输入输出重定向到主机上的串口或其他设备(包括模拟的终端窗口、命名管道或是磁盘文件)。

【未完待续】

[编辑 -  5/16/04 by  optimus]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-05-17 09:25
好,支持。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部