嵌入式课程设计有操作系统的嵌入式系统软件开发_第1页
嵌入式课程设计有操作系统的嵌入式系统软件开发_第2页
嵌入式课程设计有操作系统的嵌入式系统软件开发_第3页
嵌入式课程设计有操作系统的嵌入式系统软件开发_第4页
嵌入式课程设计有操作系统的嵌入式系统软件开发_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、目 录第一章课程设计的任务说明11.1课程设计的目的11.2课程设计的要求1第二章有操作系统的嵌入式系统软件开发概述22.1有操作系统的软件开发流程22.2有操作系统的软件运行模式2第三章linux操作系统简介6第四章uclinux操作系统简介7第五章开发环境的建立85.1建立主机linux平台85.2安装交叉编译工具12第六章uclinux裁剪与编译136.1uclinux裁剪136.2uclinux编译15第七章操作系统下多任务应用程序开发167.1操作系统下多任务应用程序的开发流程167.2操作系统下多任务应用程序的开发环境167.3操作系统下多任务应用程序的开发177.3.1编写串口、

2、led应用程序177.3.2添加应用程序至内核并随内核编译18总 结23参考文献24第一章课程设计的任务说明1.1课程设计的目的(1) 了解有操作系统的嵌入式系统软件开发流程;(2) 了解linux操作系统的基本知识;(3) 熟悉linux操作系统的常用命令;(4) 掌握linux操作系统的vi编辑器用法;(5) 掌握linux操作系统的gcc编译器用法;(6) 了解uclinux操作系统的基本知识;(7) 掌握uclinux操作系统内核编译环境的建立;(8) 熟悉uclinux内核编译步骤;(9) 掌握将编译好的内核下载到系统运行的步骤;(10)掌握uclinux多任务编程与自启动。1.2课

3、程设计的要求(1)掌握课程设计所涉及到的相关知识。(2)拓宽和加深学生对已学过的理论知识的理解,从而掌握比较全面的专业知识。(3)进一步熟悉嵌入式系统软件开发流程,深刻地理解嵌入式系统原理和相关接口电路的实现。(4)按照要求撰写课程设计报告。第二章有操作系统的嵌入式系统软件开发概述2.1有操作系统的软件开发流程嵌入式操作系统及应用软件的开发流程如图2-1所示。.rom从linux转出从windows转入共享文件夹bootloaderarm-elf-tools交叉编译工具uclinux源代码ads应用程序2.bin特殊功能寄存器sdramflashred hat linuxvmware共享文件夹

4、ads0x00x1 0000应用程序1图2-1有操作系统的软件开发流程由图可知,在开发嵌入式操作系统及应用软件之前,应首先将操作系统引导程序烧写到flash的起始地址0x0处,当系统初始化完了之后,应当跳转到操作系统的起始地址0x1 0000处,而不是应用程序的入口处。2.2有操作系统的软件运行模式在运行有操作系统的嵌入式系统中,主要包含了bootloader引导程序、操作系统和应用程序这三类的程序。其中,引导程序是嵌入式软件系统中必不可少的部分,在引导程序运行完成后,嵌入式系统的硬件被设置到合适的状态,从而引导操作系统运行。操作系统启动后,才能进一步运行应用程序。这三种程序的不同组成方式和运

5、行方式就形成了不同的软件运行模式。他们就可以分为如表2-1所示的4种模式。表2-1有操作系统的嵌入式软件模式编 号模式abootloader直接引导操作系统,操作系统与应用程序一起编译,应用程序不自启动。bbootloader直接引导操作系统,操作系统与应用程序一起编译,应用程序自启动。cbootloader直接引导操作系统,操作系统与应用程序分开编译,应用程序通过网口等下载至sdram中。dbootloader启动后显示菜单,手动引导操作系统。(1)bootloader启动之后直接引导操作系统运行,应用程序编译在操作系统的romfs文件系统中,操作系统启动后并不能自动运行应用程序,而是根据需

