




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档收集于网络,如有侵权,请联系网站删除第一章嵌入式的概念嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁减,功能、可靠性、成本、体积、功耗严格要求的专用计算机系统1. 嵌入式系统与PC机的区别嵌入式系统PC机引导代码BootLoader引导,针对不同电路板进行移植主板的BIOS进行引导,因此无需改动操作系统WinCE、VxWorks、Linux等,需要移植,操作系统经常和应用软件集成在一起(例:uc/os-ii)Windows、Linux等,不需要移植驱动程序每个设备驱动必须重新开发和移植,一般不能直接下载使用操作系统含有大多数驱动程序,从网上下载直接使用协议栈需要移植操作系统包括,或第三方提供开发环境借助服务器进行交叉编译,需要专门的开发工具和开发环境如arm-linux-toolchain.tar.gz,ADS在本机就可开发调试仿真器需要,用来支持程序下载和调试不需要2. 嵌入式的特征(1)嵌入式系统是专用的计算机系统,因此通常含有面向某种特定应用的嵌入式CPU。(2)嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合的产物,因此可以说嵌入式系统不从属于任何一门学科,但是却横跨了多门学科。(3)嵌入式系统的硬件和软件设计必须达到功耗低、体积小、集成度高、成本低的目标。(4) 嵌入式系统和具体应用有机的结合在一起,运行环境差异大,且具有较长的生命周期。(5)为了提高执行速度和系统可靠性,嵌入式软件系统一般都固化在非易失性存储器中。(6)嵌入式系统本身不具有自举开发能力,因此需要进行交叉编译,即必须有一套开发工具和环境才能进行开发。(7)嵌入式系统是软硬件可裁剪的专用计算机系统。而软硬件可定制也是嵌入式系统最具代表的特征之一4.嵌入式的应用5.简单的嵌入式系统与复杂的嵌入式系统简单嵌入式系统 系统的软、硬件复杂度都很低,硬件集成度低、系统资源种类少,没有操作系统的支持;如单片机系统和DSP系统等。复杂嵌入式系统(目前所说的嵌入式系统) 系统的软、硬件复杂度都很高,硬件集成度高(32位SoC为核心)、系统资源种类多(外部接口丰富),需要操作系统的支持(可实现多任务调度,支持TCP/IP协议等)。6.嵌入式的发展趋势n 嵌入式系统硬件集成发展-SoCn 嵌入式操作系统得到快速发展n 软件开发环境集成化、智能化和图形化n 与网络及通信的结合成为必然趋势 n Linux和JAVA技术对嵌入式软件的发展产生深远的影响。7.处理器的分类嵌入式微控制器,嵌入式微处理器,嵌入式数字信号处理器,嵌入式片上系统8.嵌入式的组成嵌入式系统(指包括操作系统的嵌入式平台)可分为嵌入式硬件系统和嵌入式软件系统硬件抽样层的作用:提高了系统的独立性和可移植性。硬件组成:嵌入式微处理器,存储器,输入输出设备,通信与扩展接口。第二章1.嵌入式处理器及体系结构(哈佛,冯诺依曼)冯.诺依曼结构计算机系统以存储程序原理为基础,由一个中央处理单元(CPU)和一个存储器组成。这个存储器存储全部的数据和指令,并且可以根据所给的地址(直接寻址方式)对其进行读写操作。数据和指令都存在一个存储器中的计算机被称为冯.诺依曼结构计算机,数据和指令是混合存储在计算机的存储器中特征:(1)使用单一处理部件来完成计算、存储及通信工作(2)使用一维线性组织的定长存储单元存储程序,且不区别指令集跟数据。(3)存储空间各单元有唯一定义的地址,访问采用直接寻址方式。(4)使用二进制机器语言,编程完成基本操作码的简单操作。(5)按指令在存储器中存放的次序顺序执行,程序分支有转移指令实现。哈佛体系结构的处理器:指令和数据空间是独立的,使用两个独立的存储器模块,分别存储指令和数据,主要指在单一的主存储器情况下,通过使用分离的指令高速缓存和数据高速缓存实现指令空间与数据空间的分离,通过这种方式,CPU可以在一个时钟周期内同时读取指令和操作数,实现并行处理,避免了数据与指令的存储器访问冲突,提高了运行效率。2. 复杂指令系统计算机CISCn 靠增强指令的功能,增加指令系统的复杂程度来提高计算机系统的性能。 。n 特点:1指令系统复杂庞大,指令数目一般有200300条。2.指令格式多,指令字长不固定,使用多种不同的寻址方式。3.可访存指令不受限制。4.各种指令的执行时间和使用频率相差很大RISC机与CISC机相比的主要优点 充分利用了VLSI芯片的资源。 结构简单,有利于处理器的优化设计 便于设计,降低了开发成本,提高了可靠性 可以使流水线能高效地执行. 3.ARM微处理器系列 ARM7微处理器系列 、ARM9微处理器系列 、ARM9E微处理器系列 、ARM10E微处理器系列 、/SecurCore微处理器系列 、/4StrongARM微处理器系列 、Xscale处理器 4. 处理器工作状态 有两种工作状态,并可在两种状态之间切换。 ARM状态: 处理器执行32位的、字对齐的ARM指令。 Thumb状态:处理器执行16位的、半字对齐的Thumb指令5. 7种处理器模式 l 用户模式(USR):ARM处理器正常程序执行的模式;l 快速中断模式( FIQ ):用于高速数据传输或通道处理; l 外部中断模式( IRQ ):用于通用的中断处理; l 特权模式或管理员模式(SVC):操作系统使用的保护模式;l 数据访问中止模式(ABT):用于虚拟存储器和存储保护;l 未定义指令中止模式(UND):用于支持硬件协处理器的软件仿真;l 系统模式(SYS):运行具有特权的操作系统任务。6.寄存器ARM处理器共有37个寄存器l 31个32位的通用寄存器(包括程序计数器PC);l 6个32位状态寄存器(1个专用于记录当前状态,5个用于备份记录状态切换前的状态),在32位中目前只使用12位异常异常是内部或外部源产生的、引起处理器处理的一个事件体系结构的特点()支持指令集,适合需要高速数字信号处理场合。()级超级流水线()支持为的高速总线接口()支持浮点处理器协处理器()全性能支持()支持数据高速缓存和指令高速缓存,具有更高的指令和数据处理能力()内嵌并行读写操作部件。第三章嵌入式中常见的语言现象宏定义采用宏定义可以减少程序中重复书写某些字符串的工作量;有助于防止出错,提高程序的可读性和可移植性。宏代换在预处理阶段完成volatile关键字,非优化如果变量被用volatile关键字修饰,就是告诉编译器不要对该变量的读写以及多个volatile变量读写的先后顺序进行优化;对其存取时不能使用寄存器中的备份,每次读必须重新访问相应的内存地址,每次写也须将结果立即写回。2.常见的嵌入式操作系统(1)VxWorks特点:高可靠性、高实时性和可裁减性。微内核结构,面向对象方法,开发工具功能强大、 它支持多种处理器,如x86、i960、Sun Sparc、Motorola MC68xxx、MIPS 、PowerPC(2)uC/OS-II作为一个实时操作系统,uC/OS-II的进程调度是按抢占式、多任务系统设计的,即它总是执行处于就绪队列中优先级最高的任务。 uC/OS-II将进程的状态分为5个:就绪状态(Ready)、运行(Running)、等待(Waiting)、休眠(Dormant)和中断ISR。特点:uC/OS-II不支持时间片轮转调度法,所以赋予每个任务的优先级必须是不同。优先级号越低,任务的优先级越高。它的基本代码尺寸不到5KB,对存储器容量要求低,满足了嵌入式系统对体积苛刻的要求,uC/OS-II应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等。uCOS-II的不足之处:n 只有多任务调度的简单内核n 内存管理过于简单,几乎没有动态内存管理功能n 文件系统和图形界面需要外挂n 对于设备驱动程序没有专门统一的接口(3)Windows CEWindows CE是微软公司为开发各类通信息设备而开发出来的一个嵌入式弱实时操作系统。特点:Windows CE的内核提供内存管理、抢先多任务和中断处理功能。内核的上面是图形用户界面GUI和桌面应用程序。多线程、完整优先权、多任务的操作系统。适合作为可裁减的32位嵌入式操作系统。WinCE既适用于工业设备的嵌入式控制模块,也适用于消费类电子产品。允许每个进程有256个优先级,采用抢占式优先权调度法。Windows CE内核至少约为200KB的ROM(4)linux主要特点:n 开放源代码,不存在黑箱技术。n 内核小、功能强大、运行稳定、效率高。n 开放源代码的操作系统易于定制裁减,在价格上极具竞争力。n 不仅支持X86CPU,还可支持其他数十种CPU芯片。n 有大量的且不断增加的开发工具和开发环境。n 沿用了Unix的发展方式,遵循国际标准,可方便的获得众多第三方软硬件厂商的支持。n Linux内核的结构在网络方面是非常完整的,提供了对十兆、百兆、千兆以太网、无线网络、令牌网、光纤网、卫星等多种联网方式的全面支持。此外在图像处理、文件管理及多任务支持诸多方面也都非常出色。常见的嵌入式操作系统还有QNX、Nucleus Embedded、ThreadX、eCos、PalmOS、Symbian等等。第四章1.嵌入式Linux简介(1)自制嵌入式Linux系统:就是在Linux标准内核源码的基础上,根据所选定的硬件平台和所需要的功能,对标准内核进行适当的裁剪、修改,并制作相应的文件系统以构成自制嵌入式Linux系统的基础;再将设计或下载的应用程序移植到制作好的嵌入式Linux中,就构成了完整的自制嵌入式Linux软件系统。(2)商业版嵌入式Linux有专门的系统软件开发商技术支持,其软件更丰富、技术文档更多、软件更新和错误问题解决也更快,但费用相对较高。Linux的内核版与发行版:Linux为内核版+许多应用程序=发行版Linux操作系统结构n Linux的源代码一般在/usr/src/Linux-*.*.*(*.*.*代表内核版本,如2.4.20)。目标板的移植好的内核源码在XSBase270/Kernel。3. Linux的目录树结构在Linux下只有一个根目录,系统启动后 ,磁盘上的所有文件系统被加载安装到以“/”为根目录的文件树上,在linux中,所有的目录,文件和硬件都以文件形式挂接在树上。这个特点简化了文件的访问,所有的文件目录都可以从树根”/”查找到。4. Linux的启动过程:主要是引导加载程序,linux内核,文件系统挂载这3方面。即操作系统的启动为后面应用程序的运行打下基础嵌入式Linux主要分4个层次:引导加载程序,linux内核,文件系统,用户应用程序。Linux的启动过程是指上电到系统的第一个进程建立起来的整个过程。5. 驱动程序(就是内核模块)的编写-驱动程序放于内核的Driver中内核模块结构1、dri_arch.c模块加载实验编写实验代码#include #include / 声明是一个模块#include #include #include static int _init dri_arch_init_module(void)/ 加载本驱动是执行printk(This is a simple driver-module!rn);return 0;static void _exit dri_arch_cleanup_module(void)/ 卸载驱动时执行printk(Goodbye driver-module!rn);module_init(dri_arch_init_module);module_exit(dri_arch_cleanup_module);编译make使用Makefile 文件CC =/opt/xscalev1/bin/arm-linux-gccINCLUDEDIR = /XSBase270 /Kernel/linux-2.4.21-51Board_EDR/includeCFLAGS = -D_KERNEL_ -DMODULE -Wall -O2CFLAGS += -I. -I$(INCLUDEDIR)DEBUG =TARGET = dri_archOBJS = $(TARGET).oSRC = dri_arch.cAll: dri_arch.odri_arch.o: dri_arch.c$(CC) $(CFLAGS) $(DEBUG) -c -o dri_arch.o dri_arch.cclean :rm -rf *.o下载目标代码到目标板,具体的操作参考使用手册相关部分挂载目标代码,并查看输出调试信息,本次相关操作均要求到下载的当前目录(含dri_arch.o)$insmod dri_arch.o (挂载dri_arch)$lsmod (查看当前已挂载模块,会看到dri_arch)$dmesg (查看模块输出信息:This is a simple driver-module!)$rmmod dri_arch (卸载dri_arch)$lsmod (查看当前已挂载模块,不再看到dri_arch)$dmesg (查看模块输出信息:Goodbye driver-module!)编写一个简单的字符设备驱动程序。要求该字符设备包括scull_open(),scull_write(),scull_read(),scull_ioctl()和scull_release()5个基本操作,还应再编写一个测试程序来测试用户所编写的字符设备驱动程序。1、驱动程序模块源代码 chrdev.c#include #include #include #include #include #include #include #include #include struct scull_dev void *data; int quantum; / 当前容量的大小。 int qset; / 当前数组的大小。 unsigned long size; unsigned int access_key; / 由sculluid 和scullpriv 使用的存取字段。 unsigned int usage; /当字符设备正使用时加锁。unsigned int new_msg; struct scull_Dev *next; / 指向下一字符设备 ;struct scull_dev scull; MODULE_LICENSE(GPL); static int scull_open(struct inode *inode,struct file *file) MOD_INC_USE_COUNT; / 增加该模块的用户数目 printk(This chrdev is in open! n); return 0; static ssize_t scull_write(struct file *file, char *buf,size_t count,loff_t *offset) if(count0) return -EINVAL; if(scull.usage | scull.new_msg) return -EBUSY; scull.usage = 1; kfree(scull.data); / 要用 代替 scull.data = kmalloc(sizeof(char)*(count+1),GFP_KERNEL); if(!scull.data) return -ENOMEM; copy_from_user(scull.data,buf,count+1); /用户空间 至 内核空间 scull.usage = 0; scull.new_msg = 1; return count; static ssize_t scull_read(struct file *file, char *buf,size_t count,loff_t *offset) int length; if(count0) return -EINVAL; if(scull.usage) return -EBUSY; scull.usage = 1; if(scull.data = 0) return 0; length = strlen(scull.data); if(length count) count = length; copy_to_user(buf,scull.data,count+1); scull.new_msg = 0; scull.usage = 0; return count; #define SCULL_MAJOR 42 #define SCULL_MAGIC SCULL_MAJOR #define SCULL_RESET _IO(SCULL_MAGIC,0) / 重置数据 #define SCULL_QUERY_NEW_MSG _IO(SCULL_MAGIC,1) /检查新的消息#define SCULL_QUERY_MSG_LENGTH _IO(SCULL_MAGIC,2) /获取消息长度#define IOC_NEW_MSG 1static int usage,new_msg; /控制标志static char *data;static int scull_ioctl(struct inode *inode,struct file *file,unsigned long int cmd,unsigned long arg) int ret=0; switch(cmd) case SCULL_RESET:kfree(data); data = NULL; usage = 0; new_msg = 0; break; case SCULL_QUERY_NEW_MSG:new_msg=scull.new_msg;if(new_msg) return IOC_NEW_MSG; break; case SCULL_QUERY_MSG_LENGTH: data=scull.data;if(data = NULL) return 0; else return strlen(data); break;default: return -ENOTTY; return ret; static int scull_release(struct inode *inode,struct file *file) MOD_DEC_USE_COUNT; / 该模块的用户数目减1 printk(This chrdev is in releasen); return 0; static struct file_operations scull_fops = .owner=THIS_MODULE,.read=scull_read,.write=scull_write,.ioctl=scull_ioctl,.open=scull_open,.release=scull_release,;static int _init scull_init_module( void ) int ret;printk(Scull char Driver.n);ret = register_chrdev(42, chrdev, &scull_fops); /注册设备,主设备号为42if (ret 0) printk(Unable to register character device!n); return ret; printk(device registered with major %dn,ret);return 0;static void _exit scull_cleanup_module( void ) int ret; ret = unregister_chrdev(42, chrdev); if (ret 0) printk(Unable to unregister character device!n); else printk(Scull Test Driver unloaded!);module_init(scull_init_module);module_exit(scull_cleanup_module);2、编译make使用Makefile 文件CC =gccINCLUDEDIR = /usr/src/linux-2.4.20-8/includeCFLAGS = -D_KERNEL_ -DMODULE -Wall -O2CFLAGS += -I. -I$(INCLUDEDIR)DEBUG =TARGET = dri_archOBJS = $(TARGET).oSRC = dri_arch.cAll: dri_arch.odri_arch.o: dri_arch.c$(CC) $(CFLAGS) $(DEBUG) -c -o dri_arch.o dri_arch.cclean :rm -rf *.o3、加载模块,并创建文件节点,以便用户程序使用,命令如下Insmod chrdev.oMknod/dev/chrdevc420 dmesg4、编写测试的用户程序源代码如下: (1)chrdev 头文件#ifndef _DYNCHAR_DEVICE_H#define _DYNCHAR_DEVICE_H#include #define DYNCHAR_MAJOR 42#define DYNCHAR_MAGIC DYNCHAR_MAJOR#define DYNCHAR_RESET _IO(DYNCHAR_MAGIC,0) / 重置数据#define DYNCHAR_QUERY_NEW_MSG _IO(DYNCHAR_MAGIC,1) / 检查新的消息#define DYNCHAR_QUERY_MSG_LENGTH _IO(DYNCHAR_MAGIC,2) / 获取消息长度#define IOC_NEW_MSG 1#endif (2)testproc.c文件 #include #include #include #include #include #include #include #include #include #include chrdev.h void write_proc(void); void read_proc(void);main(int argc,char *argv) if(argc = 1) puts(Usage: testprocwrite|readn); exit(0); if(!strcmp(argv1,write) write_proc(); else if(!strcmp(argv1,read) read_proc(); else puts(testproc: invalid command!n); return 0; void write_proc() int fd,len,quit = 0; char buf100; fd = open(/dev/chrdev,O_WRONLY); if(fd = 0) printf(Error opening device for writing!n); exit(1); while(!quit) printf(n Please write into:); gets(buf); if(!strcmp(buf,exit) quit = 1; while(ioctl(fd,DYNCHAR_QUERY_NEW_MSG) usleep(100); len = write(fd,buf,strlen(buf); if(len 0) printf(Error writing to device!n); close(fd); exit(1); printf(n There are %d bytes written to device!n,len); close(fd); void read_proc() int fd,len,quit = 0; char *buf = NULL; fd=open(/dev/chrdev,O_RDONLY); if(fd 0) printf(Error opening device for reading!n); exit(1); while(!quit) printf( Please read out:); while(!ioctl(fd,DYNCHAR_QUERY_NEW_MSG) usleep(100); len = ioctl(fd,DYNCHAR_QUERY_MSG_LENGTH,NULL); / 获取消息长度。 if(len) if(buf != NULL) free(buf); buf = malloc(sizeof(char)*(len+1); len = read(fd,buf,len); if(len 0) printf(Error reading from device!n); else if(!strcmp(buf,exit) ioctl(fd,DYNCHAR_RESET); / 字符设备复位 quit = 1; else printf(%sn,buf); free(buf); close(fd); 5、编译测试程序 gcc g testproc.c o testproc6、运行testproc程序,记录结果,命令分别为:./ testproc write./ testproc read第五章1.Gcc的4阶段:预处理,编译,汇编,链接#gcc E hello.c 预处理完就停止#gcc S hello.c 编译完为止#gcc c hello.c 做前三步到汇编完#gcc hello.c o hello 四步完,生成可执行文件2.Makefile的编写#Sample Makefilemyprog:main.o display.o input.ogcc main.o display.o input.o o myprogmain.o:main.c common.hgcc c main.cdisplay.o:display.c display.h common.hgcc c display.cinput.o:input.c input.h common.hgcc c input.cclean:rm f mypro main.o display.o input.o利用makefile文件用编程实现:输入圆的半径(input.c),计算圆面积(main.c),显示圆面积(display.c),对应的各个.h文件自己安排。1. makefile内容如下CC = gccOBJS = main.o display.o input.omyprog: $(OBJS)$(CC) $(OBJS) -o $main.o: main.c common.h$(CC) -c $display.o: display.c display.h common.h$(CC) -c $input.o: input.c input.h common.h$(CC) -c $clean:rm -f myprog $(OBJS)2. common.h内容如下:#ifndef PI#define PI 3.141592653#endifdisplay.h内容如下:#ifndef _DISPLAY_H_#define _DISPLAY_H_#include #include common.hvoid display(double result); #endif4.input.h内容如下:#ifndef _INPUT_H_#define _INPUT_H_#include #include common.hvoid input(double *radius);#endif3.基本 gdb 命令file 装入想要调试的可执行文件. kill 终止正在调试的程序. list 列出产生执行文件的源代码的一部分. next 执行一行源代码但不进入函数内部. step 执行一行源代码而且进入函数内部. run 执行当前被调试的程序 quit 终止 gdb watch 使你能监视一个变量的值而不管它何时被改变. break 在代码里设置断点, 这将使程序执行到这里时被挂起. print 查看变量make 使你能不退出 gdb 就可以重新产生可执行文件. shell 使你能不离开 gdb 就执行 UNIX shell 命令. 第6 章1.交叉开发模式交叉编译器(Cross-compiler):是一种运行在通用计算机上的、但是能够生成在另一种处理器上运行的目标代码的编译器。 例如:/opt/XScalevl/bin/arm-linux-gcc交叉开发:在一台通用计算机上进行软件的编辑、交叉编译,然后下载到嵌入式系统中交叉调试、运行。2.嵌入式Linux系统的开发流程使用如下的cat 命令来检查CD-ROM 是否被正确挂载。rootroot # cat /proc/mounts | grep cdrom/dev/cdrom /mnt/cdrom iso9660 ro,nosuid,nodev 0 03.配置工具#make config是基于文本的、最为传统基于字符的配置界面。#make menuconfig是基于文本菜单的配置界面字符终端下推荐使用文本模式图形用户界面#make xconfig,基于X windows 图形界面的用户配置界面44.内核裁剪,为什么要裁减内核n 自己定制编译的内核运行更快(具有更少的代码)n 系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)n 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞n 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些5.根文件系统的构造6.根文件系统的描述VFS将文件系统(目录结构)分为两个不同的部分:一个是由操作系统提供的文件系统,称为基本文件系统(根文件系统);另一个是由用户提供的子文件系统,称为附加文件系统。基本文件系统是整个文件系统的基础,固定于根存储设备上。各个子文件系统存储于可装卸的存储介质上,比如软盘、移动硬盘、U盘等等。系统启动运行后,基本文件系统不能拆卸,而子文件系统则可以随时装载和拆卸。根文件系统就是一种目录结构,那么根文件系统和普通的文件系统有什么区别呢?根文件系统就是要包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux系统启动所必须的文件都可以成为根文件系统。根文件系统是第一个mount的文件系统。根文件系统可以是ext2格式的,也可以是ROMFS,JFFS2,NFS,CRAMFS第七章1.应用程序的移植:将应用程序从一种运行平台(如PC)下转移到另一种运行平台(如ARM)下运行。为何需要移植:1、在Linux系统有许多应用程序,如果将这些有需要的、现成的应用程序移植到嵌入式系统中则可以大大加快开发的进度,提高开发的效率。2、为了开发方便,先在宿主机上开发应用程序,当调试运行成功后,再将其移植到目标开发板上。2.Web控制接口与应用Web服务器与浏览器之间通信所用的HTTP协议位于TCP/IP协议的第五层应用层,它基于面向链接的TCP协议,实现客户与服务器之间的请求/响应模式,每个TCP链接只处理一个HTTP请求。嵌入式中可以对协议进行适当的裁剪,不仅可以简化HTTP处理的过程,提高效率,也可以缩小Web服务器占用的空间。3.boa的移植,Boa 程序的移植 rootlocalhost work$tar xv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海化学区管理办法
- 福建专家费管理办法
- 专家咨询法管理办法
- 湛江社保卡管理办法
- ota升级管理办法
- 福州可垂钓管理办法
- 校服管理办法中学版
- 生鲜店采购管理办法
- 现场不良品管理办法
- 高铁站长管理办法
- 2025版本的房屋征收补偿协议
- 2025年人力资源管理师(高级)考试真题卷冲刺版含答案
- 口腔门诊消毒护理岗位职责
- 2025至2030中国消防产业市场深度调研及发展前景及有效策略与实施路径评估报告
- 节假日客流特征分析-洞察及研究
- 客服素质类培训
- 粤语文化课件教学
- 2025至2030年中国铈锆固溶体行业市场研究分析及投资前景评估报告
- DZ/T 0275.5-2015岩矿鉴定技术规范第5部分:矿石光片鉴定
- T/ZGZS 0909-2023退役光伏组件梯次利用通用规范
- 《中国恶性肿瘤整合诊治指南-直肠癌(2024版)》解读课件
评论
0/150
提交评论