简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc

上传人:仙人指路1688 文档编号:3990588 上传时间:2023-03-30 格式:DOC 页数:58 大小:2.40MB
返回 下载 相关 举报
简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc_第1页
第1页 / 共58页
简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc_第2页
第2页 / 共58页
简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc_第3页
第3页 / 共58页
简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc_第4页
第4页 / 共58页
简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc》由会员分享,可在线阅读,更多相关《简化的8088CPU逻辑功能的仿真实现毕业设计论文.doc(58页珍藏版)》请在三一办公上搜索。

1、毕业设计(论文)简化的8088CPU逻辑功能的仿真实现论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期: 简化的8088CPU逻辑功能的仿真实现摘 要 “虚拟实验平台”主要采用以“软”代“硬”和“虚”、“实”结合的设计思路,强调实用性,以最大限度地仿真真实的实验环境。主要实现了“专用实验台”的虚拟化,将它“搬”到了“微机”的显示器上,而原有在微机上的实验操作环境和方法仍然保持不变。系统还提供必要的测试仪器和工具(如示波器等),以便在实验调试时能够对运行结果进行监视或测量,如输出电平或波形,这种虚拟的测试仪器和工具也在界面和操作方面做到了尽可能的逼真。本文介绍了该虚拟

2、试验平台的整体功能特点,主要介绍了8088CPU的结构,工作方式,以及如何用VC实现这些具体功能的编程方法。并加入了一些程序片段,对完成工作中遇到的困难也做了些总结。关键词:仿真试验平台;8088CPU;VC;封装;寄存器;移植 Implementation of simplified model 8088 CPUs Logic FunctionAbstractVirtual platform principal use soft to instead of hard and superficial, real combination of design ideas, emphasize pr

3、acticality, to maximize the simulation of the real environment. Major implementation of the exclusive Experimental Station, the virtual, it will be moved to the PC display, The original PC in the lab environment and methods remain unchanged. The system also provides the necessary test equipment and

4、tools (such as oscilloscopes, etc.) Experimental testing in order to be able to run when the results of surveillance or measurements, such as the output level or waveform, This virtual testing equipment and tools also interface and the operation done in a realistic as possible. This paper introduces

5、 the Virtual Test platform overall features, mainly on the structure of the 8088 CPU, work methods, and how to use VC these specific functional programming method. And the inclusion of some procedures footage completed work on the difficulties encountered also made some conclusion.Key words: virtual

6、 experement platform;8088CPU8; VC; encapsulation;register;port目录论文总页数:581页1 概述11.1课题背景及意义11.2项目介绍11.2.1虚拟化技术简介11.2.2 CPU虚拟化技术简介21.3项目要求22 VC+6.0的编程22.1 MFC编程22.2 DLL相关知识23 8088CPU介绍33.1. 概述33.2 8088CPU引线及其功能33.3 8088CPU的内部结构43.4 时序53.5 简化的8088CPU模型概述53.6移植bochs仿真实现8088CPU功能的基本思路74 Bochs介绍74.1 Bochs概

7、述74.2 类 BX_CPU_C 介绍74.2.1 主要的数据成员74.2.2 主要的成员函数84.3 BX_CPU_C 类对CPU工作流程的简易描述94.4 基本内存系统114.4内存的访问124.5 Bochs 时钟系统144.6 Bochs中断系统155 具体移植实现175.1 虚拟实验平台统一的器件模型175.2 CPU类的主要功能及实现方法175.2.1 修改cpu loop185.2.2 修改插库18结 论18参考文献19致 谢20声 明21简化的8088CPU逻辑功能的仿真实现1 概述1.1课题背景及意义过去当人们在开发一个项目时可能会遇到以下问题(1)经常苦于经费不足,缺少足够

