存储方案研究与实现_第1页
存储方案研究与实现_第2页
存储方案研究与实现_第3页
存储方案研究与实现_第4页
存储方案研究与实现_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

渐提高,而D渐提高,而D系统、电子书籍、及其它消费型电子设备的既成行业标准。SD技术应用在约400上,涵盖数十种产品类别,超过8000种机型针对采用ARM系列主控制器和带有嵌入式实时操作系统lIC/os—II的类型产品,设计了一种基于三星公司的$3C2440A的SD存储解决方案,硬件方面利用$3C2440A带有的SPI控制功能接口与SD卡模块相连接,从而实现对标准SD卡接口的功能扩展在软件方面,将c/os—II移植到了$3C2440A之上,同时分析了laC/OS-II的内管理方法,并对其内存控制块数据结构进行了修改,利用双向链表方式组织内存区控制块,增加了内存分区的分割、释放以及合并的功能。然后根据D协议编写了D动程序,完成了容量为2G的SD卡的读写操作,并建立了一个小型的FATl6管理系统,负责管理存入卡内部的数据,可以实现建立文件,打开关闭功能,并可以根关键字:SD卡ofincreasinglyforstoragecardsarethefutureofinnovative,alwaysevolvingdi舀talworld.SDmemorycardsdeliverhigh-allowareliable,easy—to·usequicklycaptureSDtechnologyisthede-factoindustrystandardformobilephones,di.gltalplayers,personalcomputers,printers,carnavigationotherconsumerelectronicdevices.SDtechnologyisusedinsome400productsofincreasinglyforstoragecardsarethefutureofinnovative,alwaysevolvingdi舀talworld.SDmemorycardsdeliverhigh-allowareliable,easy—to·usequicklycaptureSDtechnologyisthede-factoindustrystandardformobilephones,di.gltalplayers,personalcomputers,printers,carnavigationotherconsumerelectronicdevices.SDtechnologyisusedinsome400productsacrossandinmoreofproductcardsare standardhigh-varietyofspeedclasses.Anext-generationSDsoontocreatecardsmembersdevicesfasterperformancesupportitsgreaterhavethe expandfarintothehostcontrollerandreal-ToARMattermsasolutionbasedhardware,connectthe$3C2440AinternalcontrolfunctionsSPlwithSDachievethestandardSDexpansioncardinterfacemodulesinorderOnthesoftwareside,completedthe#C/OS-IIontothecontrolblock the/zC/OS-memorymanagementmethods,andthemakeuseofdoublelinklisttoincreasestructurememorycarddriverseparatedthefunctionsofthereleaseaswellthetoread-ofdata,createfileaswellasopenorshutdownfunction.DocumentCandataWasdisplayedonthelast,the 学位论文作者签名学位论文作者签名匆’年月日选题背随着手机、数码相机、数码摄像机、电子辞典等众多数码产品的不断普及,与它们选题背随着手机、数码相机、数码摄像机、电子辞典等众多数码产品的不断普及,与它们息息相关的信息存储设备也受到了消费者越来越多地关注,而SD低、高可靠性、可擦写、非易失性等优点成为其中最为闪亮的主流存储媒介之一,同时,用SDDigitalMemoryCard)是由日本松下、东芝和美国的SanDisk公988SD2m3mX21mSnikMCutlvCl0603uAD9本(SD、miniSD、microSD)、大容量版本(SDHC、miniSDHC、microSDHC)、和SDIO卡。minimicroSDminiSDiSD斛j斛j薰兰200710SDHC(SDHighCapacity术出现了,它的容量范围从GB至G8,开发人员能选择指定有保证最低数据速率的三种数据写入速度,sD协会针对标准卡与太容量卡以及两种主机产品的最低数据传输,制定了新的规格分缴。有了新的速度等级规格,主机产品就能检查卡中的零碎状态,井计算卡中每个部分的写入速度。因此,主机可根据速度需求,确定要在哪里写入数据。三种SHC速度等级(等级2、等级4、等级6)每秒分别可传输至少2MB、MB、MB的432G类产品在2008年上半年开始问市“1另外,sD标准有很大的弹性.在具体应用中,sDOODiii万言㈡占圈。。i万言㈡占圈。。sD卡及后续的DC目前已经成了数码产品中实质上的通用标准。现在,其推广者希望扩展D卡的使用范围。D卡协会)于8年9月1日在美国加里福尼亚圣拉蒙宣布了嵌入式D标准,在同年1月正式进入嵌入式存储市场。应用该标准,手机、数码产品甚至各种输入输出外设在需要内置存储空间时,都可以直接使用标准的DC接口规范,嵌入最高B闪存。再通过传统的外置D卡接口,还可继续增加8的C卡移动存储。嵌入式D手持设备和消费电子设备市场需求,为大容量的嵌入式数据存储和快速处理提供了新的J。D⋯。DD起到一定的软件复用的作用本设计方案的硬件平台基于ARMs3c2440a微处理器,软件方面采用实时嵌入式操作统uC/OS-II,针对该系列的SD卡应用设计并编写了SD驱动程序,完成了数据读写机对lIC/OS-II的内存管理机$,J2n完成了基于arm主控制器和嵌入式实时操作系统c/os—II上的SD功能实现本设计方案的硬件平台基于ARMs3c2440a微处理器,软件方面采用实时嵌入式操作统uC/OS-II,针对该系列的SD卡应用设计并编写了SD驱动程序,完成了数据读写机对lIC/OS-II的内存管理机$,J2n完成了基于arm主控制器和嵌入式实时操作系统c/os—II上的SD功能实现O/OS-II操作系统的移2时操作系统。它的前身是uC/oS,最早出自于1992年美国嵌入式系统专家Labrosse在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把uc/os源码发布在该杂志的BBS上c/os—II的CPU硬件相关部分是用汇编语言编写的,总量约200行的汇编语言分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。用户只要的ANSI的C交叉编译器,汇编器、连接器等软件工具,就可以将|lc/os—II嵌入产品中。IlC/os—II具有执行效率高、占用空间小、实时性能优良和扩展性强等特点最小内核可编译至2KB。lic/os—II已经移植到了众多知名的CPU上u●核心部分是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里●任务处理部分起、恢复等等。因为 4要●时钟部分完成的要●时钟部分完成的●与CPU的接口是指C/os—II针对所使用的CPU的移植部分。由于IJc/osii是一个通用性的作系统,所以对于关键问题上的实现,还是需要根据具体PU的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写口1。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中的具体方法口1由于嵌入式领域可选用的处理器种类繁多,且分为了多种体系结构,各自有不同的微处理器或微控制器上运行起来。这个过程就是移植。由于CuC/SIC只有与处理器相关的代码需要使用汇编语言来重新实现。uc/osii正常运点要求:处理器的C编译器能产生可重入代码:用CP堆栈或内存中的指令口1。图2—1说明了uC/0S-II的结构以及它和硬件的关系5os一⋯一一一一⋯一丽软件一一一os一⋯一一一一⋯一丽软件一一一一一一一一一[二二二二[二][图2—c/os-II硬件和软件体系结由上图可知,移植的工作之需要修改三个文件,这三个文件都是与处理器的紧密相关的,它们的作用是把编写四个汇编语言函数(OS—CPU—A.ASM)2.2.1、重定义与编译器相关的数据类c/os-ii的移植包括一系列的数据类型的2.2.2、编写相应编译器的开关中断函与所有的实时内核一样c/os—II需要在访问临界区之前先禁止中断,并且在uc/os—II能够保护临界区免受其它任务或中断服务程序C编译器必须要有一定的机制来直接从C中执行这些操作。有些编译器能够允许在C源6CodeWarriorfor2.2.3、定定义任务堆栈的数据类型是通过为S-K任务堆栈都必须用0SjTKMCodeWarriorfor2.2.3、定定义任务堆栈的数据类型是通过为S-K任务堆栈都必须用0SjTKM typedefGROWTH中指定堆栈的生长方式就可以了置OS—STKGROWTH为0表示堆栈从下往上增置OS—STK—GROWTH为l表示堆栈从上往下增长口2.2.5修改文件0-PC.C中移植时的主要函数是OTstknt(),即系统任务的初始化操作,其他函数均为操作系统扩展的钩子函数,是为用户提供扩展功能的函数,这些函在任务创建函数)和初始化函数OSTaskStknt()来实现任务堆栈结构的初始化操作,因此,堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。函数中rO--lr是MOS_CPU—该文件除了实现OSCPUSaveSR0和OSCPURestoreSR(cpu—sr)两个函数外,还包括了启动最高优先级任务的函数voidOSStartHighRdy(),中断中的任务切换函数OSIntCtxSw0和任务切换函数voiOSCtxSw0当 7|lCOS-IISeUCOSIRQHandler函数中实现。l|lCOS-IISeUCOSIRQHandler函数中实现。lCSI202.3对内存管理方法的修改2.3.1“C/OS-II在uC/OS-II中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整个大小相同的内存块,分区的大小可以不同,但最大分区数量需要事先规定好,为了于内存的管理,在 controlblock)1内哆Q=嫩一卿曼蜮夏曼曼关妻赛毒Q曼M皂嬲摁民!鼍蜘取Q图2-2.uC/OS-ll当任务向已建立的内存分区申请一个内存块时,系统把空闲内存块的第一块分配给任务,同时把t链表中删除1:当任务不再使用该内存块时,要及时将它释放并放回到相应的内存分区中。此时,把此内存块插入空闲内存块的前面,这时内存控制块的met域指H1一些问题:8 由于内存控制块数据结构及其链表结构和指针OSMemFreeList也内存区建立之前需要由用户定义全局 由于内存控制块数据结构及其链表结构和指针OSMemFreeList也内存区建立之前需要由用户定义全局数组以给出数组首地址、及两个下标最大值表内存管理混乱,这为用户应用带来了不便。c/os—II属于静态内存分配,要求用户事先制订好内存分区计划,创建属于自制。提供给用户程序的函数原型,而将内存区控制块的数据结构具体内容定义,自由内控制块指针FreLst定义,内存区控制块链表数组的定义都放到具体接口实现文件中,stt变量。安全性能得到提高structINT32U一一一一一一一一一一mem.C一一一一一一一#define //记录分区尺void水pIleaLstpFePrit9e2-3小分区限定,或者已经没有空闲内存区控制块可用时,就不进行分割,而是根据选定分Mem*pFreeParLiinte2-3小分区限定,或者已经没有空闲内存区控制块可用时,就不进行分割,而是根据选定分Mem*pFreeParLiintMemCreate(const 按最小适配法找到合适分区没有则返回{(//不分{修改自由内存区控制块链表//分)成一片,如果确实如此,则合并内存区;否则,仅仅是将新释放的内存区链接到自由内存区供下次分配比较使用。{if(无地址相等内存区 if(无地址相等内存区 执行前向合并内存区头回收到空闲头链表中if(无二次合并返回3SD卡可以采用SD总线访问,也可以采用SPI器都有SPI接口而没有SD总线接口,所以使用微控制器的SPI接口访问SD卡是很方便的,而且如果采用I/O口模拟DSD强%‰SClnpSelect(Ne窑Data34567IS089图3-SD卡的物理结构及引脚功【9【9CD寄存器是一个8位宽的寄存器,它包含在卡的厂商和版本等信息,驱动程序CID,这是由生产商在生产时就已定义好了x4SDSDCardOperatilnactildleStacardidentificationldentildentifiTransferdatatFansferSending一St赶Di图3—2SD及其状态的操作SPI总线连接的两端设备有主从之分,主控芯片称为主设备,而SD对SD卡的操作控制都是SD卡的主控芯片通过对SPI信基于命令和数据的比特流。其中,命令和数据的第一位是起始位,最后一位是停止位。SPI总线连接的两端设备有主从之分,主控芯片称为主设备,而SD对SD卡的操作控制都是SD卡的主控芯片通过对SPI信基于命令和数据的比特流。其中,命令和数据的第一位是起始位,最后一位是停止位。 in)、数据输出out)n01面,因此,还需要额外的三根通用I/O引脚来满足该需要,卡检测电路中,检测信号由卡座的引脚以电平方式输出,当卡插入到卡座并插入到位时,ET由于卡座内部触点连接到ND,它输出低电平,当卡排出时,该引脚由于上拉电阻2图3— DD化状态和正常数据传输状态所需的频率是不同的,而且不同的SD卡的正常工作的最频率也不相制器,数据读写缓冲器,中断控制器和AMBA[6]总线接口模块来实现上述的功能n¨33sⅡ卡的时钟3.3bus)上A33sⅡ卡的时钟3.3bus)上A⋯D5z因此sD卡时钟需要对APB时钟进行分频。sD卡初始化模式下时钟频率不能超过400HZ,在正常工作模式下时钟频率不能超过MZ这SD时钟,时钟的开关也由驱动软件设置““17MulliMtdiaCard图3-3.3sDPDDsn存储i案的研究与喜Bit【4540辟9Isn存储i案的研究与喜Bit【4540辟9I6卜h0图3—3等3在卡识别模式之前,需要进行一系列的硬件链路设置,设置好后主机上电并等待74个时钟周期,发送O命令重启D卡,它是一种软件启动方式,并且同时s线拉低,该命令发送成功后,卡将进入到IdeStte待下一个命令的起始位,此时需要向卡发送命令CMI以激活卡的初始化进程,最后D0R卡进入电源及CS线引脚设上时钟和数据线连接上卡状态检电源及CS线引脚设上时钟和数据线连接上卡状态检测和时钟审74个时钟延工上◆NpY上修改时钟频上设置数据块J图3-6SD//置POWER为低电/,IcCS弓l//置POWER为低电/,IcCS弓lSDLMOIIOP这几个引脚多功能引脚,因此初始化必须进行如下的功能选择设置/牢SCK弓l脚SPI—SPI—rGPECON&=’(Ox03<<26)//设置SCK口为GPIO0//设置SCK.}每引脚水rGPECON&=’(Ox03<<22)//设置MISO口为GPIO//设置MISO=’(Ox03<<24)//设置MOSI口为GPIOSPI_MOSI_oUTSDSD_INSERT_GPIO()rGPFCON&=’(Ox03<<2)//设置INSERT口为口=’(Ox03<<24)//设置MOSI口为GPIOSPI_MOSI_oUTSDSD_INSERT_GPIO()rGPFCON&=’(Ox03<<2)//设置INSERT口为口SD0P主机发送的命令O后,还需要向其发送l进入卡的激活阶段,接着主机会继续向8RDD卡的正常工作电压为3.3V。电压获取成功后,SD卡则由ide状态进入Ready状态。否则将转入inactive状态。继而重新发送OZ●设置数据块长置为512字节●获取卡SDCSDCSD128要信息设置结构记录下来SD——{card—//卡中块的数//卡的块长度(单位置为512字节●获取卡SDCSDCSD128要信息设置结构记录下来SD——{card—//卡中块的数//卡的块长度(单位:字节//读块超时时block—t//写块超时时//擦块超时时3.3.3.2读卡操tlln蠹,⋯。/一Dat鑫·n-··[:;;圄一:,一?乙·∥·-⋯‘to—host二适当—d/ {jji自。ata。ut⋯.,,.:.:。。雩7.;:..允许,即CSD寄存器参量的read—bl—fen为1时,块长度可以在1和最大块尺寸之间个唯一的物理卡片扇区内SD纛蠹omr.ara协ho C翻饼n蛳d个唯一的物理卡片扇区内SD纛蠹omr.ara协ho C翻饼n蛳d蠢ca蚊rddamData¨Dataout····一-·-··●读卡操作的执行过程如下if(SD{SDSD—ERR—NO—)i}SD_SendCmd(INT8Ucmd,INT8U*param,INT8U(INT32SPI—CS—SPI—SendByte((cmd&Ox3F)I//根据不同的命令,得到不同的响应长{casecasecasedefaulSPI—CS—DeassertSD_ERR_CMI)_RESPTYPE://返回命令响应类型错//循环的最后发送//根据不同的命令,得到不同的响应长{casecasecasedefaulSPI—CS—DeassertSD_ERR_CMI)_RESPTYPE://返回命令响应类型错//循环的最后发送SPI—CS—SD-N0一CSSPI个取出,送入相应缓冲区SD—{//拉低CS线准备接收数SPI—CS—{tmp=SPI—recbuf[i]=SPI—RecByte()://接收数)3.3.3.3写卡操)3.3.3.3写卡操SDDr_ptl每个数据块有一个一字节大小的前缀开始块,在数据块被接收之后,SD响应标志响应,如果数据块被接收并且没有任何错误,它将被编程,只要D目的,一旦编程操作完成,主机必须使用ts命令,亦即M3来检查编程的一的合法性检查执行在数据块上并且通过数据响应标志传达给主机的是C写入错误提示,在多个数据块的写操作时,在下个数据块的开始时中止通信将被看作“停止"标志代替“开始’’标志[11]o在写入错误信号的情况下,主机将使用dumrlks式写卡操作的具体过程如下{SD—SD_ERR—NO—)if(blockaddr>sds.block—{SD—){SD—SD_ERR—NO—)if(blockaddr>sds.block—{SD—)i}作SD._WriteBlockData(INT8Ubmulti,INT32U<SPI—CS—//发送数i{SPI—SPI—CS—//数据响应错)SPI—CS—Deasserti作SD._WriteBlockData(INT8Ubmulti,INT32U<SPI—CS—//发送数i{SPI—SPI—CS—//数据响应错)SPI—CS—Deassertif(SD_WaitBusy(SD_1似IT_WRITE)!-SD—NO—//写入超//写入正SD—NO—}SEND_STATUS,卡接受此命令后将返回R2状态。它是一个16位数据。若全0则表示写入成{SD—))至此数据写操作完成在SD卡中存入的数据信息要按一定的规则存储并管理,以便于之后从众多数据中分必要,FT文件系统是从DS发展过来的一种文件系统,其优点是简单易用,并被多种操作系统支持,FT文件系统名称后的数字是标识文件系统中一个FT分配单元所需的位数。而T6剩引余导其他目录)至此数据写操作完成在SD卡中存入的数据信息要按一定的规则存储并管理,以便于之后从众多数据中分必要,FT文件系统是从DS发展过来的一种文件系统,其优点是简单易用,并被多种操作系统支持,FT文件系统名称后的数字是标识文件系统中一个FT分配单元所需的位数。而T6剩引余导其他目录 根目扇区FAT文件系统结节移38OEM扩展引导扇区代扇区结束标识4表3-2引导扇区代码区域,接下来代码区域,接下来是厂商标志,它是一个占八比特空间的字符串,该字符串表示所在标准的参数都在已知的位置上,磁盘容量和其它特征常量都被封存在B导扇区的第一部分是一个跳转指令,因此,将来通过在PB行扩展。参数块中包含了分区总大小、磁盘参数等重要信息。而本文的文件系统部分的设计实际上是将SD卡抽象成为一个逻辑磁盘空间,在程序上把SDtypedefstruct——Di{PathClus根目录、容,由名称可理解其具体含意,这里不再赘述。其中每个单位长度相当于一簇空间的大载文件系统的函数AddFileDriver()的流程如下图3-11加载文件系图3-11加载文件系统驱动流FAT表因为当分区容量较大时,采用大小为512B的扇区管理会增加FAT表的项数,对大文分区空间大每簇扇区0MB一1265MB一4129MB一8256MB一51512MB一分区空间大每簇扇区0MB一1265MB一4129MB一8256MB一51512MB一1024MB一表3—3分区大小与簇的关FTl6的引导扇区参数的偏移Ol处记录了根目录所占的扇区的数目。偏移记录了T了。62据的处理。这之前仍以扇区为单位。对于根目录之后的第一个簇,系统并不编号为第簇或第1簇,这可能是留作关键原因。而是编号为第22簇。FAT文件系统之所以有12、16、32不同的版本之分,其根本在于FAT簇链接的二进制位数,以FATl6为例,每一簇在FAT表中占据2字节空间,所以最大可以表示的簇号为F,即十进制中的5,以K为簇的大小的话,它可以管理的最大磁盘空间为B木B。这就是为什么6不支持超过GB分区的原因n51的其他文件及文件夹的簇链情况。根据簇的表现情况FAT用相应的取值来描述。见下表FATl6记录项的取FFFO,--一系统保坏么FAT2也同样更新‘161要一个文件结么FAT2也同样更新‘161要一个文件结构来记录要打开的文件信息{}SD—其中,s代表对文件执行的是读操作(IEWI_LG),当Flgs为0时表明此表项空闲:Drive用来表示文件所在的磁盘;Ne用于存储被打开文件的文件名称。Dlse、Drve和irls三个参数共同决定,不同的文件这三个参数必须有一个或者一个以上不同;FileSize和FstClus记录文件本身的信息;Offset读写位打开文件的大致过程见下面的流程图开根据文件名查找开始簇查找根目是否在该目开根据文件名查找开始簇查找根目是否在该目录下Y查找下一簇信N是否找到Y打开对应扇区读取结3.4.3内的任一文件和文件夹,均需从根目录寻址来找到,所以说,根目录是目录存储结构的入口具体位置。T文件系统根据分区的引导扇区参数与扇区中存放的计算好的T表的大小来确定,磁盘被格式化后,根目录的大小和位置就已经被确定下来:它紧随第二个文32nFAT文件系统中把目录当作一个特殊的文件来处理,在FAl6并不等同于普通的文件或者说是目录,但其组织形式和普通的目录并没有不同n1。字节偏移(16进制字节定8文件3扩展1属性字系统保字节偏移(16进制字节定8文件3扩展1属性字系统保2224针对该目录表的定义建立如下的结构typedefstruct—{//文件//起始簇号高两个字节(fat16//最后写//最后写//起始簇(cluster//文件大区备份该区备份该分区的引导扇区内容入等待或者挂起状态,否则低优先级任务永远也不可能得到执行n引。因此在设计任务时系统首先提供了两个主要的函数:就绪态OSEvEit0表中删除,并放到相应事件的时间控制块的等待任务表中n91ucoI间的通信方式有很多种,常用的有信号量、邮箱和消息队列等,本系统程序设计中使用Ic/os—II的重要通信手断,邮箱可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量,该指针指向一个包含了特定“消息"的数据结构。为了在IJc/os—IIOSCFGHS_MBX-N。Mxte0事的要使用邮箱前,首先必须调用OSMbxCeae0函数创建邮箱,另外,对邮箱的操作还需要有OSMboxPend0和OSMoxotSMbxPnd0用于等待邮箱,如果此时该邮箱是可用的,那么函数将会返回一个E给调用它的函数;如果此时的邮箱不可用,那么函数OSMboxPend0OSEventTaskWait0将这个任务放进这个邮箱的等待队列中,最后调用0函切换。函数OSMboxPost0此刻有任务在等待该邮箱内容,就调用OEenTakRy()函数把任务等待队列中优先级最高的任务从该队列中删除,并使它进入就绪状态;然后再调用OSSched0函数取出系tOSEventTaskWait0将这个任务放进这个邮箱的等待队列中,最后调用0函切换。函数OSMboxPost0此刻有任务在等待该邮箱内容,就调用OEenTakRy()函数把任务等待队列中优先级最高的任务从该队列中删除,并使它进入就绪状态;然后再调用OSSched0函数取出系t04.2该部分内容通过向卡中写入固定数据再读取对比的方式来验证程序主 STACKSIZEOS— {//操作系统的初始OSTaskCreate(TaskO,(void,I=)0,&TaskStartStk[STACKSIZE一OSTaskCreate(OSFileTask,(void木)0,&TaskStk[STACKSIZE一//启动系)/木消息队列指针木/木建立命令队列木FileCommad=OSQCreate(OSFi{Command=(OSFileParameter木愈令肆lif(err==OS—NO— switch(Command一{FileOpen(Command一0S—Fi=caseif(err==OS—NO— switch(Command一{FileOpen(Command一0S—Fi=case0S—FiCommand一>P2.Puin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论