2410init.s的分析.doc_第1页
2410init.s的分析.doc_第2页
2410init.s的分析.doc_第3页
2410init.s的分析.doc_第4页
2410init.s的分析.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

;=; NAME: 2410INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks; Initialize C-variables; HISTORY:; 2002.02.25:kwtark: ver 0.0; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode; 2002.04.10:SJS:sub interrupt disable 0x3ff - 0x7ff ; 2002.11.29:Kong:DCD BANKSIZE Resiger 0x32 - 0xb2 (ARM core burst enable);=;/*此头文件的功能*/ ;1. 屏蔽所有中断,关看门狗。;2. 根据工作频率设置PLL寄存器;3. 初始化存储控制相关寄存器;4. 初始化各模式下的栈指针;5. 设置缺省中断处理函数;6. 将数据段拷贝到RAM中,将零初始化数据段清零;7. 跳转到C语言Main入口函数中;由于注者水平有限,注解中难免有不正确或不恰当的地方,欢迎指正。mail:walw_;*/本汇编语言程序包含option.inc, memcfg.inc, 2410addr.inc, 通常启动代码是在2410init.s汇编文件;特殊功能寄存器定义在2410addr.s;Memory Bank 配置在mencfg.s;还有系统的选项等在option.s文件GET option.inc; GET memcfg.inc; 此处GET相当于C语言中的includeGET 2410addr.inc ; BIT_SELFREFRESH EQU (122);ram的自刷新设置位, 相当于c里面 #define BIT_SELFREFRESH(122), 就是第22位置1/*CPSR中决定当前CPU工作模式的末5位代码ARM 有7 种模式,用户模式,快速中断模式,中断模式,管理模式,中止模式,未定义模式和系统模式。系统堆栈的初始化主要是给各个处理器模式分配堆栈空间。堆栈是为中断或程序跳转服务的,当发生中断或程序跳转时,需要将当前处理器的状态及一些参数保持在堆栈中,当中断处理完毕以后或程序执行完后返回时,再将堆栈保存的现场数据进行恢复,以保证原来的程序正确运行*/USERMODE EQU 0x10;/用户模式FIQMODE EQU 0x11;/快速中断模式IRQMODE EQU 0x12 ;/外部中断模式SVCMODE EQU 0x13 ;/管理模式ABORTMODE EQU 0x17;/中止模式UNDEFMODE EQU 0x1b;/未定义的模式MODEMASK EQU 0x1f;/中断屏蔽?NOINT EQU 0xc0 ;/没有中断?;The location of stacksCPU在不同工作模式下对应的堆栈区。;_STACK_BASEADDRESS是栈区基地址;_STACK_BASEADDRESS已经在Option.s/Option.inc中定义,在这里的值为0x33ff8000UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ;/*;arm处理器有两种工作状态 ;1.arm:32位 这种工作状态下执行字对准的arm指令 ;2.Thumb:16位 这种工作状;态执行半字对准的Thumb指令 ;因为处理器分为16位、32位两种工作状态 程序的编译器也是分16位、32两种编译方式 ;所以下面的程序用于根据处理器工作状态确定编译器编译方式 tasm.exe是什么程序,有什么作用? 就是THUMB汇编编译文件;code16伪指令指示汇编编译器后面的指令为16位的thumb指令 ;code32伪指令指示汇编编译器后面的指令为32位的arm指令 ;这段是为了统一目前的处理器工作状态和软件编译方式(都是16位或者都是32位)(16位编译环境使用tasm.exe编译);*/GBLL THUMBCODE ;定义一个全局逻辑变量THUMBCODE CONFIG = 16 ; CONFIG为汇编器的内置变量,if CONFIG=16 这里表示目前处于16位编译方式的用法怎样? 表示if,|表示else,表示endifTHUMBCODE SETL TRUE;SETL给全局逻辑变量赋值;设置THUMBCODE 为 true表示告诉系统当前想用thumb,但实际启动时不行,只能以32为编译模式启动后再跳 CODE32 ;启动时强制使用32位编译模式 | ;否则 THUMBCODE SETL FALSE;如果系统要求是ARM指令,则直接设置THUMBCODE 为 false 说明当前的是32位编译模式 MACRO;宏定义,普通跳转,用于子程序的返回 MOV_PC_LR ;名字为MOV_PC_LR THUMBCODE;如果在THUMB模式下 bx lr ;直接跳转到lr指示的返回地址,用BX指令跳转到THUMB指令,并转换模式 |;否则 mov pc,lr;把函数返回地址LR赋值给PC实现返回 ; MEND MACRO ;宏定义,如果上面的指令把标志位改变了,符合EQ的条件,则跳转 MOVEQ_PC_LR ;带条件的函数返回 THUMBCODE;如果在thumb模式 bxeq lr;若状态为nZCv,即运算结果为非负(n),为零(Z),有进位(C),无溢出(v),则跳转回ARM状态 eq根据Z判断,相等即Z=1(为0)则跳转 bx和mov这两条语句都是进行跳转,但bx跳转之后从THUMBCODE状态转换到ARM状态,有模式转换,但mov语句只是实现跳转,没有模式转换。 |;否则 moveq pc,lr;把lr赋值给pc实现跳转 MEND;宏定义结束;/*MACRO $HandlerLabe1*;注意下面这段程序是个宏定义,很多人对这段程序不理解,我再次强调这是一个宏定义,所以大家要注意了;后面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开 ;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为加载程序。 ;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。;每个字空间都有一个标号,以Handle*命名。 ;在向量中断模式下使用加载程序来执行中断服务程序。 ;-;这里就必须讲一下向量中断模式和非向量中断模式的概念 ;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址函数中,节省了中断处理时间提高了中断处理速度。即向量中断就是不同的中断有不同的入口地址。例如 ADC中断的向量地址为0xC0,则在0xC0处放如下代码:;ldr PC,=HandlerADC ;当ADC中断产生的时候系统会自动跳转到HandlerADC函数中 ;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pending寄存器中对应标志位置位 然后跳转到位于0x18处的统一中断函数中,该函数通过读取interrupt pending寄存器中对应标志位来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中。即非向量中断就只有一个入口地址,进去了在判断中断标志来识别具体是哪个中断。-伪指令解释-;宏定义的方式:; MACRO$标号宏名$参数1,$参数2.; code;汇编代码; MEXIT(跳出宏); code;汇编代码; MEND(宏定义结束);-了解一下ARM的堆栈;arm堆栈的组织结构是满递减 (fd)的形式,满栈即sp是要停留在最后一个进栈元素,减:就是堆栈的增长方向是从高地址向低地址发展。arm对于堆栈的操作一般采用 LDMFD(pop)和STMFD (push) 两个命令。;*/MACRO$HandlerLabel HANDLER $HandleLabel ; HandlerLabel为中断服务入口地址 ; HANDLER为宏名 ; $HandlerLabel 展开后要被下面这段程序替换掉,是个跳转的标号;$HandleLabel,它是个函数的入口地址。$HandlerLabel sub sp,sp,#4 ;减少sp,预留一个字,用于存放跳转地址 stmfd sp!,r0;将要使用的r0寄存器入栈 ldr r0,=$HandleLabel ;把向量表中的HandleLabel标号的地址装入r0 ldr r0,r0;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0 str r0,sp,#4;把中断服务程序(ISR)压入栈,保存在高一个地址预留的空间中,但SP没变。 ldmfd sp!,r0,pc ;用出栈的方式恢复r0的原值和为pc设定新值(也就完成了到ISR的转跳),将中断函数首地址出栈,放入pc中,系统将跳转到对应的中断处理函数。 MEND/*;一个arm由RO,RW,ZI三个断组成 其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化的全局变量。;bootloader要将RW段复制到ram中并将ZI段清零,编译器使用下列段来记录各段的起始和结束地址; |Image$RO$Base| RO段起始地址 ; |Image$RO$Limit| RO段结束地址加1 ; |Image$RW$Base| RW段起始地址 ; |Image$RW$Limit| RW段结束地址加1 ; |Image$ZI$Base| ZI段起始地址 ; |Image$ZI$Limit| ZI段结束地址加1 ;这些标号的值是通过编译器的设定来确定的 如编译软件中对ro-base和rw-base的设定;ro-base=0xc000000 rw-base=0xc5f0000;-;异常中断矢量表(每个表项占4个字节) 0X0是复位中断地址;下面是中断向量表,一旦系统运行时有中断发生,即使移植了操作系统如linux ,处理器已经把控制权交给了操作系统,一旦发生中断,处理器还是会跳转到从0x0开始的中断向量表中某个中断表项(依据中断类型)开始执行。;例如 adc中断向量为 0x000000c0下面对应表中第49项位置向量地址为0x0+4*(49-1)=0x000000c0 ; ;板子上电和复位后 程序开始从位于0x0处(这里也是reset中断向量的入口)开始执行;硬件刚刚上电复位后程序从这里开始执行跳转到标号为ResetHandler处执行;程序先把ROM里|Image$RO$Limt|(在编译器里定义的地址)开始的RW初始数据拷贝到RAM里面|Image$RW$Base|开始的地址,当RAM 这边的目标地址到达|Image$ZI$Base|后就表示RW区的结束和ZI 区的开始,接下去就对这片ZI 区进行清零操作,直到遇到结束地址|Image$ZI$Limit|-;用IMPORT伪指令(和c语言的extren一样)引入|Image$RO$Base| , |Image$RO$Limit|.;这些变量是通过ADS工程设置里面的RO Base和RW Base设定的,最终由编译脚本和连接程序导入程序,引入这些变量最简单的用处是可以根据它们拷贝自已 ,把RW和ZI变量从加载域中复制到运行域中*/ IMPORT |Image$RO$Limit| ; End of ROM code (=start of ROM data)注意,这里的rom只是一种定义,有可能是真正硬件上的rom也有可能只是单纯的readonly区域 IMPORT |Image$RW$Base| ; Base of RAM to initialize, 在运行域中要初始化的RAM的开始地址 IMPORT |Image$ZI$Base| ; Base and limit of area, 需要清零的RAM区域的开始地址 IMPORT |Image$ZI$Limit| ; to zero initialize, 需要清零的RAM区域的结束地址 IMPORT Main ; The main entry of mon program AREA Init,CODE,READONLY ;这表明下面的是一个名为Init的只读代码段 ENTRY /*;1)The code, which converts to Big-endian, should be in little endian code./将小端代码改写成大端代码;2)The following little endian code will be compiled in Big-Endian mode. 断言格式:ASSERT判断逻辑/随后的小端代码会在大端模式下被编译; The code byte order should be changed as the memory bus width. /代码字节序会因为总线宽度而有所不同;3)The pseudo instruction ,DCD cant be used here because the linker generates error./伪指令DCD不能在这里使用,因为链接会产生错误*/ASSERT :DEF:ENDIAN_CHANGE ;下面是大小端的一个判断,ENDIAN_CHANGE已经在Option.s中定义为FALSE ENDIAN_CHANGE ;在这个部分中使用了断言ASSERT, ASSERT :DEF:ENTRY_BUS_WIDTH;在这个部分使用了判断逻辑伪指令,判断逻辑伪指令格式:DEF:X”,用于判断变量X是否被定义 ENTRY_BUS_WIDTH已被定义 ENTRY_BUS_WIDTH=32 ;如果总线宽度为32伪操作DCD: 格式:标号 DCD (或 DCDU ) 表达式 用于分配一段字内存单元并用伪操作中指定的表达式初始化 b ChangeBigEndian ;DCD 0xea000007 ENTRY_BUS_WIDTH=16;如果总线宽度为16 andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00 ENTRY_BUS_WIDTH=8;如果总线宽度为8 streq r0,r0,-r10,ror #1 ;DCD 0x070000ea | ;如果以上情况都没有发生 b ResetHandler ;则跳转到复位入口地址,因为ENDIAN_CHANGE已经被设成FALSE,所以系统开机或者复位后就来到这了,转跳到复位程序入口 /*异常:1.复位(reset)2.快速中断请求(FIQ)3.外部中断请求(IRQ)4.未定义指令(undefined)5.软件中断(SWI)6.数据访问中止(Data Abort)7.指令预取中止(Prefech Abort)ARM要求中断向量表必须放置在连续8X4字节的空间内,每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理 */ b HandlerUndef ;handler for Undefined mode转跳到未定义异常模式程序入口 b HandlerSWI ;handler for SWI interrupt 转跳到SWI 中断程序入口 b HandlerPabort ;handler for PAbort跳转到指令异常退出模式程序入口 b HandlerDabort ;handler for DAbort跳转到数据异常退出模式程序入口 b . ;reserved保留 b HandlerIRQ ;handler for IRQ interrupt 跳转到IRQ中断程序入口b HandlerFIQ ;handler for FIQ interrupt跳转到FIQ中断程序入口b EnterPWDN;掉电模式 Must be 0x20/* 下面是改变大小端的程序,这里采用直接定义机器码的方式,我们程序里这段代码也不会去执行,不用去管它 MRC/MCR指令:从协处理器传送到ARM寄存器: MRC ,Rd,CRn,CRm, 从ARM寄存器传送到协处理器:MCR ,Rd,CRn,CRm, cond 两个字符的条件代码 p# 被请求得协处理器的惟一标识苻 计算一个常量并放到CP Opc域 Rd 是一个ARM有效寄存器序号 cn 和cm 是计算有效协处理器寄存器CRn CRm序号 计算一个常量,并放到CP域*/ChangeBigEndian ;ChangeBigEndian的首地址(标号);0x24;在0x24处 ENTRY_BUS_WIDTH=32 ;32位总线宽 DCD 0xee110f10 ;0xee110f10 = mrc p15,0,r0,c1,c0,0;DCD分配一段连续的字存储单元并初始化 DCD 0xe3800080 ;0xe3800080 = orr r0,r0,#0x80; /Big-endian;/在这里用于将各种指令的机器码直接存入内存 DCD 0xee010f10 ;0xee010f10 = mcr p15,0,r0,c1,c0,0 ENTRY_BUS_WIDTH=16 ;16位 DCD 0x0f10ee11 DCD 0x0080e380 DCD 0x0f10ee01 ENTRY_BUS_WIDTH=8 ;8位 DCD 0x100f11ee ;读取p15的c1寄存器中的内容到arm的r0 DCD 0x800080e3 ;修改内容,这个命令执行的效果是选择Big-endian,指令意义:r0=r0 or 0x0100 0000 DCD 0x100f01ee ;把命令写回协处理器,上面的指令把c1的第7位置为了1 DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode. DCD 0xffffffff ;(0xffffffff在大小端模式中都为空操作) DCD 0xffffffff DCD 0xffffffff DCD 0xffffffff b ResetHandler;/复位/*下面这段程序为进入掉电模式及从掉电模式中唤醒的相关设置和处理;进入掉电模式的函数功能:; 1. SDRAM should be in self-refresh mode./SDRAM处于自刷新模式; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh./为了SDRAM的自刷新,应该把所有中断屏蔽; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh./为了SDRAM的自刷新,关闭LCD控制器; 4. The I-cache may have to be turned on. /指令cache打开; 5. The location of the following code may have not to be changed./下面代码的存放位置不能变;void EnterPWDN(int CLKCON) ;表示下面这段程序相等于这个C函数C函数中,第一个形参存入r0,第二个存入r1,以此类推,CLKCON是函数的第一个参数,因此存在r0中,想把CLKCON传给r2,就是mov r2,r0TST条件操作数1, 操作数2 意思:将操作数1与操作数2进行按位与的运算,根据结果更新CPSR中条件标志位的值。它一般用来检测是否设置了特定的位。*/EnterPWDN mov r2,r0 ;r2=rCLKCON,rCLKCON 3:2位为电源模式标志位。 tst r0,#0x8 ;POWER_OFF mode? 按位与并判断, 若3为1,表示进入掉电模式 bne ENTER_POWER_OFF; 若3为1则跳转到ENTER_POWER_OFF基础知识不扎实,需要恶补一下tst 和bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳转,tst 和beq连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果为0,则跳转REFRESH寄存器是DRAM/SDRAM的刷新控制器REFRESH22为0:自动刷新,为1:自刷新ENTER_STOP ;进入停止模式相关处理;进入PWDN后如果不是sleep则进入stop ldr r0,=REFRESH ;r0指向sdram的刷新控制寄存器地址 ldr r3,r0 ;r3=rREFRESH ,r3获得当前sdram的控制信息 mov r1, r3 orr r1, r1, #BIT_SELFREFRESH ;在控制信息中加入自刷新命令,orr是按位或 str r1, r0 ;Enable SDRAM self-refresh mov r1,#16 ;wait until self-refresh is issued. may not be needed. 等待自刷新生效0 subs r1,r1,#1 ;用这个循环来等待 sdram进入自刷新状态 bne %B0 ;表示不相等则往回跳转到标号为0的位置,在此为上一句。 ldr r0,=CLKCON ;enter STOP mode. str r2,r0 ; mov r1,#32;0 subs r1,r1,#1 ;1) wait until the STOP mode is in effect. bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off ; Entering POWER_OFF mode, only the reset by wake-up is available. 进入掉电模式后,仅唤醒中断有效 ldr r0,=REFRESH ;exit from SDRAM self refresh mode. str r3,r0 ;r3中存的是原来的sdram的控制信息 MOV_PC_LR;开始处定义的返回跳转宏ENTER_POWER_OFF ;/* ;NOTE. ;1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode. 在rGSTATUS3寄存器中应该保存掉电模式唤醒的返回地址,rGSTATUS3,4可在掉电下保存信息*/ ldr r0,=REFRESH ; ldr r1,r0 ;r1=rREFRESH orr r1, r1, #BIT_SELFREFRESH; str r1, r0 ;Enable SDRAM self-refresh mov r1,#16 ;Wait until self-refresh is issued, which may not be needed.0 subs r1,r1,#1 bne %B0 ldr r1,=MISCCR ldr r0,r1 orr r0,r0,#(70, SCLK1:SCLK-0, SCLKE=L, during boot-up ;设置MISCCR19:17=111b,使得SDRAM的信号(SCLK0,SCLK1, SCLKE)在睡眠模式期间被保护 str r0,r1 ldr r0,=CLKCON str r2,r0 b . ;CPU will die here.点(.)代表当前指令,b.就是当前指令跳转到当前指令,就是死机 /*从掉电模式唤醒的过程1、某个唤醒源生效将产生一个内部复位信号。复位时间由一个内部16位计数器决定,此计数器的时钟是tRST=(65535/XTAL_frequency)。2、查询GSTATUS2位看从掉电模式唤醒是否产生了一个POWER-UP。3、通过将MISCCR19:17设置为000b,释放SDRAM信号保护。4、配置SDRAM控制器。5、等待SDRAM自我刷新完毕。大部分SDRAM需要refresh cycle of all SDRAM row。6、GSTATUS3、4的信息可以被用户使用,因为GSTATUS3、4的值已经在掉电模式下被保存了。7、对于EINT3:0,检查SRCPND寄存器;对于EINT15:4,检查EINTPND寄存器;对于RTC报警唤醒,检查RTC时间,因为在唤醒时SRCPND寄存器的RTC位不被置位;如果在掉电模式期间有nBATT-FLT assertion,SRCPND寄存器的相关位被置位。*/ WAKEUP_POWER_OFF ;Release SCLKn after wake-up from the POWER_OFF mode. ldr r1,=MISCCR;/MISCCR寄存器用来设置一些USB等相关的时钟周期等 ldr r0,r1 bic r0,r0,#(7SCLK, SCLK1:0-SCLK, SCKE:L-H str r0,r1;通过将MISCCR19:17设置为000b,释放SDRAM信号保护。 ;Set memory control registers配置内存控制寄存器ldr r0,=SMRDATA;在程序的后面 LTORG SMRDATA DATA中定义了一个数据缓冲池就是用来配置相关的内存控制寄存器的, 数据在以SMRDATA为起始的存储区 ldr r1,=BWSCON ; BWSCON为总线宽度和等待状态寄存器 add r2, r0, #52 ; SMRDATA的结束地址0 ldr r3, r0, #4 /* str r3, r1, #4 从r0(缓冲池的数据开始地址)开始,将数据复制到r1,直到r0到达 cmp r2, r0 r2(R0+52,缓冲池的数据结束地址)为止bne %B0/*mov r1,#2560 subs r1,r1,#1 ;1) wait until the SelfRefresh is released. bne %B0 ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after POWER_OFF wake-up ldr r0,r1mov pc,r0;从掉电模式下唤醒后,将保存在GSTATUS3里的返回地址传给PCLTORG/*伪指令解释* LTORG指令用于声明一个数据缓冲池的开始,当程序中使用ldr此类的指令时,数据缓冲区的使用可能越界。为防止越界发生,可使用ltorg为操作定义数据缓冲池。一般此指令放在无条件跳转指令之后,或者子程序返回指令之前,这样处理器就不会错误的将数据缓冲区当作指令来执行了,例如上面的:mov pc,r0*/;/ 下面是具体的中断处理函数跳转的宏;/ 通过上面的$HandlerLabel的宏定义展开后跳转到对应的中断处理函数(对于向量中断)建立Hander*和Handle*之间的联系 HandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabort/*;这一段程序就是用来进行第二次查表的过程了.;如果说第一次查表是由硬件来完成的,那这一次查表就是由软件来实现的了.;为什么要查两次表?;没有办法,ARM把所有的中断都归纳成一个IRQ中断异常和一个FIQ中断异常;第一次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断;*/IsrIRQ 中断偏移寄存器INTOFFSET sub sp,sp,#4 ;reserved for PC ,用于保存返回地址 stmfd sp!,r8-r9 ;工作寄存器入栈ldr r9,=INTOFFSET;INTOFFSET EQU 0x4a000014 ;此内存中存着中断请求的偏移;把INTOFFSET的地址装入r9 ldr r9,r9;把偏移存入r9 即把INTOFFSET的值装入r9 ldr r8,=HandleEINT0;把中断EINT0的相对偏移存入r8, 二级跳转表的首地址add r8,r8,r9,lsl #2 ;计算出中断服务的入口地址;R8=R8+R9*4得到相应的中断入口地址 ldr r8,r8;装入

温馨提示

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

最新文档

评论

0/150

提交评论