6、要手动运行或者由其他程序调用。0x000 00000x001 00000x100 00000x120 00000x3ff 00000x3ff ffff64 mb16 mb2 mb64 kbbootloader启动后的编址空间特殊功能寄存器组还没有和物理设备建立映射的区域flashsdram操作系统引导程序应用程序图2-2有操作系统的运行模式a在该模式下,bootloader在完成系统初始化工作后,修改pc指针,直接跳到操作系统image.rom开始的地址处,引导操作系统运行。而应用程序和操作系统是一起编译在image.rom里面,操作系统启动之后,应用程序放在/bin目录下,后是应用程序还需要

7、手动运行,如图2-2所示。(2)bootloader启动之后直接引导操作系统运行,应用程序编译在操作系统的romfs文件系统中,操作系统启动之后自动运行应用程序,如图2-3所示。16 mb0x000 00000x001 00000x100 00000x120 00000x3ff 00000x3ff ffff64 mb2 mb64 kbbootloader启动后的编址空间特殊功能寄存器组还没有和物理设备建立映射的区域flashsdram操作系统引导程序应用程序图2-3有操作系统的运行模式b在该模式下,bootloader在完成系统初始化工作后,修改pc指针,直接跳到操作系统image.rom开始

8、的地址处,引导操作系统运行。操作系统启动完毕之后,会自动执行应用程序,主要是通过ulinux-dist/vendors/samsung/4510b/rc文件中添加系统启动后自动执行应用程序的的命令来实现:./bin/led&./bin/uart&命令后面的&符号表示在后台执行程序。(3)bootloader启动之后直接引导操作系统运行,应用程序和操作系统单独编译。操作系统启动完毕之后,通过网络等通信方式将应用程序下载到操作系统文件夹中,如/var/tmp,再手动运行应用程序。该方式常用于调试应用程序,如图2-4所示0x000 00000x001 00000x100 00

9、000x120 00000x3ff 00000x3ff ffff64 mb16 mb2 mb64 kbbootloader启动后的编址空间特殊功能寄存器组还没有和物理设备建立映射的区域flashsdram操作系统引导程序应用程序图2-4有操作系统的运行模式c该模式下,bootloader在完成系统初始化工作后,修改pc指针,直接跳到操作系统image.rom开始的地址处,引导操作系统运行。而image.rom映射文件里面并未包含应用程序,操作系统启动之后,通过网口、串口等方式将单独编译生成的应用程序下载至操作系统的可写入目录(如/var/tmp)中,再手动运行。这种方式适合应用程序调试,不需要

10、每次修改应用程序都重新编译和烧写操作系统。(4)bootloader初始化完毕之后,并不是直接引导操作系统执行,而是进入到一个命令行界面中,可以输入相应命令进行操作,也可以引导操作系统。如u-boot在初始化完毕之后,进入命令界面,用户可通过相应命令,来控制系统通过串口或网口下载文件、烧写flash存储器、测试存储器等操作,如图2-5所示。0x000 00000x001 00000x100 00000x120 00000x3ff 00000x3ff ffff64 mb16 mb2 mb64 kbbootloader启动后的编址空间特殊功能寄存器组还没有和物理设备建立映射的区域flashsdra

11、m应用程序操作系统引导程序图2-5有操作系统的运行模式d在该模式下,bootloader的功能已经不再限于系统的初始化程序。目前常用的几种通用bootloader均提供了复杂的命令接口,可在bootloader中对硬件进行大量操作,已经相当于一个微型操作系统。第三章linux操作系统简介linux是一种计算机操作系统和它的内核的名字。它也是自由软件和开放源代码发展中最著名的例子。严格来讲,linux这个词本身只表示linux内核,但在实际上人们已经习惯了用linux来形容整个基于linux内核,并且使用gnu 工程各种工具和数据库的操作系统(也被称为gnu/linux)。基于这些组件的linu

12、x软件被称为linux发行版。一般来讲,一个linux发行套件包含大量的软件,比如软件开发工具,数据库,web服务器(例如apache),x window,桌面环境(比如gnome和kde),办公套件(比如openo),等等。 linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说linux是基于unix的,很大程度上也是因为这两者的基本思想十分相近。linux内核最初是为英特尔386微处理器设计

