一起学mini2440裸机开发(二)--MDK自带的S3C2440s分析_第1页
一起学mini2440裸机开发(二)--MDK自带的S3C2440s分析_第2页
一起学mini2440裸机开发(二)--MDK自带的S3C2440s分析_第3页
一起学mini2440裸机开发(二)--MDK自带的S3C2440s分析_第4页
一起学mini2440裸机开发(二)--MDK自带的S3C2440s分析_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、一起学mini2440裸机开发(二)-MDK自带的S3C2440.s分析上一节,咱们在建立工程的时候,默认的是使用MDK自带的启动代码,这些启动代码到底做了什么工作呢?在这里我想探究一下,探究不全没什么事,能看懂个大概就行了。   我先申明一下,其实我并不是头一次学ARM裸机,我先前已经按照韦东山的使用arm-linux-gcc在linux下编译裸机程序的方法走了一遍了,用那个方法的话对以后的uboot移植非常有帮助,但是有一个不方便的就是,使用Linux系统下编译裸机程序,很多自带的库函数不能用,比如print()函数我都不能用,主要是我的水平不行,不会用,其实可以用的。

2、所以现在想认真的再用编译器学一下ARM裸机,裸机学好了,对驱动开发很有帮助的。  所以,很可能我讲的可能细节上照顾不到没接触过ARM裸机的,在此深感抱歉。我也只是想把自己的学习弄成笔记而已。  言归正传,下面进行S3C2440.s的分析,初学者这一节可以略过。1、首先,了解一下这个文件都要完成那些功能。     看门狗初始化(可以选择是否初始化)     时钟初始化(可以选择是否初始化)     存储控制器初始化(可以选择是否初始化)  

3、;   GPIO口初始化(可以选择是否初始化)     堆栈初始化(没有选择性,必须初始化)     跳转到C文件的main函数执行2、其实知道上面文件做了哪些工作就行了,下面具体分析一下    /*/;/* S3C2440.S: Startup file for Samsung S3C2440             

4、0;                  */;/*/;/*;*启动代码S3C2440.S是在CPU复位后执行的。这个文件会根据以下的;*SET标志来进行翻译执行。;*NO_CLOCK_SETUP:启动代码不初始化时钟(这种情况大多出现在时钟已经在script.ini文件中初始化时);*NO_MC_SETUP:启动代码不初始化寄存器控制器。;*NO_GP_SETUP:启动代码不初始化GPIO口;* RAM_INTVEC:启动代码

5、将异常向量表从执行地址处复制到RAM中去 CPSR中的低8位。I:IRQ中断禁止位,置位禁止。F:FIQ中断禁止位,置位禁止。 T:CPU状态位(ARM或者THUMB)。M4-M0:工作模式选择位76543210IFTM4M3M2M1M0 程序状态寄存器的格式M4:0工作模式10000用户模式10001快中断模式10010中断模式10011管理模式10111数据访问中止模式11011未定义指令中止模式11111系统模式;状态寄存器CPSR中的标准的模式位和中断位的宏定义Mode_USR        EQ

6、U     0x10   用户模式Mode_FIQ        EQU     0x11     快中断模式Mode_IRQ        EQU     0x12    中断模式Mode_SVC  

7、;      EQU     0x13   管理模式Mode_ABT        EQU     0x17   数据访问中止模式Mode_UND        EQU     0x1B  未定义指令中止模式M

8、ode_SYS        EQU     0x1F   系统模式I_Bit           EQU     0x80             when I bit is set, IRQ is

9、 disabledF_Bit           EQU     0x40             when F bit is set, FIQ is disabled;栈(Stack)设置。不同工作模式的堆栈寄存器sp不一样。;设置栈空间UND_Stack_Size  EQU     0

10、x00000000  未定义模式SVC_Stack_Size  EQU     0x00000008  管理模式栈长度ABT_Stack_Size  EQU     0x00000000  数据访问中止模式栈长度FIQ_Stack_Size  EQU     0x00000000   快中断模式栈长度IRQ_Stack_Size  EQU 

11、;    0x00000080  ;中断模式栈长度USR_Stack_Size  EQU     0x00000400 用户模式栈长度ISR_Stack_Size  EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size +              

12、0;           FIQ_Stack_Size + IRQ_Stack_Size)      所有的堆栈大小进行相加,得到总堆栈大小;/*;arm的汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性;READWRITE(读写)READONLY(只读)NOINIT(不初始化内存单元或将内存写0) */       