8、的硬件开发板和完善的软件开发环境,相关的书籍对一些最新软件的分析还不够全面(2)高层次的软件设计和开发一般不用过多考虑底层硬件的实现细节,如果直接处于一具体的硬件环境下,在开发和研究中可能会陷入硬件的具体细节中不能自拔,而不能把精力放到高层次的软件设计和开发上。(3)如果硬件开发环境不太稳定(这种情况经常见到),且对身体的硬件不是很了解,则可能在排除问题上花费大量不必要的时间,所以人们利用仿真技术来解决这些问题以到达节约人力物力的目的。1.2项目介绍1.2.1虚拟化技术简介从1965年IBM在7044机上首次实现虚拟技术以来,这一名词对于计算机世界来说已经不是一个新名词。虚拟化是一个广义的术语

9、,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。虚拟化技术与多任务以及超线程技术是完全不同的。多任务是指在一个操作系统中多个程序同时并行运行,而在虚拟化技术中,则可以同时运行多个操作系统,而且每一个操作系统中都有多个程序运行,每一个操作系统都运行在一个虚拟的CPU或者是虚拟主机上。当我们尝试着理解虚拟技术时,首先必须要理解“虚拟”的概念。“虚拟”这个词最早来源于光学,用于理解镜子里的物体。现在,“虚拟”这个词已经经过演化,用来描述任何真实物体的模拟了,例如分区、虚拟机、虚拟内存、虚拟磁盘和虚拟现实。在讨论虚拟技术的时候,

10、使用“虚拟”这个词,是因为我们希望虚拟机看起来和工作起来都和真正的机器一模一样。这意味着,虚拟机并不是真正的机器,但是它能像真正的机器一模一样地工作。实际上,从原理上看,所有虚拟技术虚拟的是指令集。所有的IT设备,不管是PC、服务器还是存储,都有一个共同点:它们被设计用来完成一组特定的指令。这些指令组成一个指令集。对于虚拟技术而言,“虚拟”实际上就是指的这些指令集。虚拟机有许多不同的类型,但是它们有一个共同的主题就是模拟一个指令集的概念。每个虚拟机都有一个用户可以访问的指令集。虚拟机把这些虚拟指令“映射”到计算机的实际指令集。虚拟化技术也与目前VMware Workstation等同样能达到虚

11、拟效果的软件不同,是一个巨大的技术进步,具体表现在减少软件虚拟机相关开销和支持更广泛的操作系统方面。按照虚拟层所处位置的不同,目前所有的虚拟技术大致可以分为硬件虚拟、逻辑虚拟、软件虚拟和应用虚拟四种类型。1.2.2 CPU虚拟化技术简介 CPU的虚拟化技术是一种硬件方案,支持虚拟技术的CPU带有特别优化过的指令集来控制虚拟过程,通过这些指令集,VMM会很容易提高性能,相比软件的虚拟实现方式会很大程度上提高性能。虚拟化技术可提供基于芯片的功能,借助兼容VMM软件能够改进纯软件解决方案。由于虚拟化硬件可提供全新的架构,支持操作系统直接在上面运行,从而无需进行二进制转换,减少了相关的性能开销,极大简

12、化了VMM设计,进而使VMM能够按通用标准进行编写,性能更加强大。另外,在纯软件VMM中,目前缺少对64位客户操作系统的支持,而随着64位处理器的不断普及,这一严重缺点也日益突出。而CPU的虚拟化技术除支持广泛的传统操作系统之外,还支持64位客户操作系统。 虚拟化技术是一套解决方案。完整的情况需要CPU、主板芯片组、BIOS和软件的支持,例如VMM软件或者某些操作系统本身。即使只是CPU支持虚拟化技术,在配合VMM的软件情况下,也会比完全不支持虚拟化技术的系统有更好的性能。1.3项目要求综合运用以前所学的专业知识,设计开发一个简化的8088CPU功能模拟的演示软件;在设计与开发中,将CPU与存

