ITRON系统使用方法_第1页
ITRON系统使用方法_第2页
ITRON系统使用方法_第3页
ITRON系统使用方法_第4页
ITRON系统使用方法_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、ITRON 系统使用方法 目录 1 1引言引言.4 2 2ITRON 系统介绍系统介绍.5 2.1概要.5 2.2构成.5 2.2.1ITRON系统构成.5 2.2.2ITRON体系结构.5 2.3应用领域.6 2.4如何使用 ITRON 系统.6 3 3ITRON 的基本机能的基本机能.8 3.1TASK管理机能.8 3.1.1Task.8 3.1.2任务调度.8 3.1.2.1调度产生条件 .9 3.1.2.2调度方式 .9 3.1.3任务的状态管理.9 3.1.3.1ITRON 系统状态定义.9 3.1.3.2任务状态迁移与系统调用 .10 3.1.4任务的应用.12 3.1.5任务的设

2、计.13 3.1.5.1任务划分的原则 .13 3.1.5.2I/O 依赖性.13 3.1.5.3时间关键性的功能 .13 3.1.5.4计算功能 .14 3.1.5.5时间内聚 .14 3.1.5.6周期执行功能 .14 3.1.5.7任务设计的误区 .14 3.2同步和通信管理.15 3.2.1Event Flag.15 3.2.1.1基本调用 .16 3.2.1.2Event Flag 的应用.16 3.2.2Semaphore.18 3.2.2.1基本调用 .19 3.2.2.2Semaphore 的应用 .19 3.2.3MailBox.20 3.2.3.1基本调用 .22 3.2.

3、3.2MailBox 的应用.22 3.3内存管理.24 3.3.1概述.24 3.3.2基本调用.25 3.3.3内存池的创建.25 3.3.4内存池的清除.26 3.3.5内存申请.26 3.3.6内存释放.26 3.4中断处理.26 3.4.1中断处理的管理.26 3.4.2中断例程的登录.27 3.4.3中断中的处理.27 3.5时钟管理.28 3.5.1周期唤醒.28 3.5.2延迟唤醒.28 3.5.3Time Out指定.29 4 4初始化处理初始化处理.29 4.1硬件初始化.29 4.2内核初始化.29 4.3软件初始化.30 5 5附录附录.31 5.1思考题.31 5.2

4、参考资料:.31 1 1引言引言 对于这样一个处处存在计算机的时代,计算机已经不再是像现在这样有显示器和键盘的样子,而是内 只与各种各样的机器设备中,用户不会意识到是在使用计算机,而是在不知不觉中愉快的接受了计算机提 供的各种服务。 为了实现处处存在计算机的设想,在 TRON 项目中研制了内置于形式各异的机器设备中的操作系统 ITRON。ITRON 与现在的大多数计算机中的操作系统的最大不同就是具有实时性。另外 ITRON 还有一个 特点就是其标准的开放性,由于他的开发体系标准,任何人都可以自由的以 ITRON 为基准,创建操作系统。 课程目的:课程目的: 本教材从应用的角度出发,比较详尽的解

5、析 ITRON 系统的基本原理,并且理论结合实际,由浅入深, 逐步引导大家,从而保证每位学员能够独立在基于 ITRON 系统内核上进行应用软件的设计和开发。 授课目标:授课目标: 通过本课程的学习,能够让大家对 ITRON 系统有比较深入的了解,并能够独立开发基于 ITRON 系统 的应用软件。 面向对象:面向对象: 本教材主要面向有一定操作系统原理基础知识,并立志于基于 ITRON 体系开发的人。 教材构成:教材构成: 1.ITRON 系统概要 2.ITRON 基本功能 任务管理 同步管理 内存管理 时钟管理 中断管理 3.初始化处理 4.系统调用详细说明 2 2ITRON 系统介绍系统介绍

6、 2.1 概要概要 ITRON(Industrial the Real-Time Operation System Nucleus,工业实时操作系统中心)提出的实时多 任务系统规范。它具有标准的实时内核,适用于任何小规模的嵌入式系统,日本国内现有很多基于该内核 的产品,其中消费电器较多,目前已成为日本事实上的工业标准。 ITRON 和日本的精密机械工业相结合,使日本在数据系统、工业机器人、办公机器方面处于世界领 先地位。 ITRON 系统具有以下特点: 多任务支持 事件驱动基于优先级的调度 任务间的通信与同步 实时时钟控制 完全可抢占内核硬实时响应 2.2 构成构成 2.2.1ITRON 系统