13、;         AREA    STACK, NOINIT, READWRITE, ALIGN=3  定义栈段,段名为STACK,字节对齐方式Stack_Mem       SPACE   USR_Stack_Size   SPACE指令用于分配一块内存单元。这里分别为这两个栈分配对应_initial_sp    SPACE

14、   ISR_Stack_Size        ;长度的内存空间Stack_Top    EQU  Stack_Mem + ISR_Stack_Size /定义栈开始地址(最大地址,堆栈向下访问) 堆(heap)配置;堆大小(单位:字节)Heap_Size       EQU     0x00000000  系统的堆空间设定/

15、定义堆空间大小(配合最后的动态内存申请使用)                AREA    HEAP, NOINIT, READWRITE, ALIGN=3  定义堆段,段名:HEAP,不初始化内存,可读写,字节对齐_heap_baseHeap_Mem        SPACE   Heap_Size

16、0;    ;申请堆的内存空间_heap_limit;-存储器设定 -IRAM_BASE       EQU     0x40000000   内存基地址;-看门狗定义 -WT_BASE         EQU     0x53000000       看门狗

17、寄存器基地址WTCON_OFS       EQU     0x00             看门狗控制寄存器 对应基地址的偏移值WTDAT_OFS       EQU     0x04        

18、;     看门狗数据寄存器  对应基地址的偏移值WTCNT_OFS       EQU     0x08             看门狗计数寄存器 对应基地址的偏移值;看门狗时钟设置WT_SETUP        EQU   &

19、#160; 1           看门狗设置WTCON_Val       EQU     0x00000000   看门狗控制寄存器相关WTDAT_Val       EQU     0x00008000    看门

20、狗数据寄存器相关;- 时钟管理定义 -CLOCK_BASE      EQU     0x4C000000       时钟寄存器基地址LOCKTIME_OFS    EQU     0x00            PLL锁定时间计数器对应基地址的偏

21、移值MPLLCON_OFS     EQU     0x04            ; MPLL配置寄存器对应基地址的偏移值UPLLCON_OFS     EQU     0x08            ; UPLL配置

22、寄存器对应基地址的偏移值CLKCON_OFS      EQU     0x0C             时钟控制器对应基地址的偏移值CLKSLOW_OFS     EQU     0x10          

23、   慢时钟控制寄存器对应基地址的偏移值CLKDIVN_OFS     EQU     0x14             时钟分频控制器对应基地址的偏移值CAMDIVN_OFS     EQU     0x18       

24、60;    ; 摄像时钟分频控制器对应基地址的偏移值;时钟相关寄存器设置值的宏定义CLOCK_SETUP     EQU     0                   ;时钟设置   ;在以后的实验里,我会将它设置为1,这样做是为了让系统在运行时就对时钟进行初始化LOCKTIME_Va

25、l    EQU     0x0FFF0FFF  PLL锁定时间计数器 值MPLLCON_Val     EQU     0x00043011   MPLL控制寄存器  值    设置FCLK=300MHzUPLLCON_Val     EQU     0x000380

26、21   ;UPLL控制寄存器   值CLKCON_Val      EQU     0x001FFFF0    时钟控制器    值CLKSLOW_Val     EQU     0x00000004    慢时钟控制器    值CLKDIVN_V

27、al     EQU     0x0000000F      时钟分频控制器   值    ;设置分频比为1:3:6,UCLK=48MHzCAMDIVN_Val     EQU     0x00000000    ;摄像时钟分频器   值;- 存储器控制设定 -MC_BASE&#

28、160;        EQU     0x48000000       存储器控制器基地址BWSCON_OFS      EQU     0x00            ; 位宽和等待控制寄存器   

29、; 偏移值BANKCON0_OFS    EQU     0x04            ;BANK0控制寄存器   偏移值BANKCON1_OFS    EQU     0x08            ; BANK1控