13、储器整合在一起的模型,1.实现CPU的指令系统 2. 实现CPU的时序逻辑 2 VC+6.0的编程2.1 MFC编程MFC用类编写Windows应用程序的C+类集,以层次结构组织起来,其中封装了大部分Windows API函数和 Windows控件,而基础的虚拟平台就是在次基础之上而开发出的。使用MFC类库和Visual C+提供的高度可视的应用程序开发工具,可是应用程序开发变的更简单,开发周期极大地缩短,提高代码的可靠性和可重用性。它提供的类库对程序设计的高度抽象,使得程序员不用放在程序设计的具体细节上,而是对功能的扩展上,大大简化了开发工作。在开发过程中,我们所做的就是编写封装器件的程序,

14、由平台调用之来显示出控件,除了编写一些相关消息响应函数外,大部分工作由系统完成。2.2 DLL相关知识比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性

15、的单元测试。Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL (Dynamic Linkable Library) 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。3 8088CPU介绍3.1. 概述 8088是8080和8085的改进型,像8080和8085一样,它的指

16、令是以字节为基础构成的。它的性能的提高,主要依赖于采取了以下一些特殊措施。 1. 建立4字节的指令预取队列 2. 设立地址段寄存器 3. 在结构上和指令设置方面支持多微处理器系统 一般处理器与8088CPU处理器指令过程见图表1 图表 1 一般处理器与8088处理器指令执行过程对比(a)一般处理器指令执行过程;(b)8088处理器指令执行过程3.2 8088CPU引线及其功能 8088CPU是一块具有40条引出线的集成电路芯片,其各引出线的定义如图22所示。为了减少芯片的引线,有许多引线具有双重定义和功能,采用分时复用方式工作,即在不同时刻,这些引线上的信号是不相同的,其管脚引线如图表2。 图

17、表 2 8088处理器芯片引线图3.3 8088CPU的内部结构8088微处理器内部分为两个部分:执行单元(EU)和总线接口单元(BIU),如图表3所示。 图表 3 8088CPU的内部结构 8088处理器中的内部寄存器用户能用指令改变其内容的,主要是一组内部寄存器,其结构如图表4所示。 1)数据寄存器 8088有4个16位的数据寄存器,可以存放16位的操作数。 2) 指针寄存器 8088的指针寄存器有两个:SP和BP。SP是堆栈指针寄存器,由它和堆栈段寄存器一起来确定堆栈在内存中的位置。BP是基数指针寄存器,通常用于存放基地址,以使8088的寻址更加灵活。 3)变址寄存器SI是源变址寄存器,

18、DI是目的变址寄存器,都用于指令的变址寻址。 4)控制寄存器8088的控制寄存器有两个:IP,PSW。IP是指令指针寄存器,用来控制CPU的指令执行顺序。 图表 4 8088CPU的内部结构3.4 时序 在8088CPU中,CPU与内存或接口间进行通信,如将一个字节写入内存一个单元(或接口),或者从内存某单元(或某接口)读一个字节到CPU,这种读(或)写的过程称为一个总线周期。3.5 简化的8088CPU模型概述 本设计的设计目标是设计一个简化的8088CPU模型,要求模型体现8088CPU的主要功能,省略掉其很多繁琐的细节。基于此考虑,简化模型主要从如下几个方面对8088CPU作了简化:1

19、取消8088里的取指令、执行指令流水线2 取消8088里的指令预取对列3 取消8088里管脚的分时复用功能4 将存储器与CPU融合,简化存储器读写总线周期5 对8088的管脚也重新进行了设置。管脚设置如图表5所示,CPU内部功能结构如图表6所示: 图表 4简化8088CPU管脚分布 图表 5 简化8088CPU内部功能结构 3.6移植bochs仿真实现8088CPU功能的基本思路CPU指令系统和时序逻辑是本设计难点,而我们解决难点采取的办法是移植虚拟机bochs,它包含了8088下所有CPU指令的仿真函数实现。而且还专门预留了一个插槽库供扩展Bochs使用。Bochs很庞杂,也很少文献资料,了