13、的。现在linux内核支持从个人电脑到大型主机甚至包括嵌入式系统在内的各种硬件设备。linux的内核精简而高效,其内核的核心部分小到一张软盘就可以装下,通过对不需要功能的裁剪,linux内核完全可以小到100kb以下。在嵌入式环境下的资源是非常有限的,所以操作系统的目录树中的所有文件都应该是系统需所必须的的文件,避免浪费的储存空间。linux的romfs文件新添的根目录结构如图3-1所示。/bin/dev/etc/lib/pro/sbin/tmp/usr/var图3-1romfs文件结构第四章uclinux操作系统简介uclinux是一个完全符合gun/gpl公约的操作系统,开放源代码。它原本

14、被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。uclinux正是在这种氛围下产生的。在uclinux这个英文单词中u表示micro,小的意思,c表示control,控制的意思,所以uclinux就是micro-control-linux,字面上的理解就是"针对微控制领域而设计的linux系统"。 uclinux是一种优秀的嵌入式linux版本,是micro-conrol-linux的缩写。它秉承了标准linux的优良特性。他的专门针对没有mmu的cpu,并且经过各方面的小型化改造,为嵌入式系统做了许多小型化的工作,形成了一个高度优化

15、的、代码紧凑的嵌入式linux。虽然它的体积很小,却仍然保留了linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持和标准丰富的api。其编译后目标文件可控制在几百kb数量级,并已经被成功地移植到很多平台上。uclinux的架构与标准linux基本相同,只是对内存管理和进程管理进行了改写,以满足无mmu处理器的要求。uclinux针对没有mmu的处理器进行设计,不能使用处理器的虚拟内存管理技术,直接通过物理地址访问存储器,系统进程和用户也是运行在同一个存储空间。uclinux的基本构架如图4-1所示。文件系统内核初始化bootloader系统调用处理函数c库函数

16、捕获handler调度器虚拟文件系统管理模块socket驱动网络模块文件系统模块字符设备驱动块设备驱动mass存储设备驱动网络设备驱动驱动进程管理模块内存管理模块图4-1uclinux的基本构架uclinux的架构与标准linux基本相同,只是对内存管理和进程管理进行了改写,以满足无mmu处理器的要求。uclinux针对没有mmu的处理器进行设计,不能使用处理器的虚拟内存管理技术,直接通过物理地址访问存储器,系统进程和用户进程也是运行在同一个存储器空间。第五章开发环境的建立5.1建立主机linux平台建立交叉开发环境的第一步,是建立一个linux平台来对应用程序和内核进行编译,这里使用虚拟机软

17、件vmware和red hat linux来搭建一个在windows环境下运行的linux平台。具体步骤如下:(1) 在pc上安装并运行vmware,选择new virtual machine命令新建虚拟机,选择custom自定义选项,如图5-1所示。 图5-1虚拟机的安装过程(1)(2) 单击“下一步”按钮,选择linux版本为red hat linux,为操作系统选择名字和安装路径,如图5-2所示。 图5-2虚拟机安装过程(2)(3) 为系统选择内存,一般为256mb,在此我们采用的512mb,网络连接类型选择第一种,如图5-3所示 图5-3虚拟机安装过程(3)(4) io adpator

18、类型选择buslogic,选择create a new virtual disk,如图5-4所示。 图5-4虚拟机安装过程(4)(5) 选择scsi,从硬盘分出4gb的容量,给linux使用,如图5-5所示。 图 5-5虚拟机的安装过程(5)(6) 定义虚拟机文件名,此时一个新的virtual machine就这顶完成了。接下来开始安装red hat linux,这里介绍利用iso文件安装的方式,先将iso文件装在进linux的光驱,在图5-6所示的cdrom选项上双击后,选择硬盘的iso安装文件。 图5-6虚拟机的安装过程(6)在虚拟机软件执行start this virtual machi