30、制寄存器   偏移值BANKCON2_OFS    EQU     0x0C            ; BANK2控制寄存器   偏移值BANKCON3_OFS    EQU     0x10          

31、;   BANK3控制寄存器   偏移值BANKCON4_OFS    EQU     0x14            ; BANK4控制寄存器   偏移值BANKCON5_OFS    EQU     0x18      

32、60;      BANK5控制寄存器   偏移值BANKCON6_OFS    EQU     0x1C            ; BANK6控制寄存器   偏移值BANKCON7_OFS    EQU     0x20   &

33、#160;        ;BANK7控制寄存器   偏移值REFRESH_OFS     EQU     0x24             SDRAM刷新控制寄存器   偏移值BANKSIZE_OFS    EQU   

34、0; 0x28            ; BANKSIZE寄存器    偏移值MRSRB6_OFS      EQU     0x2C            ; SDRAM控制寄存器  偏移值MRSRB7_OFS  &#

35、160;   EQU     0x30             SDRAM控制寄存器   偏移值;存储控制器的相应的设置值MC_SETUP        EQU     0          ;存储控

36、制器设定BWSCON_Val      EQU     0x22000000   总线宽度和等待控制器   值BANKCON0_Val    EQU     0x00000700  Boor  ROM控制器  值BANKCON1_Val    EQU     0x00000700

37、  BANK1控制  值BANKCON2_Val    EQU     0x00000700  BANK2控制  值BANKCON3_Val    EQU     0x00000700  BANK3控制  值BANKCON4_Val    EQU     0x00000700  

38、BANK4控制  值BANKCON5_Val    EQU     0x00000700  BANK5控制  值BANKCON6_Val    EQU     0x00018005  BANK6控制  值BANKCON7_Val    EQU     0x00018005  BANK7控制 

39、; 值REFRESH_Val     EQU     0x008404F3   DRAM/SDRAM刷新控制BANKSIZE_Val    EQU     0x00000032    存储器大小控制MRSRB6_Val      EQU     0x00000020  

40、   ;SDRAM的模式设置寄存器  控制MRSRB7_Val      EQU     0x00000020     SDRAM的模式设置寄存器  控制;- I/O 口设定-GPA_BASE        EQU     0x56000000     

41、60; GPA Base AddressGPB_BASE        EQU     0x56000010       GPB Base AddressGPC_BASE        EQU     0x56000020       GPC Base Add

42、ressGPD_BASE        EQU     0x56000030      ; GPD Base AddressGPE_BASE        EQU     0x56000040       GPE Base AddressGPF_BASE &#

43、160;      EQU     0x56000050      ; GPF Base AddressGPG_BASE        EQU     0x56000060       GPG Base AddressGPH_BASE    

44、0;   EQU     0x56000070      ; GPH Base AddressGPJ_BASE        EQU     0x560000D0       GPJ Base AddressGPCON_OFS       EQU &

45、#160;   0x00             控制寄存器相对应于上面(A-J)基地址的偏移值GPDAT_OFS       EQU     0x04             数据寄存器相对应于上面(A-J)基地址的偏移值GPUP_OFS

46、        EQU     0x08             上拉控制寄存器相对应于上面(B-J)基地址的偏移值; I/O端口 设定GP_SETUP        EQU     0;端口AGPA_SETUP    

47、   EQU     0GPACON_Val      EQU     0x000003FF;端口BGPB_SETUP       EQU     0GPBCON_Val      EQU     0x00000000GPBUP_Val  

48、     EQU     0x00000000   端口B上拉开启;端口CGPC_SETUP       EQU     0GPCCON_Val      EQU     0x00000000GPCUP_Val       EQU 

49、;    0x00000000     端口C上拉开启;端口DGPD_SETUP       EQU     0GPDCON_Val      EQU     0x00000000GPDUP_Val       EQU     0

50、x00000000     端口D上拉开启;端口EGPE_SETUP       EQU     0GPECON_Val      EQU     0x00000000GPEUP_Val       EQU     0x00000000  

51、   端口E上拉开启;端口FGPF_SETUP       EQU     0GPFCON_Val      EQU     0x00000000GPFUP_Val       EQU     0x00000000    端口F上拉开启;端