20、解Bochs成为我们前期的工作。4 Bochs介绍4.1 Bochs概述Bochs是一个X86的模拟器,它可以模拟几乎所有类型的X86 CPU,包括16位,32位和64位(X86_64)。一个64位的X86可以看作是32位和16位X86的超集。X86_64的工作方式包括以下两类:1,IA-32模式:包括实模式,保护模式和虚拟8086模式三个子模式。2,IA-32e模式:包括长模式和兼容模式。在Bochs中,用BX_CPU_C类来模拟CPU,它支持上面提到的每一种模式。4.2 类 BX_CPU_C 介绍4.2.1 主要的数据成员char name64,代表CPU的名字。unsigned bx_c

21、puid,CPU的ID号,用于SMP(对称多处理)的机器。bx_gen_reg_t gen_regBX_GENERAL_REGISTERS,bx_gen_reg_t是一个复杂的结构体,它表示一个64位的通用寄存器,其主要成员有:rrx:表示一个完整的64位寄存器。hrx、erx:分别表示64位寄存器的高32位与低32位,这时候64位的寄存器被分割成2个32位寄存器使用。rx:表示erx的低16位,此时寄存器被当作16位寄存器使用。rh、rl:分别表示rx的高8位与低8位,此时rx被分割成2个8位寄存器。gen_reg就是一个代表通用寄存器的数组,BX_GENERAL_REGISTERS是寄存器

22、的个数,如果模拟的是64位处理器,那么BX_GENERAL_REGISTERS值为16,否则值为8。64位时通用寄存器分别是RAX、RCX、RDX、RBX、RSP、RBP、RSI、RDI、R8R15;32位时没有R8R15 。Bit64u rip; Bit32u eip;分别是64位模式和32位模式下的指令指示器。bx_segment_reg_t sregs6;bx_segment_reg_t是表示段寄存器的结构,sregs6是表示了6个段寄存器的数组。分别是ES、CS、SS、DS、FS和GS。BX_MEM_C *mem;mem是指向这个CPU所使用的内存的指针 。bx_local_apic_

23、c local_apic;bx_local_apic是模拟本地APIC的类,用于SMP系统。 unsigned cpu_mode;就是前面提到的CPU的工作模式,主要有5种,分别是实模式(16位模式)、8086虚拟模式(32位模式下的虚拟16位模式)、保护模式(32位模式)、兼容模式(64位模式下的虚拟32位,16位模式)和长模式(64位模式)。分别使用宏BX_MODE_IA32_REAL、BX_MODE_IA32_V8086、BX_MODE_IA32_PROTECTED、BX_MODE_LONG_COMPAT和BX_MODE_LONG_64表示。4.2.2 主要的成员函数void cpu_l

24、oop(Bit32s max_instr_count)cpu_loop是一个非常重要的函数,所有的指令函数都在这里执行。参数max_instr_count表示cpu_loop执行的最大指令数。 void prefetch(void)预取指令函数,计算指令的物理地址和其他相关信息,为后面的指令译码作准备。unsigned fetchDecode(Bit8u *iptr, bxInstruction_c *instruction,unsigned remain)unsigned fetchDecode64(Bit8u *iptr, bxInstruction_c *instruction,unsi

25、gned remain)这两个函数用于对指令进行译码,前者按指令长度32位译码,后者按64位译码,参数意义分别是指令的物理地址,空白指令结构和指令长度的最大字节数void boundaryFetch(Bit8u *fetchPtr, unsigned remainingInPage, bxInstruction_c *i)X86的最长指令可以达到15个字节,因此指令可能出现跨页,此时prefetch()+ fetchDecode()/fetchDecode64()失败,必须调用boundaryFetch()函数进行跨页取指译码。4.3 BX_CPU_C 类对CPU工作流程的简易描述CPU工作流

26、程见图表7 图表 6 CPU工作流程示意图 prefetch()函数(指令预取)void BX_CPU_C:prefetch(void) 计算laddr /指令所在的线性地址 计算paddr /经过地址翻译得到的指令的物理地址 计算laddrPageOffset0 /指令所在的线性页(虚页)的基地址 计算eipPageOffset0 /RIP - (laddr - laddrPageOffset0),指令所在页基 地址相对于CS的偏移 计算eipPageBias / - eipPageOffset0 计算eipPageWindowSize /页大小,值为4096; 计算pAddrA20Page