7、构成系统构成 ITRON 系统主要由内核、接口库、辅助工具这三个基本子系统组成。 内核:ITRON 的核心部分,和处理程序一起组装到目标系统中,进行实时、多任务控制。主要包括 调度程序、Task 管理、同步管理、初始化以及各种资源的管理等。 接口库:用外部函数的形式提供系统服务,实现将外部函数形式发行的系统调用转变为内核识别管理 的形式的接口程序。图 2.2-1 表明接口库在系统中的位置。 系统调用发行 用户应用 接口处理 函数调用函数调用 系统调用处理 内核 控制权转移 接口库 图 2.2.1-1 接口库的定位 辅助工具:包括编译工具、Task Debuger 等,为用户方便式用系统提供了可

8、能。 2.2.2ITRON 体系结构体系结构 建立在 ITRON 基础上的系统根据功能来分层,每一层都使用下一层提供的功能,系统 多 任 务 应 用 程 序 ROMRAM Micro- processor I/OClock Other Periphera ls 任务管理、同步管理、中断管理、时钟管理、内存 管理 ISRISRISR 应用扩展 内核接口库应用扩展接口库 软件 硬件 基本调用 中断支持 应用扩展 图 2.2.2-1ITRON 系统体系结构 硬件构成了系统的最底层,紧接着一层包括了最简单的大多是硬件相关的操作系统,功能最上层是应用程 序。 2.3 应用领域应用领域 随着信息终端的高性

9、能化,在终端上搭栽操作系统的实例越来越多。根据 TRON 协会提供的资料, 下面将列举出 ITRON 系统的主要应用领域。 娱乐/教育设备 通信设备 AV 设备 测量仪器 医疗设备、航空设备的数据收集以及数据计算系统等 家用电器 在上述应用领域中,ITRON 规范的操作系统的使用率比较高,普遍超过 40%,除去其中没有使用操 作系统的设备,这些领域中的 ITON 的使用率将超过 60%,因此 ITON 规范的操作系统还是得到了广泛的 认可和应用的。 2.4 如何使用如何使用 ITRON 系统系统 ITRON 规范中定义了一系列 C 语言接口库,应用系统可以利用这些接口库实现应用与操作系统的相

10、连。下面是基于 itron 系统的软件构建过程: Linkage Editor Absolute module Load module converter ROM write format C standard Library Application object Itron I/F Library Relocatable Assembler Configuration file Configurator C standard header file Application include file Application C source Application Assembler sour

11、ce C compiler Include file System data definition file Startup program 图 2.4-1 基于 Itron 系统的软件构建过程 3 3ITRON 的基本机能的基本机能 作为通常的实时操作系统,一般需要包含下面这些基本的管理功能: 中断管理 任务管理 1.创建、撤消 2.状态迁移 3.调度 4.同步(任务协调、资源的互斥访问、任务之间通信) 资源管理(内存、时间、端口、外设等) ITRON 系统也不例外的实现了这些功能,下面将针对这些机能进行详细讲解。 3.1 Task 管理机能管理机能 3.1.1Task 任务就是一个具有独立

12、功能的无限循环的程序段的一次运行活动。任务具有动态性并行性异步独立性 的特点。 动态性任务的状态是不断变化的,一般分为:休眠态(dormant), 就绪态(ready),运行态(running), 挂起 态 suspended 睡眠态 sleep 等如图 3.1 并行性是指系统中同时存在多个任务,它们宏观上是同时运行的。 异步独立性任务是系统中独立运行的基本单元也是内核分配和调度的基本单元每个任务各自按相互独 立的不可预知的速度运行走走停停。 每个任务都要按排一个决定其重要性的优先级,都有一个无限循环的程序段规定其功能(如一个 C 语言过程),并相应有一个数据段、堆栈段及一个任务控制块(保存

13、CPU 的现场, 状态等)。 下面是一个 ITRON 系统任务应用的典型范例: void XXX_Task ( INT stacd ) MSG msg; while(1) rcv_msg(&msg, MbxID); /从某个 Mailbox 中获取情报 用户程序 3.1.2任务调度任务调度 操作系统必须为多个任务可能有竞争的请求分配资源,对于处理器来讲,可分配的资源主要是处理器 运行时间,分配的途径是通过内核的调度来完成的。 3.1.2.1调度产生条件调度产生条件 从表面上看,任务切换功能很简单,在某个时刻,一个正在运行的任务被终止,操作系统指定另一个 任务为运行状态,并把控制权交给这个任务。