52、口GGPG_SETUP       EQU     0GPGCON_Val      EQU     0x00000000GPGUP_Val       EQU     0x00000000     端口G上拉开启;端口HGPH_SETUP 

53、0;     EQU     0GPHCON_Val      EQU     0x00000000GPHUP_Val       EQU     0x00000000       ;端口H上拉开启;端口JGPJ_SETUP    

54、;   EQU     0GPJCON_Val      EQU     0x00000000GPJUP_Val       EQU     0x00000000       端口J上拉开启;- 这才是真正的程序开始的地方,前边都是一些宏定义和准备工作-  &

55、#160;             ;汇编程序数据8字节对齐                PRESERVE8   C和汇编有8位对齐的要求,这个伪指令可以满足此要求           &

56、#160;    段定义和程序入口点;  启动代码必须连接到第一个地址才能运行。在MDK配置选项里边默认的连接就是从这段代码开始的,别轻易改啊                AREA    RESET, CODE, READONLY    定义程序段,段名为RESET,只读     

57、60;          ARM     ARM模式运行程序                IF      :LNOT:DEF:_EVAL    ;这是要引用咱们的编译器MDK自动生成的两个符号   

58、             IMPORT  |Image$ER_ROM1$RO$Length|      RO段地址,长度,可以再MDK配置选项Linker看到这两个的定义                IMPORT  |Image$RW_RAM1$R

59、W$Length|     RW段地址,长度                ENDIF; 异常向量表Vectors         LDR     PC, Reset_Addr   复位异常,    地址0x0000 0

60、000                     LDR     PC, Undef_Addr        未定义异常, 地址0x0000 0004/关于地址,我不确定,因为前面说的是8字节对齐,是不是0x0000 0008呢    

61、60;           LDR     PC, SWI_Addr           软件中断,    地址0x0000 0008                LD

62、R     PC, PAbt_Addr          指令预取中断,地址0x0000 000C                LDR     PC, DAbt_Addr        &

63、#160; ;数据异常中断,地址0x0000 0010                IF      :DEF:_EVAL               如果定义了_EVAL变量      &

64、#160;           DCD   0x4000                       DCD常用于分配一块连续的内存单元,分配2K空间        &#

65、160;       ELSE                   DCD   |Image$ER_ROM1$RO$Length|+      否则分配空间大小为RO输出区的字节长度与RW输出区的字节长度之和      

66、                  |Image$RW_RAM1$RW$Length|                ENDIF            

67、0;   LDR     PC, IRQ_Addr           普通中断                LDR     PC, FIQ_Addr       &#

68、160;   快中断                IF      :DEF:_RTX                IMPORT  SWI_Handler    

69、60;           IMPORT  IRQ_Handler_RTX                ENDIFReset_Addr      DCD     Reset_Handler     

70、  Label  DCD  expr是分配一块连续的内存单元,并用expr初始化,Label是一个标号,代表的是Undef_Addr      DCD     Undef_Handler       所分配的内存单元的首地址。这里实际上是将相应的异常中断的处理程序的入口地址赋值给前边的标号SWI_Addr        DCD&

71、#160;    SWI_Handler           PAbt_Addr       DCD     PAbt_Handler          DAbt_Addr       DCD

72、0;    DAbt_Handler                         DCD     0               

73、60;    Reserved Address                IF      :DEF:_RTXIRQ_Addr        DCD     IRQ_Handler_RTX      

74、;          ELSEIRQ_Addr        DCD     IRQ_Handler                ENDIFFIQ_Addr        DCD

75、     FIQ_Handler        将快中断处理函数FIQ_Handler的地址赋值给FIQ_AddrUndef_Handler   B       Undef_Handler                IF  &

76、#160;   :DEF:_RTX                ELSESWI_Handler     B       SWI_Handler                EN

77、DIFPAbt_Handler    B       PAbt_HandlerDAbt_Handler    B       DAbt_HandlerIRQ_Handler     PROC                EXPO

78、RT  IRQ_Handler               WEAK                B       .          &

79、#160;     ENDPFIQ_Handler     B       FIQ_Handler; 复位异常处理程序,每次复位后程序都要从此处开始执行                EXPORT  Reset_Handler    定义一个全局函数变量Res