19、ne,系统启动linux安程序,如图5-7所示。按照提示安装linux,采用默认选项即可。图 5-7开始安装red hat linux由于linux与windows采用不同的文件系统,一般在linux下无法直接访问windows的硬盘分区,而以后的实验需要在linux和windows之间进行文件交换,因此有必要在linux虚拟机和windows主机之间建立一个共享文件夹。首先启动虚拟机,进入系统后选中菜单vminstall vmware tools,之后在linux的桌面会出现一个名为vmware-tools的文件夹,如图5-8所示。如果没有自动出现这样的文件夹,可以采用u盘等途径将vmwar

20、e安装目录里面的linux.iso文件复制到linux系统下,挂载此文件即可。图5-8安装vmware tools由于光驱文件夹是不可写的,因此需将vmware tools-5.5.1-19175.tar.gz复制到可写目录里,在输入命令#tar xzvf vmware tools-5.5.1-19175.tar.gz解压到当前目录的vmware-tools distrib文件中,运行其中的vmware install.pl文件开始安装。安装完毕后,在/mnt目录下会自动建立一个名为hgfs的文件夹,通过这个目录,就可以在linux下访问对应的windows文件夹。进入vmsetting,在o

21、ptions选项卡下选择share folders,单击add指定一个windows下文件夹作为与linux的共享文件夹,如图5-9所示。这样在linux下的/mnt/hgfs目录中,就可以访问到这里指定的windows目录,并可以进行读/写操作。图5-9设定共享目录5.2安装交叉编译工具交叉编译是在一个平台上生成另一个平台上的可执行代码。使用交叉编译工具有很多种原因,有时是因为目标平台上不允许或者不能安装所需的编译器;有时是因为目标平台资源贫乏,无法运行所需要编译器;有时是因为目的平台还没有建立,连操作系统都没有,根本无法运行编译器。交叉编译概念的出现和流行是和嵌入式系统的广泛发展同步的。目

22、前常用的计算机软件,都是需要通过编译的方式,把实验高级计算机语言编写的代码(如c代码)编译成计算机可以识别和执行的二进制代码。例如在windows平台上,可以使用visual c+开发环境,编写程序并编译成可执行程序。然而嵌入式系统开发中,运行程序的目标平台通常具有有限的存储空间和运算能力,如arm平台,其一般的静态存储器大概是1632mb,而cpu的主频大概在50500mhz之间。这种情况下,在arm平台上很难进行本机编译。要进行交叉编译,需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译源代码,再生成可在目标平

23、台上运行的代码。常见交叉编译例子如下:(1)在windows pc上,利用ads(arm开发环境),使用armcc编译器,可编译出针对arm cpu的可执行代码。(2)在linux pc上,利用arm-elf-tools编译器,可编译出针对uclinux平台的可执行代码uclinux的开发环境采用了gnu开发套件,早期的开发工具需要分别从gnu网络下载并安装,如arm-elf-binutils-2.11-s.i386.rpm、arm-elf-gcc-2.95.3-2.i386.rpm、arm-elf-gbd-5.0-1.i386.rpm等软件,现在,通过安装一个集成工具包,就可以完成软件开发环

24、境的配置。第六章uclinux裁剪与编译实验板所用的uclinux-wsdist.tar.gz内核源代码已经针对硬件配置进行了相应的修改,使用前需要执行相应的编译命令,才能生成可执行的内核映像文件。uclinux是一个功能完善且高度可定制的嵌入式操作系统,并且有图形化的裁剪工具,使得裁剪工程就像windows下的软件定制安装一样简单。如果只保留必要的模块,编译生成的压缩内核image.rom只有240kb左右,不压缩内核image.rom也只有490kb左右,可以运行只有512kb ram的系统。uclinux的裁剪包括厂商产品选择,内核版本选择,运行库选择,内核配置和厂商用户程序配置5步。配

25、置的本质是通过make工具来设置源代码中各级目录下配置文件和make文件的宏定义,为下一步的编译提供前提。流程如图6-1所示。编译uclinux包括7个命令,每一步的编译时间都比较长,为了节约等待时间可以将这几个命令放在一个shell文件里面,批处理完成编译过程。输入make menuconfig配置命令厂商产品选择linux内核选择库函数选择uc-libc内核选择厂商/用户选择编译uclinux保存配置退出图6-1uclinux裁剪编译流程图6.1uclinux裁剪在linux虚拟机下新建命令终端,进入uclinux内核目录/ uclinux-dist,在编译之前首先查内核的配置:输入命令#