14、但是什么事件触发了任务控制权的切换?ITRON 系统中,当 有如下几个条件发生时,会发生任务的调度。 处理程序的返回 发生改变系统运行状态的系统调用。 产生时钟中断。 3.1.2.2调度方式调度方式 1 优先级方式: 对于每个任务都事先分配有优先级,这里的优先级是指决定调度顺序的东西,调度程序首先会参照优 先级别,从 Ready 队列中找到优先级别最高的任务赋予 CPU 使用权。 在实时操作系统中任务的优先级是应用程序设计者按照任务的重要程度来安排的,并且任务在运行中 其优先级可以动态改变,这个完全需要根据实际的需求进行设计。 Task B Ready队列 Pri = 1 Q Pri = 2

15、Q Pri = 3 Q Pri = 4 Q 优 先 度 高 低 Task C Task F Task DTask E Task A Run 图 3.1.2.2-1 Itron Ready 队列状态和处理器使用权 2 FIFS 方式 当拥有同一优先级的任务存在多个时,调度程序将赋予成为 Ready 状态时间最长的任务 CPU 的使用 权。 3 任务的禁止/许可 4 时间片轮旬 作为 Itron 系统并没有提供这种支持,但是可以通过现有系统提供的服务实现这种支持,这个在后面 进行说明,详细内容请参考: 3.1.3任务的状态管理任务的状态管理 任务根据运行时所必须的资源获得状况,以及有无事件发生来实

16、现状态的迁移,所以内核必须管理各 任务当前所处的状态。 3.1.3.1 ITRON系统状态定义系统状态定义 操作系统的职责是控制任务的执行,这里包括决定任务交替的方式和资源的分配原则,所以为了达成 这个目标,就需要描述任务的行为-即任务的状态。在 ITRON 中,将任务划分为如下七个状态进行管理, 在任意时刻,任务状态只能属于这七个状态之一。 未登录状态:non_existent 没有作为任务的注册到系统中,或被消除没能登录到系统中的状态。也就是说虽然已经装配到内存中, 但不受 OS 管理的程序。 休眠状态:dormant 任务生成时的状态(cre_tsk 系统调用时)或者是运行终了时的状态。

17、处于 dormant 状态的任务,已经 从调度对象中删除掉了。 就绪状态:ready 成为内核调度对象管理的状态。虽然已经具备除了处理机之外的所有必要资源,但是由于有比该任务 优先级别更高(或者相同任务优先级别)的任务正在运行,等待运行权到达的状态,也就是说,只要运行 权到达,马上迁移到 run 状态的状态。 运行状态:run 得到了系统的控制权,正在处于运行处理中的状态。系统中处于运行状态的任务只能有一个。 等待状态:wait 由于缺少运行的必要条件,不能进入到运行状态的状态,也就是说正在等待必要运行条件到达的状态。 从 wait 状态的重新执行是从进入到 wait 状态时中断的场所开始执行

18、,也就是说运行程序时必要的各 种内部环境(寄存器、堆栈等)会复原。 挂起状态:suspend 被其他任务情知中断执行(sus_tsk 调用的发行)的状态,还有可以通过多重发行 sus_tsk 调用,使 suspend 状态嵌套。 Suspend 状态的解除是通过发行 rsm_tsk 系统调用来进行的。但是如果要发行依次 rsm_tsk 系统调用来 解除被嵌套的 suspend 状态,必须要选择参数 T_FRCPSM(0X1)。 从 syspend 状态重新实行是指从为进入 suspend 状态处理中断的位置开始。也就是说运行程序时必要 的各种内部环境(寄存器、堆栈等)会复原。 双重等待状态:w