80、et_Handler  -;看门狗配置;若WT_SETUP不等于0,执行此语句,否则执行下一个语句;前面已经定义WT_SETUP=1,所以会执行这一段; -                IF      WT_SETUP != 0           

81、0;        LDR     R0, =WT_BASE       加载看门狗地址                LDR     R1, =WTCON_Val   加载看门狗控制寄存器数据

82、60;               LDR     R2, =WTDAT_Val    加载看门狗数据寄存器数据                STR     R2, R0, #WTCNT_

83、OFS  将WTDAT_Val配置给看门狗计数寄存器                STR     R2, R0, #WTDAT_OFS  将WTDAT_Val配置给看门狗数据寄存器                STR

84、     R1, R0, #WTCON_OFS  将WTCON_Val配置给看门狗控制寄存器                ENDIF;-;时钟设置;如果逻辑上没有定义NO_CLOCK_SETUP并且CLOCK_SETUP!=0,则执行下面程序;前面定义CLOCK_SETUP=0,则会跳过这段程序。;所以咱们以后可以自己设置时钟频率,我是倾向于自己设置的,因为这也是一个知识点,;并且S3

85、C2440的时钟配置是一个很重要的知识。在这里我猜测,既然没有时钟初始化,那么咱们下载到;SDRAM后,应该是以晶振12MHz来工作的,当然只是猜测,错了的时候再改;后面几个实验后,我返回来再说一句,我的猜测是对的,系统默认的是不对系统时钟进行初始化,为了方便,;在以后的实验中,我都将CLOCK_SETUP修改为1,这样子我就不用重写代码了。;系统初始化之后的结果就是FCLK=300MHz,HCLK=100MHz,PCLK=50MHz;-             &

86、#160;                               IF      (:LNOT:(:DEF:NO_CLOCK_SETUP):LAND:(CLOCK_SETUP != 0)     

87、;           LDR     R0, =CLOCK_BASE                        加载时钟基地址       &#

88、160;        LDR     R1,      =LOCKTIME_Val                  加载PLL锁定时间计数值         

89、0;      STR     R1, R0, #LOCKTIME_OFS            将PLL锁定时间值配置到PLL锁定时间计数器                MOV     R1,&#

90、160;     #CLKDIVN_Val                                  STR     R1, R0, #CLKDIVN_OFS  

91、             配置时钟分频器                LDR     R1,      =CAMDIVN_Val        &#

92、160;       STR     R1, R0, #CAMDIVN_OFS               配置摄像头分频控制寄存器                LDR  

93、60;  R1,      =MPLLCON_Val                STR     R1, R0, #MPLLCON_OFS               配置MPLL配置寄存器

94、0;               LDR     R1,      =UPLLCON_Val                STR     R1, R0, #UPLLCON_OFS

95、                ;配置UPLL配置寄存器                MOV     R1,      #CLKSLOW_Val     &#

96、160;          STR     R1, R0, #CLKSLOW_OFS               ;配置慢时钟配置寄存器                LDR

97、60;    R1,      =CLKCON_Val                STR     R1, R0, #CLKCON_OFS                

98、;  配置时钟控制寄存器                ENDIF;-;存储控制器设置;如果没有定义NO_MC_SETUP且CLOCK_SETUP!=0,则执行下面的程序。;此处前面定义CLOCK_SETUP=0,也就是说这一段又不执行,真假的,这是要闹哪样?;-              