26、make menuconfig会出现如图6-2所示的界面。图6-2内核配置菜单对内核进行裁剪,选中customize kernel settings选项,保存并退出,内核保存一些配置以后会进入到内核定制菜单,如图6-3所示图6-3定制用户程序对用户程序进行裁剪,在界面中选中customize vendors/user settings选项,保存并退出,进入用户程序定制裁剪,如图6-3所示。这里一共有11个选项,每一个选项又有很多子程序。每一个子程序都是一个应用程序,用户可以根据系统的作用选择相应程序,表6-1列出了用到的选项,其他的选项均不选。表6-1用户程序定制选项序号选项选择情况( 1 )

27、core application选择init、enable consoles hell、expand及子菜单的expand should not write zeros( 2 )filessystem application不选( 3 )network application选择arp、boa、ifconfig、inetd、ping、ftp( 4 )miscellaneous application不选( 5 )busybox选择basename、insmod、hostname、pset 2.1 kenerel modules6.2uclinux编译完成内核的配置后,依次输入表6-2所示命令,

28、开始对内核进行编译.表6-2内核编辑命令步骤编号命令作用1make dep读取配置过程生成配置文件,创建对应于配置的依赖关系树,从而决定哪些需要编译,哪些不需要编译,并正确设置需要的头文件2make clean删除以前编译内核时留下的各种文件,以避免出现一些错误3make lib-only编译库文件4make user-only编译用户应用程序文件5make romfs建立romfs文件系统下文件目录6make image生成可以烧写到flash并运行image.rom内核映像文件7make编译完成后,在uclinux-dist/images下会生成图6-4所示的三个文件。图6-4编译生成的映

29、像文件第七章操作系统下多任务应用程序开发虽然在无操作系统时,也可以通过中断、查询等手段实现多个任务同时运行,但在有操作系统下更容易地实现和管理多个任务,事实上,操作系统下的单任务和多任务的开发流程是相同的,而且有丰富的库函数支持,开发难度更低,程序也具有更强的可移植性和可重用性。本课题的任务主要是实现闪灯程序和串口打印程序的开发,以此掌握操作系统下多任务软件开发的方法。7.1操作系统下多任务应用程序的开发流程开发流程如表7-1所示。表7-1 操作系统下应用程序开发步骤步骤1编写程序源代码步骤2添加应用程序至内核添加程序文件至内核源代码目录中为程序文件建立makefile文件修改内核makefi

30、le文件修改内核配置文件config.in修改内核rc文件设置程序为自启动步骤3编译内核步骤4下载至内核至flsh存储器操作系统下多任务软件开发流程如图7-1所示。编写源程序使用codewarrior编译程序硬件调试将源文件添加到内核将.bin、.rom文件加载到flash将bootloader编译成.bin文件固化成功,实现自启动剪裁后编译生成.rom文件图7-1多任务软件开发流程7.2操作系统下多任务应用程序的开发环境(1)pc一台(indows xp/2000/98,虚拟机inux系统);(2)实验板一个(附电源线一根);(3)网线一根;(4)串口线一根;(5)超级终端程序;(6)虚拟机

31、运行linux操作系统(red hat linux 8.0以上);(7)软件资源为pc linux操作系统,uclinux内核编译工具arm-elf-tools-20030314.sh,uclinux内核源代码uclinux-wsdist.tar.gz、ads集成开发环境。7.3操作系统下多任务应用程序的开发7.3.1编写串口、led应用程序首先在linux下编写应用程序源代码led.c、uart.c,分别实现闪灯和向超级终端发送字符的功能。led.c源代码如下:#define iopmod (*(volatile unsigned *)0x03ff5000) #define iopdata(