19、ait_suspend 由上面 wait 状态和 suspend 状态合成的状态,也就是对应于 wait 状态发行了 sus_tsk 调用的场合迁移 到的场合。 Wait_suspend 状态是当 suspend 状态被解除时,就迁移到 wait 状态,而 wait 状态被解除时,就迁移到 suspend 状态。 3.1.3.2任务状态迁移与系统调用任务状态迁移与系统调用 各个任务是通过系统调用的发行,来实现状态的迁移的,具体的状态迁移关联关系情参考图 3.1.3.2- 1: Ready 可执行状态 Run 执行状态 Wait 等待状态 Wait_Suspend 双重等待状态 Suspend

20、挂起 Dormant 休眠状态 Nonexistent 未登陆状态 Dispatch Preempt 等待条件 等待解除 SuspendResume (rsm_tsk, frsm_tsk) (sus_tsk) Forced termination (ter_tsk) Forced termination (ter_tsk) Forced termination (ter_tsk) Forced termination Exit (ext_tsk,abo_tsk) Exit and delete (exd_tsk) 等待解除 删除创建 (cre_tsk)(del_tsk) 挂起 (sus_tsk

21、) 解除挂起 (rsm_tsk, frsm_tsk) (sta_tsk) Force termination 启动 (ter_tsk) 图 3.1.3.2-1 任务的状态迁移关系图 各迁移过程的详细说明请参照表 3.1.3.2-1 状态迁移说 明系统调用 Nonexistent-dormant任务生成cre_tsk Nonexistent-ready不可- Nonexistent-run不可- Nonexistent-wait不可- Nonexistent-suspend不可- Dormant-nonexistent任务的删除del_tsk Dormant-ready任务的启动sta_tsk

22、Dormant-run不可(注 1)- Dormant-wait不可- Dormant-suspend不可- Ready-nonexistent不可- Ready-dormant任务的强制终了ter_tsk Ready-run在 ready 状态的任务中,优先级成为最高的 任务 - Ready-wait不可- Ready - suspend任务的强制等待sus_tsk Run-nonexistent任务的终了并自删除Exd_tsk Run-dormant正常终了Ext_tsk Run-ready任务的自中断,接受系统的调度(注 2)- Run-wait等待要因的发生: 时间等待 唤醒等待 Ev

23、ent Flag 等待 Semaphore 等待 消息等待 内存块等待 Wai_tsk Slp_tsk Wai_flg Wai_sem Rcv_msg Get_blk Run-suspend不可- Wait-nonexistent不可- Wait-dormant任务的强制终了Tet_tsk Wait-ready等待要因发生: Time out 唤醒等待 Eventflag 等待 Semaphore 等待 消息等待 内存块等待 Wup_tsk Sys_wup Set_flg Sig_sem Snd_msg Rel_blk Wait-run不可(注 3)- Wait-wait_suspend任务的

24、强制等待Sus_tsk Suspend-nonexistent不可- Suspend-dormant任务的强制终了Ter_tsk Suspend-ready强制等待的解除Rsm_tsk Suspend-run不可(注 4)- Suspend-wait不可- Suspend-wait_suspend不可- Wait_suspend-wait强制等待的解除Rsm_tsk Wait_suspend-suspend等待要因的解除Vsnd_sig 表 3.1.3.2-ITRON 任务的状态迁移关系表 1. 通过 sta_tsk 调用后有时会从 dormant 状态迁移到 run 状态,但实际上是经过 r

25、eady 状态后迁 移到 run 状态的。 2. 当出现比自任务有更高有限级的任务或对于自任务发行 rot_rdp 系统调用。 3. 通过等待要因发生后,有时从 suspend 状态迁移到 run 状态名单实际上是经过 ready 状态的。 4. 通过 rsm_tsk 系统调用发现有时从 suspend 状态迁移到 run 状态,但实际上是经过 ready 状态 的。 3.1.4任务的应用任务的应用 创建任务 在 Itron 系统中创建任务存在两种方式,一种方式是静态注册任务;另一种方法是动态的创建任务。 动态创建任务主要通过 cre_tsk 调用来实现的。 激活任务 Itron 系统中,初始