27、 /pAddr & 0xfffff000,指令所在的物理页的基地址 计算eipFetchPtr /通过getHostMemAddr()计算得到的指令所在页在主机(真实机器)上的基地址所谓指令预取,就是计算指令的物理地址和其他相关信息,为后面的指令译码作准备。表8是其功能流程: 图表 7指令预取功能流程图fetchDecode()函数(指令译码):指令的结构用一个类指令结构bxInstruction_c 来表示,它的两个主要成员函数下:void (BX_CPU_C:*ResolveModrm) (bxInstruction_c *) BX_CPP_AttrRegparmN(1); /获取指令的类

28、型,类型是由bochs定义的void (BX_CPU_C:*execute)(bxInstruction_c *); /指令对应的执行函数指针基本指令放在一个数组中: static BxOpcodeInfo_t BxOpcodeInfo512*2 第0511项: 16bit mode 第5121023项: 32bit mode (其中包括了fpu,x86-64,3DNOW,SSE等指令入口)boundaryFetch()函数(跨页边界取指)void boundaryFetch(Bit8u *fetchPtr, unsigned remainingInPage, bxInstruction_c

29、*i)因为指令跨页,不能将指令的首地址作为参数传给fetchDecode()/fetchDecode64(),因此设立临时变量fetchBuffer,用以保存在两页中取出的共15个字节,并将fetchBuffer作为译码的参数。指令的最大长度为15字节,但具体每条指令的长度是不定的,在本次取指过程中为了实现跨页移动了RIP,因此返回之前必须将其复原,函数返回以后,在cpu_loop()里面,会根据实际的指令长度移动RIP。4.4 基本内存系统主要文件:Memory.h, Memory.cc,Misc_mem.cc 主要类:bx_mem_c 内存块基指针:Bit8u *actual_vector

30、;/实际分配的内存块指针 Bit8u *vector; /经过对齐处理(4K大小整数倍 )内存大小size_t len; /以字节为单位size_t megabytes; /以兆字节为单位 内存空间的分配: alloc_vector_aligned (size_t bytes, size_t alignment) 图 4-3 内存空间分配图 图表 8内存空间分布图X86处理器的分页机制(相关寄器):CR0:当CR0PG(表示CR0寄存器的PG位,下同)1时,启用分页机制。CR3:X86处理器通常使用多级页表,CR3中存放着最高级页表的基地址。CR4:当CR4PSE1时,使用4M/2M大小的页面

31、,否则使用4K大小的页面;CR4PAE1时,启用PAE模式(支持36位地址空间的物理内存)。4.4内存的访问 Bochs中主要由下面三个函数处理内存的读写操作:void access_linear(bx_address laddr, unsigned length, unsigned pl, unsigned rw, void *data)void readPhysicalPage(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data)void writePhysicalPage(BX_CPU_C *cpu, Bit32u addr, uns

32、igned len, void *data)access_linear()函数的作用是在以指定的(线性)地址为起始地址处读/写一块数据。参数意义分别是,访问的起始线性地址,读或写的数据长度,特权级别,操作方式(读、写)和数据缓冲区。readPhysicalPage() 和writePhysicalPage()的功能是读/写主机上的内存页。access_linear()函数struct bx_address rm_addr; Bit32u paddress1; /数据块在第一页的起始地址 Bit32u paddress2; /数据块在第二页的起始地址 Bit32u len1; /数据块在第一页的