99、;  IF      (:LNOT:(:DEF:NO_MC_SETUP):LAND:(CLOCK_SETUP != 0)                LDR     R0, =MC_BASE             &

100、#160;                         ;加载存储控制器基地址                LDR     R1,   

101、;   =BWSCON_Val                STR     R1, R0, #BWSCON_OFS                       

102、;配置总线宽度和等待控制寄存器                LDR     R1,      =BANKCON0_Val                STR    

103、R1, R0, #BANKCON0_OFS                    配置BANK0控制寄存器                LDR     R1,    &

104、#160; =BANKCON1_Val                STR     R1, R0, #BANKCON1_OFS                    配置BANK1控制寄存器 

105、60;              LDR     R1,      =BANKCON2_Val                STR     R1, R0, #BANKCON2_OFS

106、60;                   ;配置BANK2控制寄存器                LDR     R1,      =BANKCON3_Val 

107、60;              STR     R1, R0, #BANKCON3_OFS                    配置BANK3控制寄存器      &

108、#160;         LDR     R1,      =BANKCON4_Val                STR     R1, R0, #BANKCON4_OFS     &

109、#160;              配置BANK4控制寄存器                LDR     R1,      =BANKCON5_Val     

110、60;          STR     R1, R0, #BANKCON5_OFS                    配置BANK5控制寄存器          &

111、#160;     LDR     R1,      =BANKCON6_Val                STR     R1, R0, #BANKCON6_OFS         &

112、#160;          配置BANK6控制寄存器                LDR     R1,      =BANKCON7_Val         

113、60;      STR     R1, R0, #BANKCON7_OFS                    配置BANK7控制寄存器               

114、 LDR     R1,      =REFRESH_Val                STR     R1, R0, #REFRESH_OFS              &#

115、160;        配置DRAM/SDRAM刷新控制寄存器                            MOV     R1,      #BAN

116、KSIZE_Val                STR     R1, R0, #BANKSIZE_OFS                      配置可调的Bank大小控制寄存器

117、60;               MOV     R1,      #MRSRB6_Val                STR     R1, R0, #MRSRB6_OFS&

118、#160;                         配置SDRAM模式控制寄存器                MOV     R1, 

119、60;    #MRSRB7_Val                STR     R1, R0, #MRSRB7_OFS                     

120、60;     配置SDRAM模式控制寄存器                ENDIF                        -;I/O端口配置;如果没有定义NO

121、_GP_SETUP且GP_SETUP!=0,则执行下面的程序;好吧,前边定义了GP_SETUP=0,我现在想知道,他到底执行什么?代码是我直接复制过来的,;为什么我看到有的人的代码都定义为1呢?淡定,接着分析;-                                &#

122、160;                          IF      (:LNOT:(:DEF:NO_GP_SETUP):LAND:(GP_SETUP != 0)           

123、     IF      GPA_SETUP != 0                LDR     R0, =GPA_BASE                

124、    配置端口A                LDR     R1, =GPACON_Val                A口有25个口,做I/O时只能做输出口,不能做输入口  

125、60;             STR     R1, R0, #GPCON_OFS                ENDIF             

126、0;  IF      GPB_SETUP != 0                LDR     R0, =GPB_BASE                  

127、0;  ;配置端口B                LDR     R1, =GPBCON_Val                STR     R1, R0, #GPCON_OFS  &#

128、160;             LDR     R1, =GPBUP_Val                STR     R1, R0, #GPUP_OFS       

129、60;        ENDIF                IF      GPC_SETUP != 0                LDR   

130、;  R0, =GPC_BASE                      配置端口C                LDR     R1, =GPCCON_Val &#

131、160;              STR     R1, R0, #GPCON_OFS                LDR     R1, =GPCUP_Val      &#

132、160;         STR     R1, R0, #GPUP_OFS                ENDIF                IF  &

133、#160;   GPD_SETUP != 0                LDR     R0, =GPD_BASE                      

134、0;  配置端口D功能                LDR     R1, =GPDCON_Val                STR     R1, R0, #GPCON_OFS &#

135、160;              LDR     R1, =GPDUP_Val                STR     R1, R0, #GPUP_OFS      

136、60;         ENDIF                IF      GPE_SETUP != 0                LDR  

137、;   R0, =GPE_BASE                      配置端口E                LDR     R1, =GPECON_Val&#

138、160;               STR     R1, R0, #GPCON_OFS                LDR     R1, =GPEUP_Val     &#

139、160;          STR     R1, R0, #GPUP_OFS                ENDIF                IF &

140、#160;    GPF_SETUP != 0                LDR     R0, =GPF_BASE                     ;配置端口F

141、60;               LDR     R1, =GPFCON_Val                STR     R1, R0, #GPCON_OFS     &#

142、160;          LDR     R1, =GPFUP_Val                STR     R1, R0, #GPUP_OFS                ENDIF                IF      GPG_SETUP != 0   

温馨提示

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

评论

0/150

提交评论