26、创建的任务的状态是 Dormant 状态,这个时候任务还处于系统无法调度的状态, 所以必须激活任务,激活任务的系统调用是 sta_tsk,作用就是将指定任务由 Dormant 状态迁移到 Ready 状 态。 终止任务 在 Itron 系统中如果需要实现将任务由 ready state, run state, wait state, suspend state, wait-suspend state 迁 移到 Dormant 状态的话,需要通过下面两种方式实现,正常终止和强制终止。 正常终止是任务自身主动放弃系统的使用权。 强制终止是任务自身出现错误,无法自主释放系统使用权,这个时候只能通过其

27、他任务来完成对本任 务使用权的剥夺。 实现任务终止的系统调用主要有下面三个: ext_tsk system call The task that issued the ext_tsk system call is switched from the run state to the dormant state. exd_tsk system call The task that issued the exd_tsk system call is switched from the run state to the non-existent state. ter_tsk system call

28、The task specified by the parameters is forcibly switched to the dormant state. 删除任务 实现任务状态从 Run 或者 Dormant 状态切换到 nonexistent 状态,实现这个功能主要通过下面两个调 用来完成的。 exd_tsk system call The task that issued the exd_tsk system call is switched from the run state to the non-existent state. del_tsk system call The t

29、ask specified by the parameters is switched from the dormant state to the non-existent state. 3.1.5任务的设计任务的设计 3.1.5.1任务划分的原则任务划分的原则 在将一个软件系统分解成并行任务时, 主要需考虑的是系统内功能的异步性。 可以通过分析数据流图中的变换, 确定哪些变换可以并行, 而哪些变换在本质上是顺序的,通过这种方 法, 划分出任务: 一个变换对应一个任务,或者一个任务包括几个变换。 一个变换是应该成为一个独立的任务, 还是应该和其它变换一起组成一个任务, 决定的原则如下: I/O

30、 依赖性 (Dependency on Input/Output Device) 时间关键性的功能 (Time-critical functions-Hard Deadline) 计算量大的功能 Heavy Computation function 功能内聚 Functional relations 时间内聚 Temporal relations 周期执行的功能 Cyclic executing function 3.1.5.2I/O 依赖性依赖性 如果换依赖于 I/O, 那么它运行的速度常常受限于与它互操作的 I/O 设备的速度在这种情况下, 变换应 成为一个独立的任务。 DeviceI/O

31、 TaskApp Task 在系统中创建多个与 I/O 设备相当数目的 I/O 任务 I/O 任务只实现与设备相关的代码 I/O 任务的执行只受限于 I/O 设备的速度而不是处理器 在任务中分离设备相关性 3.1.5.3时间关键性的功能时间关键性的功能 对于事件关键性的功能对响应的时间要求的第一重要的,所以对于这类任务的响应的优先级别比较高。 Task3 Task2 Task1 Event2 Event1 Task2 Task3 将有时间关键性的功能分离出来组成独立运行的任务 赋予这些任务高的优先级以满足对响应时间的需要 3.1.5.4计算功能计算功能 复杂的计算功能一般运行时间比较长,所以对

32、于这类功能的设计的原则如下: 计算功能占用 CPU 的时间多 捆绑计算功能成任务赋予它们较低优先级运行, 能被高优先级的任务 抢占消耗 CPU 的剩余时间 保持高优先级的任务是轻量级的 多个计算任务可安排成同优先级按时间片循环轮转 3.1.5.5时间内聚时间内聚 将在同一时间内完成的各功能,即使这些功能是不相关的组成功能组形成一个任务 功能组的各功能是由相同的外部事件驱动的,如时钟等这样每次任务接收到一个事件, 它们都可 以同时执行 组成一个任务,减少了系统的开销 虽然时间内聚在结构化设计中并不被认为是一个好的模块分解原则, 但在任务级是可以被接受每个功 能都作为一个独立的模块来实现, 从而达