33、长度 Bit32u len2; /数据块在第二页的长度 bx_ptr_equiv_t pages; /数据块所跨越的页数(1或2) address_xlation;address_xlation是类BX_CPU_C的一个成员,包含了经过翻译的地址结构和相关信息,函数access_linear()中的参数length总是小于页面的大小,但是数据块的起始地址可能在页中的任意位置,所以数据块可能在一页内,也可能跨越两页,但不会更多access_linear()函数Void access_linear(bx_address laddr, unsigned length, unsigned pl, un

34、signed rw, void *data) if (BX_CPU_THIS_PTR cr0.pg) /启用分页 if ( (pageOffset + length) 20; 如果是特殊内存段,用memory_handler完成读操作#if BX_SUPPORT_APIC local_apic-read (addr, data, len) / ioapic-read (addr, data, len); #endifread_one: if ( (a20addr & 0xfff80000) != 0x00080000 ) *data_ptr = vectora20addr;inc_one: i

35、f (len = 1) return; len-; a20addr+;#ifdef BX_LITTLE_ENDIAN data_ptr+;#else / BX_BIG_ENDIAN data_ptr-;#endif goto read_one; . writePhysicalPage()void writePhysicalPage(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data) a20addr = A20ADDR(addr); struct memory_handler_struct *memory_handler = memory_

36、handlersa20addr 20; 如果是特殊内存段,用memory_handler完成读操作#if BX_SUPPORT_APIC local_apic-write (a20addr, (Bit32u *)data, len); / ioapic-write (a20addr, (Bit32u *)data, len);#endifwrite_one: if ( (a20addr & 0xfff80000) != 0x00080000 ) vectora20addr = *data_ptr;inc_one: if (len = 1) return; len-; a20addr+;#ifd

37、ef BX_LITTLE_ENDIAN data_ptr+;#else / BX_BIG_ENDIAN data_ptr-;#endif goto write_one; . 4.5 Bochs 时钟系统Bochs的时钟系统主要由pc_system.cc这个文件描述在bx_pc_system_c这个类中,定义了时钟系统的各种变量和功能函数。timerBX_MAX_TIMERS宏:BX_MAX_TIMERS 定义为 64,timer数组所能注册的最大计时器为64。这个数组注册了所有的外设,并且存储了当时间片到达时对应的处理函数。struct bx_bool inUse; / 计时器是否正在使用 B

38、it64u period; / 两次时钟中断的间隔指令数 Bit64u timeToFire; / .下一次产生时钟中断的指令数 bx_bool active; / 0=非运行状态, 1=正在运行状态. bx_bool continuous; / 0=非持续型计时器, 1=持续性计时器 bx_timer_handler_t funct; / 产生时钟中断时的回调(中断处理)函数 void *this_ptr; / 回调函数所属的类实例#define BxMaxTimerIDLen 32 / 计时器最大命名长度 char idBxMaxTimerIDLen; / 计时器命名 一些重要变量:uns

39、igned numTimers (计时器的当前数量)unsigned triggeredTimer (当前将要处理时钟中断的计时器编号)Bit32u currCountdown (所有运行计时器中的最小中断间隔指令数)Bit64u ticksTotal (总共已执行的指令数 )double m_ips (每秒执行的百万条指令数)计时器的注册:register_timer (void *this_ptr, void (*funct) (void *),Bit32u useconds, bx_bool continuous, bx_bool active, const char *id)所有的硬件

40、在初始化时都会调用这个函数,把自己注册到timer数组之中。4.6 Bochs中断系统中断结构如图表10所示: 图表 9 中断结构 IRQ信号的获取如图表11所示: 图表 10 IRQ获取IRQ信号的传递 (PIC)如图表: 图表 11中断过程中断向量的接收 (local APIC): nt apic_bus_deliver_interrupt(Bit8u vector, Bit8u dest, Bit8u delivery_mode, Bit8u dest_mode, bx_bool level, bx_bool trig_mode)中断判断: void BX_CPU_C:cpu_loop(Bit32s max_instr_count)中断处理: unsigned BX_CPU_C:handleAsyncEvent(void) Bit8u bx_local_apic_c:acknowledge_int(void) 图表 12 中断流程图5 具体移植实现5.1 虚拟实验平台统一的器件模型

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号