32、*(volatile unsigned *)0x03ff5008) void delay(int i);int main(void)iopmod=0x0ffffffff; /设置gpio口为输出while(1)iopdata=0x0f; /点亮2个leddelay(100000);/延时iopdata=0x00;/熄灭leddelay(500000);/延时return 0;void delay(int i)int j,k;for(j=0;j<i;j+)k=0;uart.c的源代码如下:#define iopmod (*(volatile unsigned *)0x03ff5000) /

33、定义寄存器地址#define iopcon(*(volatile unsigned *)0x03ff5004)#define iopdata(*(volatile unsigned *)0x03ff5008) #define ulcon0(*(volatile unsigned *)0x03ffd000)#define ucon0(*(volatile unsigned *)0x03ffd004) #define ustat0(*(volatile unsigned *)0x03ffd008) #define utxbuf0(*(volatile unsigned *)0x03ffd00c)

34、#define urxbuf0(*(volatile unsigned *)0x03ffd010) #define ubrdiv0(*(volatile unsigned *)0x03ffd014) #define ulcon1(*(volatile unsigned *)0x03ffe000) #define ucon1(*(volatile unsigned *)0x03ffe004) #define ustat1(*(volatile unsigned *)0x03ffe008) #define utxbuf1(*(volatile unsigned *)0x03ffe00c) #def

35、ine urxbuf1(*(volatile unsigned *)0x03ffe010) #define ubrdiv1(*(volatile unsigned *)0x03ffe014)void delay(unsigned int);/声明延时函数void inituart(int port,int baudrate);/声明初始化串口函数void printuart(int port,char *s);/声明串口输出字符函数int main()inituart(0,0x500);/19200bps 50mhz 0=com1;1=com2for(;)delay(10);printuart

36、(0,"罗亮组 通信工程 200810315136nr ");/串口1输出字符return(0);void printuart(int port,char *s)/s是指向字符串的首地址,即t的地址if(port=0)/如果使用串口0for(;*s!='0's+)/在c中,'0'表示一个字符串结束for(;(!(ustat0&0x40););/判断发送缓冲区是否为空utxbuf0=*s;/如果为空,把字符写入缓冲区if(port=1)for(;*s!='0's+)for(;(!(ustat1&0x40););u

37、txbuf1=*s;void inituart(int port,int baudrate) /串口初始化程序if(port=0) ulcon0=0x03; ucon0=0x09; ubrdiv0=baudrate; if(port=1) ulcon1=0x03; ucon1=0x09; ubrdiv1=baudrate; void delay(unsigned int x) /延时函数unsigned int i,j,k;for(i=0;i<=x;i+)for(j=0;j<0xff;j+)/j执行255次,x加1for(k=0;k<0xff;k+);/k执行255次,j加1

38、7.3.2添加应用程序至内核并随内核编译编写完应用程序代码后,还须将程序文件添加到操作系统内核源代码目录中,主要步骤如下。(1) 在内核源代码目录/uclinux-dist/user下新建目录new_one,new_two。并将led.c、uart.c文件复制到该目录下。(2) 在new_one,new_two下新建makefile文件,添加如下代码:exec = led uartobjs = led.o uart.o all : $ (exec) $ (exec):$(objs) $(cc) $(ldflags)-o $.o $(ldlibs) romfs: $(romfsinst) -e

39、config_user_new_ap_led /bin/led $(romfsinst) -e config_user_new_ap_uart/bin/uart clean: rm -f $(exec) *.gdb *.elf *.o使用vi编辑器完成代码修改后如图7-2所示图7-2修改makefile为new_one,new_two文件夹创建makefile文件,即为led.c和uart.c的编译提供了规则,在整个uclinux内核文件中,文件之间的组织是靠各个文件夹中makefile文件组织起来的,所以接下来还需把应用程序的编译规则进一步添加到其上级目录的makefile和系统配置文件中去。(3)编辑user目录下的makefile文件,添加如下代码。dir_$ (config_user_new_one_led) += new_onedir_$ (config_user_new_two_uart) += new_two(4)编辑config目录下的config.in文件,添加如下代码。mainmenu_option next_commentcomment test programbool test led config_user_new_on

温馨提示

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

评论

0/150

提交评论