33、到了模块级的功能内聚, 这些模块组合在一起, 又达到了任务级的 时间内聚 3.1.5.6周期执行功能周期执行功能 将在相同周期内执行的各功能组成一个任务 频率高的赋予高优先级 3.1.5.7任务设计的误区任务设计的误区 错误的任务划分原则 任务使用 SUPSPEND/RESUME 太频繁,是由于任务划分过细任务的当成功能使用,改进的方法是将 任务变成子程序使用。 当事件发生时调用子程序,任务划分的太粗将子程序划分为任务, 得到消息后又立即检查另外的信息,不要使用轮循的方式直接使用事件驱动方式 优先级倒置 当低优先级的任务向高优先级的任务发送消息时,高优先级的任务不能运行,直到低优先级的任务发

34、送消息后才能运行。 这种情况下就没有必要分为两个任务只需要使低优先级的任务调用子程序即可。 死锁 两个任务同时相互等待对方的信号,导致它们永远不能运行。 为了避免死琐将共享资源统一排序所有的任务按序来访问多个资源。 等待的事件没有发生过或者不具备等待事件的发生条件。 3.23.2 同步和通信管理同步和通信管理 在多任务的实时系统中,一项工作的完成往往要通过多个任务或多个任务与多个中断处理过程(ISRs) 共同完成。它们之间必须协调动作互相配合,甚至需要交换信息进行通信。这些通信和同步的需要是: 1.任务能和其他任务及 ISRs 交换数据 2.任务能以以下方式与其他任务进行同步 单向同步一个任务

35、与另一个任务或一个 ISR 同步 双向同步两个任务相互同步 与同步 一个任务与几个事件同时同步 或同步 一个任务与几个事件中的任何第一个到达事件同步 3.任务必须能对共享资源进行互斥访问 为了满足任务间通信同步和互斥的需要,同时保证资源被安全的使用,必须对多个相关任务在执行的 次序上进行协调。ITRON 系统主要提供了如下一些同步机制。 Event Flag,任务间的协调功能。 Semaphore,对系统资源进行排他访问。 MailBox,任务之间进行的信息通信。 以下章节将针对这些系统同步方式进行详细的说明。 3.2.1Event Flag 在多任务处理系统中,需要等到一个任务终了后,其他任

36、务再开始启动的等候功能,这个时候,需要 拥有对其他任务是否终了进行判断的能力,ITRON 系统中提供了 Event Flag.来实现这个机能。 ITRON 系统中,一个 Event Flag 是 ITRON 工作区中的一个 32 位的变量。32 位中的每一位都是表示 一个事件标志,事件标志有两种状态,设置(1)和清除(0)。当一个标志处于设置状态时,表示相关的 事件已经发生了,任务和 ISRs 可以使用事件标志来向其他任务发送信号, 表示事件已发生。 Ready Status 等待信号发送的人 发送信号的人 信号 Wait Status 图 3.2.1-1 Event Flag 示意图 上图中

37、,人相当于任务,火把表示 Event Flag,在没有得到通知之前,等待信号的人处于等待状态, 当发送信号的人发送了通知之后,处于等待状态的人将被激活,便开始自己的作业了,这就是一个完整的 Event Flag 使用过程事例。 3.2.1.13.2.1.1基本调用基本调用 ITRON 系统中提供下面基本调用,实现了 Event Flag 的基本机能,详细描述可以参照手册: cre_flg: Generates an event flag. del_flg: Deletes an event flag. set_flg: Sets a bit pattern. clr_flg: Clears a

38、 bit pattern. wai_flg: Checks a bit pattern. pol_flg: Checks a bit pattern (by polling). twai_flg: Checks a bit pattern (with timeout setting). ref_flg: Acquires event flag information. vget_flg: Acquires event flag ID number. vset_flg1: Sets a bit. vwai_flg1:Checks a bit. 3.2.1.2Event Flag的应用的应用 一般来说,Event Flag 为任务之间的等待操作提供了场所,下面是其操作方法: 任务间的等候需要能够传达 Event 的任务和等待 Event 发生的任务,传达 Event 任务通过发行 set_flag 调用来传递信息,另一方面等待 Event 任务对事件发行等待调用,并且参照等候模式。 如果 event flag 的位模式与等待位模式一致时,任务可以继续进行处理,如果不一致,任务就不做继

温馨提示

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

评论

0/150

提交评论