




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第5 5章章 嵌入式开发环境嵌入式开发环境的建立的建立 在熟知的环境里奔跑,可以随心所欲。在熟知的环境里奔跑,可以随心所欲。 2本章内容本章内容5.1 5.1 嵌入式系统的开发模式与设计流程嵌入式系统的开发模式与设计流程15.2 5.2 嵌入式嵌入式LinuxLinux开发流程开发流程25.3 5.3 嵌入式系统开发环境的建立嵌入式系统开发环境的建立35.4 5.4 BootLoaderBootLoader45.5 Linux5.5 Linux的根文件系统的根文件系统453简介简介v无论你是否做过嵌入式系统的开发,开发环境的无论你是否做过嵌入式系统的开发,开发环境的建立都是开发者要做的第一
2、件事情。本章向你讲建立都是开发者要做的第一件事情。本章向你讲述如何利用已有知识进行嵌入式系统的开发,介述如何利用已有知识进行嵌入式系统的开发,介绍嵌入式系统的设计、开发流程和具体操作步骤,绍嵌入式系统的设计、开发流程和具体操作步骤,以及如何构建嵌入式系统的开发环境。以及如何构建嵌入式系统的开发环境。45.1 5.1 嵌入式系统的开发模式与设计流程嵌入式系统的开发模式与设计流程 v嵌入式系统通常是一个资源受限的系统,因此直嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件开发平台上编写软件是非接在嵌入式系统的硬件开发平台上编写软件是非常困难的。目前一般采用的解决办法是首先在软常困难的
3、。目前一般采用的解决办法是首先在软硬件资源比较丰富的通用计算机上编写程序,然硬件资源比较丰富的通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位制代码格式,最后再下载到目标平台上的特定位置上运行。也就是我们通常所说的构建置上运行。也就是我们通常所说的构建“宿主机宿主机/ /目标机目标机”的交叉开发环境,的交叉开发环境,“在谁的上面编写运在谁的上面编写运行在谁上的程序的问题行在谁上的程序的问题”。 5.1.1 5.1.1 嵌入式系统开发模式嵌入式系统开发模式 v交叉开发环境是指编译、链接和调试嵌入
4、式应用交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用所不同,通常采用“宿主机宿主机+ +目标机调试通道目标机调试通道”的模式,如图所示。的模式,如图所示。 5v在采用宿主机在采用宿主机/ /目标机模式开发嵌入式应用软件时目标机模式开发嵌入式应用软件时,首先利用宿主机上丰富的软硬件资源及良好的,首先利用宿主机上丰富的软硬件资源及良好的开发环境和调试工具来开发并仿真调试目标机上开发环境和调试工具来开发并仿真调试目标机上的软件,然后通过串口、的软件,然后通过串口、USBUSB接口或者以太网接口接口或者以太
5、网接口将交叉编译生成的目标代码和可执行文件传输并将交叉编译生成的目标代码和可执行文件传输并下载到目标机上,并在监控程序或者操作系统的下载到目标机上,并在监控程序或者操作系统的支持下利用交叉调试器进行实时分析和调试,最支持下利用交叉调试器进行实时分析和调试,最后将程序下载固化到目标机上。在特定环境下目后将程序下载固化到目标机上。在特定环境下目标机脱离宿主机单独运行,该开发过程如下图所标机脱离宿主机单独运行,该开发过程如下图所示。示。 6采用宿主机采用宿主机/ /目标机模式开发嵌入式应用软件过程示意图目标机模式开发嵌入式应用软件过程示意图 7v在运行在运行Linux Linux 的上位机上完成嵌入
6、式软件源代码的上位机上完成嵌入式软件源代码的编写之后,需要进行编译和链接以生成可执行的编写之后,需要进行编译和链接以生成可执行代码。由于宿主机开发过程大多是在使用代码。由于宿主机开发过程大多是在使用IntelIntel公公司司x86x86系列系列CPUCPU的通用计算机上进行的,而目标环的通用计算机上进行的,而目标环境的处理器芯片却大多为境的处理器芯片却大多为ARMARM、MIPSMIPS、PowerPCPowerPC等等系列的微处理器,这就要求在建立好的交叉开发系列的微处理器,这就要求在建立好的交叉开发环境中使用宿主机上的交叉编译、汇编及连接工环境中使用宿主机上的交叉编译、汇编及连接工具进行
7、交叉编译和链接,形成可执行的二进制代具进行交叉编译和链接,形成可执行的二进制代码码( (这种可执行代码并不能在宿主机上执行,而只这种可执行代码并不能在宿主机上执行,而只能在目标板上执行能在目标板上执行) ),然后把可执行文件下载到目,然后把可执行文件下载到目标机上运行。整个开发流程如下图所示。标机上运行。整个开发流程如下图所示。 895.1.2 5.1.2 嵌入式系统的设计流程嵌入式系统的设计流程 v嵌入式系统的开发设计流程类似于大多数其他计嵌入式系统的开发设计流程类似于大多数其他计算机系统的设计流程。在遵循一般工程开发流程算机系统的设计流程。在遵循一般工程开发流程的基础上,嵌入式系统的开发设
8、计流程有其自身的基础上,嵌入式系统的开发设计流程有其自身的特点,且已经逐步规范化,其简化的设计流程的特点,且已经逐步规范化,其简化的设计流程图如下图所示。图如下图所示。v该设计过程一般可以分为五个阶段:需求分析、该设计过程一般可以分为五个阶段:需求分析、体系结构设计、硬件体系结构设计、硬件/ /软件设计、系统集成以及系软件设计、系统集成以及系统测试。以上各个阶段之间往往需要不断地反复统测试。以上各个阶段之间往往需要不断地反复和修改,直至完成最初的设计目标,到得符合要和修改,直至完成最初的设计目标,到得符合要求的最终产品。求的最终产品。 10115.2 5.2 嵌入式嵌入式LinuxLinux开
9、发流程开发流程 v如果在一个嵌入式系统开发过程中使用如果在一个嵌入式系统开发过程中使用Linux Linux 操操作系统和相关技术,一般需要经过如下的流程:作系统和相关技术,一般需要经过如下的流程: 1. 1. 建立开发环境。建立开发环境。 2. 2. 配置开发主机,包括配置开发主机,包括MinicomMinicom、IPIP地址、地址、NFSNFS网络文网络文件系统等的配置件系统等的配置 3. 3. 建立引导装载程序建立引导装载程序bootloaderbootloader。 4. 4. 下载别人已经移植好的下载别人已经移植好的LinuxLinux操作系统。操作系统。 5. 5. 建立根文件系
10、统。建立根文件系统。 6. 6. 建立应用程序的建立应用程序的FlashFlash分区。分区。 7. 7. 开发应用程序。开发应用程序。 8. 8. 烧写内核、根文件系统、应用程序。烧写内核、根文件系统、应用程序。 9. 9. 发布产品。发布产品。125.3 5.3 嵌入式系统开发环境的建立嵌入式系统开发环境的建立v建立嵌入式建立嵌入式LinuxLinux开发环境一般有如下三种方案:开发环境一般有如下三种方案:v1. 1. 基于基于PC PC 机机WindowsWindows操作系统下的操作系统下的CygwinCygwinv2. 2. 在在PCPC机上直接安装机上直接安装LinuxLinux操
11、作系统操作系统v3. 3. 先在先在WindowsWindows操作系统下安装虚拟机,然后在操作系统下安装虚拟机,然后在虚拟机中安装虚拟机中安装LinuxLinux操作系统操作系统135.3.1 5.3.1 建立开发环境建立开发环境5.3.2 5.3.2 开发环境的配置开发环境的配置 v嵌入式应用程序的开发一般先在宿主机上调试完嵌入式应用程序的开发一般先在宿主机上调试完成,然后下载到目标机。为保证正常下载,必须成,然后下载到目标机。为保证正常下载,必须建立宿主机与目标机之间的可靠连接。宿主机上建立宿主机与目标机之间的可靠连接。宿主机上的的VMwareVMware软件及软件及LinuxLinux
12、系统安装好之后,需要配置系统安装好之后,需要配置好宿主机的开发环境才能与开发机正常进行通信好宿主机的开发环境才能与开发机正常进行通信。在。在.1小节嵌入式系统的开发模式中已经提到小节嵌入式系统的开发模式中已经提到,宿主机与目标机之间的一般通过串口、以太网,宿主机与目标机之间的一般通过串口、以太网口、口、USBUSB或者或者JTAGJTAG接口进行通信,如下图所示。接口进行通信,如下图所示。 14155.4 5.4 BootLoaderBootLoaderv一个嵌入式一个嵌入式LinuxLinux系统从软件角度通常可以分为引导系统从软件角度通常可以分为引导加载程序、加载程序、Li
13、nuxLinux操作系统内核、文件系统和用户应操作系统内核、文件系统和用户应用程序四个层次。其中的引导加载程序是计算机系统用程序四个层次。其中的引导加载程序是计算机系统加电后运行的第一段软件代码。引导加载程序包括固加电后运行的第一段软件代码。引导加载程序包括固化在固件化在固件(firmware)(firmware)中的中的Boot Boot 代码代码( (可选可选) )和和BootLoaderBootLoader两大部分。两大部分。 v引导程序引导程序BootLoaderBootLoader的总目标就是在嵌入式系统上电的总目标就是在嵌入式系统上电后正确地调用内核并执行。对于某些不使用操作系统后
14、正确地调用内核并执行。对于某些不使用操作系统的嵌入式系统而言,应用程序的运行同样也需要依赖的嵌入式系统而言,应用程序的运行同样也需要依赖于引导程序,因此于引导程序,因此BootLoaderBootLoader对于嵌入式系统来说是对于嵌入式系统来说是非常必要的。非常必要的。 165.4.1 5.4.1 BootLoaderBootLoader详解详解vBootLoaderBootLoader的主要功能包括:的主要功能包括:v(1 1)硬件设备初始化()硬件设备初始化(CPUCPU的主频、的主频、SDRAMSDRAM、中断、中断、串口等);、串口等);v(2 2)内核启动参数;)内核启动参数;v(
15、3 3)启动内核;)启动内核;v(4 4)与主机进行交互,从串口、)与主机进行交互,从串口、USBUSB口或者网络口或者网络口下载映像文件,并可以对口下载映像文件,并可以对FlashFlash等存储设备进行等存储设备进行管理。管理。17v BootLoaderBootLoader的工作原理:的工作原理:v首先完成系统硬件的初始化,包括时钟的设置、存首先完成系统硬件的初始化,包括时钟的设置、存储器的映射等,设置堆栈指针;然后跳转到操作系储器的映射等,设置堆栈指针;然后跳转到操作系统内核入口,如系统在加电或复位时,通常从地址统内核入口,如系统在加电或复位时,通常从地址0 x000000000 x0
16、0000000处开始执行,而在这个地址处安排的通处开始执行,而在这个地址处安排的通常就是系统的常就是系统的BootLoaderBootLoader程序。这样,将系统的软程序。这样,将系统的软硬件环境带到一个合适的状态,以便为最终调用操硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。至此之后,系统的作系统内核准备好正确的环境。至此之后,系统的运行就在操作系统的控制下了。运行就在操作系统的控制下了。 18vBootLoaderBootLoader的实现依赖于处理器的体系结构,因的实现依赖于处理器的体系结构,因此大多数此大多数BootLoaderBootLoader的结构分为
17、阶段的结构分为阶段1(stage1)1(stage1)和和阶段阶段2(stage 2)2(stage 2)两部分。依赖于处理器体系结构两部分。依赖于处理器体系结构如设备初始化等的代码,通常都放在阶段如设备初始化等的代码,通常都放在阶段1 1中,而中,而且通常用汇编语言编码实现,以达到短小精悍的且通常用汇编语言编码实现,以达到短小精悍的目的。而阶段目的。而阶段2 2通常用通常用C C语言来实现,这样可以实语言来实现,这样可以实现一些复杂的功能,而且代码会具有更好的可读现一些复杂的功能,而且代码会具有更好的可读性和可移植性。性和可移植性。 19vBootLoaderBootLoader阶段阶段1
18、1的启动步骤如图的启动步骤如图5.235.23所示,具体所示,具体任务包括:任务包括:v(1 1)基本的硬件初始化,包括屏蔽所有的中断、)基本的硬件初始化,包括屏蔽所有的中断、设置设置CPUCPU的速度和时钟频率、的速度和时钟频率、RAMRAM初始化、关闭初始化、关闭CPUCPU内部指令内部指令/ /数据数据CacheCache;v(2 2)为加载)为加载BootLoaderBootLoader的的stage2stage2准备准备RAMRAM空间;空间;v(3 3)拷贝)拷贝BootLoaderBootLoader的的stage2stage2到到RAMRAM中;中;v(4 4)设置堆栈指针;)
19、设置堆栈指针;v(5 5)跳转到)跳转到stage2stage2的的C C入口点。入口点。20vBootLoaderBootLoader阶段阶段2 2的启动步骤如图的启动步骤如图5.245.24所示,具体所示,具体任务包括:任务包括:v(1 1)初始化本阶段要使用到的硬件设备;)初始化本阶段要使用到的硬件设备;v(2 2)检测系统内存映射;)检测系统内存映射;v(3 3)加载)加载kernelkernel内核映像和根文件系统映像。将内核映像和根文件系统映像。将kernelkernel映像和根文件系统映像从映像和根文件系统映像从FlashFlash上读到上读到RAM RAM 空空间中;间中;v(
20、4 4)设置内核的启动参数;)设置内核的启动参数;v(5 5)跳转到内核映像入口并调用内核程序;)跳转到内核映像入口并调用内核程序;v(6 6)系统的软件设置,更新系统)系统的软件设置,更新系统(system.bin)(system.bin)。.2 vivivivi vvivivivi是韩国是韩国MiziMizi公司开发的一种公司开发的一种BootLoaderBootLoader,可,可用于用于ARM9ARM9处理器的引导。目前处理器的引导。目前vivivivi只能利用串行只能利用串行通信为用户提供接口。为连接通信为用户提供接口。为连接vivivivi,首先利用串,首先利用
21、串口电缆连接宿主机和目标机,然后在主机上运行口电缆连接宿主机和目标机,然后在主机上运行串口通信程序(超级终端),并在目标机上正确串口通信程序(超级终端),并在目标机上正确设置设置vivivivi以支持串口。正确连接后,就可以由串以支持串口。正确连接后,就可以由串口通信程序显示提示信息。口通信程序显示提示信息。vivivivi支持基于支持基于S3C2410S3C2410芯片芯片UP-NETARM2410UP-NETARM2410平台上平台上LinuxLinux内核的引导,结内核的引导,结构简单,可以传递内核参数。构简单,可以传递内核参数。 22vvivivivi的源代码可从的源代码可从http:
22、/ v vivivivi的操作模式:的操作模式:v作为典型作为典型BootLoaderBootLoader之一的之一的vivivivi的运行也可以分的运行也可以分为两个阶段。为两个阶段。23v(1 1) vivivivi的第一阶段的第一阶段 1 1)关)关WATCH DOGWATCH DOG(上电后,(上电后,WATCH DOGWATCH DOG默认是开着的)默认是开着的); 2 2)禁止所有中断;)禁止所有中断; 3 3)初始化系统时钟;)初始化系统时钟; 4 4)初始化内存控制寄存器(一共)初始化内存控制寄存器(一共1313个);个); 5 5)检查是否从掉电模式唤醒,若是,则调用)检查是
23、否从掉电模式唤醒,若是,则调用WakeupStartWakeupStart函数进行处理;函数进行处理; 6 6)点亮所有)点亮所有LEDLED; 7 7)初始化)初始化UART0UART0; 8 8) 将将vivivivi所有代码所有代码( (包括包括stage1stage1、stage2)stage2)从从NAND NAND FlashFlash复制到复制到SDRAMSDRAM; 9 9)跳到)跳到bootloaderbootloader的的stage2stage2运行。运行。 24v(2 2) vivivivi的第二阶段的第二阶段 1 1)打印)打印vivivivi的信息,包括版本号等;的
24、信息,包括版本号等; 2 2)调用若干个初始化函数;)调用若干个初始化函数; 3 3)boot_or_viviboot_or_vivi()():判断是否有:判断是否有“r”r”,回车或,回车或空格键按下,若有,则进入空格键按下,若有,则进入vivivivi shell shell;若没有;若没有,则执行,则执行bootboot命令,启动内核;命令,启动内核; 4 4)bootboot命令执行后,找到命令执行后,找到kernelkernel分区,找它的分区,找它的偏移量和大小,执行偏移量和大小,执行boot_kernelboot_kernel()()函数,拷贝函数,拷贝内核映象;内核映象; 5
25、5)设置)设置linuxlinux启动参数,打印启动参数,打印“Now Booting Now Booting Linux”Linux” 6 6)调用)调用call_linuxcall_linux()()函数,启动内核。函数,启动内核。.3 U-BootU-Boot vU-BootU-Boot,全称,全称Universal Boot LoaderUniversal Boot Loader,是遵循,是遵循GPLGPL协议的一个开放源码项目。最初由协议的一个开放源码项目。最初由DENXDENX软件工软件工程中心的程中心的Wolfgang Wolfgang DenkDenk基于基
26、于8xxROM8xxROM的源码创建的源码创建PPCBootPPCBoot工程,工程,SysgoSysgo GmbhGmbh将将PPCBootPPCBoot移植到移植到ARMARM平平台,创建台,创建ARMBootARMBoot工程,之后以工程,之后以PPCBootPPCBoot和和ARMBootARMBoot为基础,创建了为基础,创建了U-BootU-Boot工程。工程。U-BootU-Boot目前可支持目前可支持PowerPCPowerPC、ARMARM、X86X86、MIPSMIPS等体系结构的上百种开等体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发发板,已经成为功能最多、
27、灵活性最强并且开发最积极的开放源码最积极的开放源码BootLoaderBootLoader。 vU-BootU-Boot提供两种操作模式:启动加载模式和下载提供两种操作模式:启动加载模式和下载模式,并具有大型模式,并具有大型BootLoaderBootLoader的全部功能。的全部功能。 265.5 Linux5.5 Linux的根文件系统的根文件系统v文件系统是用于组织在一个磁盘文件系统是用于组织在一个磁盘( (包括光盘、软盘包括光盘、软盘、FlashFlash闪存及其它存储设备闪存及其它存储设备) )或分区上的文件的或分区上的文件的目录结构。在目录结构。在LinuxLinux系统中,硬件设
28、备是以文件的系统中,硬件设备是以文件的形式存在。如何将这些文件进行分类管理且提供形式存在。如何将这些文件进行分类管理且提供与内核交互的接口,就形成了一定的逻辑目录结与内核交互的接口,就形成了一定的逻辑目录结构,也就是文件系统。构,也就是文件系统。LinuxLinux内核在启动过程中会内核在启动过程中会安装文件系统,文件系统是安装文件系统,文件系统是LinuxLinux操作系统不可缺操作系统不可缺少的重要组成部分。用户通常就是通过文件系统少的重要组成部分。用户通常就是通过文件系统同操作系统与硬件设备进行交互的。同操作系统与硬件设备进行交互的。 2.1 文件系统概述文件系统概述v
29、LinuxLinux可支持多种不同的文件系统,可用于不同存可支持多种不同的文件系统,可用于不同存储介质的文件类型包括储介质的文件类型包括ext2ext2、ext3ext3、vfatvfat、ntfsntfs、iso9660iso9660、RomfsRomfs、JFFSJFFS、JFFS2JFFS2和和NFSNFS等。等。vLinuxLinux是通过把系统支持的各种文件系统链接到一是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统个单独的树形层次结构中,来实现对多文件系统的支持的。的支持的。v为了对各类文件系统进行统一管理,为了对各类文件系统进行统一管理,Linux
30、Linux引入了引入了虚拟文件系统虚拟文件系统VFS(Virtual File System)VFS(Virtual File System)。 2.2 LinuxLinux根文件系统根文件系统 v一个嵌入式一个嵌入式LinuxLinux操作系统要能正常运行,除了需操作系统要能正常运行,除了需要移植要移植BootLoaderBootLoader和和LinuxLinux系统内核以外,还需要系统内核以外,还需要构建根文件系统。构建根文件系统。v根文件系统是一种特殊的文件系统。根文件系统是一种特殊的文件系统。 LinuxLinux根文根文件系统一般包括的子目录有件系统一般包括的子目
31、录有/bin/bin、/dev/dev、/etc/etc、/ /usrusr、/ /varvar、/ /usrusr/bin/bin等等,如下图所示:等等,如下图所示:v对其中的主要目录进行介绍。对其中的主要目录进行介绍。 29305.5.3 5.5.3 网络文件系统网络文件系统NFS(Network NFS(Network File System) File System) v网络文件系统网络文件系统NFS(Network File System)NFS(Network File System)是由是由SunSun公司于公司于19841984年推出并逐渐发展起来的一项在不同年推出并逐渐发展起
32、来的一项在不同机器、不同操作系统之间通过网络共享文件的技机器、不同操作系统之间通过网络共享文件的技术。利用术。利用NFSNFS可以将远程文件系统载入在本地文件可以将远程文件系统载入在本地文件系统下。远程的硬盘、目录和光驱都可以变成本系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。将远程文件系统地主机目录树中的一个子目录。将远程文件系统载入后,在本地与处理自己的文件系统一样使用载入后,在本地与处理自己的文件系统一样使用即可。不只方便,也节省了重复保存文件的空间即可。不只方便,也节省了重复保存文件的空间、传输文件的时间及网络带宽。、传输文件的时间及网络带宽。 31vNFS NFS 网络文件系统使用网络文件系统使用C/SC/S(Client/ServerClient/Server)客)客户机和服务器体系结构。使用户机和服务器体系结构。使用NFSNFS,需要在服务器,需要在服务器端设置输出,在客户端设置载入。服务器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高三下学期《遇见最美的时光我的人生满意度》主题班会课件
- 汽车使用与维护 课件 项目三 空调系统的使用与维护
- 2025年环保速冻喷剂项目可行性研究报告
- 江苏航运职业技术学院《食品类专业写作》2023-2024学年第一学期期末试卷
- 浙江省杭州市杭州第二中学2025年高三下第一次摸底考试历史试题试卷含解析
- 那曲市2024-2025学年初三下学期期末考试物理试题仿真(A)卷含解析
- 低压电器 课件 单元三 项目二 任务二 掌握三相异步电动机点动控制线路
- 无锡科技职业学院《统计学原理含统计软件应用》2023-2024学年第二学期期末试卷
- 江苏工程职业技术学院《ADR实务》2023-2024学年第二学期期末试卷
- 汕头大学《钢与组合结构设计》2023-2024学年第二学期期末试卷
- 旅行社企业章程范本
- 《预防未成年人犯罪》课件(图文)
- 煤矿岗位标准化作业流程
- 全国网信系统网络安全协调指挥技术系统建设指南
- 全合成水溶性线切割液配方
- ACLS-PC-SA课前自我测试试题及答案
- DB14∕T 2447-2022 建设项目环境影响后评价技术导则 生态影响类
- 冶金等工贸企业安全生产标准化达标信息管理系统[冶金等工贸企业安全生产标准化达标信息管理系统](-33)
- 英语话剧剧本<美女与野兽>
- 兰炭外热式回转炉低温干馏工艺及技术装备简介
- 拟投入本工程的主要施工设备表
评论
0/150
提交评论