第三章11进程描述和状态控制课件_第1页
第三章11进程描述和状态控制课件_第2页
第三章11进程描述和状态控制课件_第3页
第三章11进程描述和状态控制课件_第4页
第三章11进程描述和状态控制课件_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

第三章任务管理3.3任务同步3.2

多任务3.1

任务描述和状态,控制

2022/12/21第三章任务管理3.3任务同步3.2多任务3.1任务3.1.1任务基本概念从代码上看,uC/OS-II任务就是一个函数uC/OS-II任务有两种:用户任务和系统任务从任务的存储结构上看,uC/OS-II由三部分组成:任务程序代码(函数):任务的执行部分任务堆栈:用来保存任务的工作环境任务控制块:记录任务的各个属性2022/12/223.1.1任务基本概念从代码上看,uC/OS-II任务就是3.1.2任务的状态uC/OS-II中任务有5中状态睡眠状态:任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统管理时的情况叫做睡眠状态。即任务在没有被分配任务控制块或者被剥夺了任务控制块时的状态叫做睡眠状态。就绪状态:如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件这时任务的状态叫做就绪状态2022/12/233.1.2任务的状态uC/OS-II中任务有5中状态202运行状态:处于就绪态的任务如果经调度器判断获得了CPU的使用权,进入运行状态。等待状态:正在运行的任务需要等待一段时间或需要等待一个事件发生在运行时,该任务就把CPU的使用权让给其他任务,进入等待状态2022/12/24运行状态:处于就绪态的任务如果经调度器判断获得了CPU的使用中断服务状态:一个正在运行的任务一旦响应中断请求就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。2022/12/25中断服务状态:一个正在运行的任务一旦响应中断请求就会中止运行状态间的切换2022/12/26状态间的切换2022/12/162022/12/272022/12/173.1.3用户任务代码一般结构无限循环结构voidmytask(void*pdata){for(;;){

可以被中断的用户代码;OS_ENTER_CRITICAL();//进入临界段(关中断)不可以被中断的用户代码;OS_EXIT_CRITICAL();//退出临界段(开中断) 可以被中断的用户代码;

}}2022/12/283.1.3用户任务代码一般结构无限循环结构2022/12/OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是uC/OS-II定义的两个宏。分别封装了关中断代码和开中断代码2022/12/29OS_ENTER_CRITICAL()和OS_EXIT_CR用户应用程序一般结构voidMytask1(void*pdata)//定义用户任务1{for(;;) {...... }}voidMytask2(void*pdata)//定义用户任务2{ for(;;) {...... }}voidmain(){ .... OSInit();//初始化uc/os ... OSTaskCreate(Mytask1,......);//创建用户任务1 OSTaskCreate(Mytask2,....);//创建用户任务2 .... OSStart();//启动uc/os}2022/12/210用户应用程序一般结构voidMytask1(void*p3.1.4系统任务uC/OS-II预定义了两个系统任务:空闲任务和统计任务空闲任务是每个应用程序必须使用的统计任务是应用程序可以根据实际需求来选择使用的2022/12/2113.1.4系统任务uC/OS-II预定义了两个系统任务:空1.空闲任务任务在系统中可以有5种状态,即系统极有可能会在某个时间内无用户任务可运行而处于所谓空闲状态。为了使CPU在没有用户任务可执行时有事可做,uC/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务。代码如下:2022/12/2121.空闲任务任务在系统中可以有5种状态,即系统极有可能会在某voidOSTask(void*pdata){ #ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata; //防止某些编译器报错for(;;){ OS_ENTER_CRITICAL();//关闭中断 OSdleCtr++; //计数 OS_EXIT_CRITICAL();//开中断}}2022/12/213voidOSTask(void*pdata)2022/122.统计任务该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便其他应用程序了解CPU的利用率。是否使用统计任务,用户可以根据应用程序的实际需求来进行选择。2022/12/2142.统计任务该任务每秒计算一次CPU在单位时间内被使用的时间3.1.4任务堆栈为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都有自己的堆栈所有uC/OS-II任务的控制块中都含有一个指向该任务堆栈的指针2022/12/2153.1.4任务堆栈为了满足任务切换和响应中断时保存CPU寄任务堆栈的创建为了定义任务堆栈的方便,在文件OS_CPU.H中专门定义了一个数据类型OS_STK:typedefunsignedintOS_STK;//该类型长度为16位在定义任务堆栈的栈区时,只要定义一个OS_STK类型的数组即可。如:#define TASK_STK_SIZE512 //定义堆栈长度(1024)OS_STKTaskStk[TASK_STK_SIZE] //定义数组作为任务堆栈2022/12/216任务堆栈的创建为了定义任务堆栈的方便,在文件OS_CPU.H当调用OSTaskCreate()来创建一个任务时,把数组的指针传递给函数OSTaskCreate()中的堆栈栈顶参数,就可以把数组与任务关联起来而成为该任务的任务堆栈2022/12/217当调用OSTaskCreate()来创建一个任务时,把数组的INT8U OSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata, //传递给任务的参数OS_STK*ptos, //任务堆栈栈顶指针INT8Uprio //任务优先级别);2022/12/218INT8U OSTaskCreate(2022/12/118需要注意的是:堆栈的增长方向是随系统所使用的处理器不同而不同的。有的处理器要求堆栈的增长方向是向上的,而另一些处理器要求堆栈的增长方向是向下的使用函数OSTaskCreate()创建任务时,要注意所使用的处理器所支持的堆栈增长方向2022/12/219需要注意的是:堆栈的增长方向是随系统所使用的处理器不同而不同任务堆栈的初始化应用程序在创建一个新任务时,必须把系统启动这个任务时所需要的CPU各寄存器初始数据(任务指针,任务堆栈指针,程序状态字等)存放在任务堆栈把任务初始数据存放到任务堆栈的工作就叫做任务堆栈的初始化系统提供OSTaskStkInit()2022/12/220任务堆栈的初始化应用程序在创建一个新任务时,必须把系统启动这OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16Uopt);通常用户不会直接接触到这个函数,改函数有任务创建函数OSTaskCreate()调用2022/12/221OS_STK*OSTaskStkInit(2022/12/3.1.5任务控制块uC/OS-II用来记录任务的堆栈指针,任务的当前状态,任务的优先级等一些任务管理有关的属性的表就叫做任务控制块任务控制块相当于一个任务的身份证,系统通过任务控制块感知和管理任务uC/OS-II把系统所有任务的控制块链接为两条链表,并通过它们管理各个任务2022/12/2223.1.5任务控制块uC/OS-II用来记录任务的堆栈指针任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任务的CPU的使用权被剥夺时,uCOS-II用它来保存任务的当前状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。任务控制块全部存放在RAM中。2022/12/223任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任typedefstructos_tcb{OS_STK*OSTCBStkPtr;/*指向当前任务使用的堆栈的栈顶。uCOS-II允许每个任务堆栈的大小可以不同,这样用户可以根据实际需要定义任务堆栈的大小,可以节省RAM的空间。另外,由于OSTCBStkPtr是该结构体中的第一个变量,所以可以使用汇编语言方便的访问,因为其偏移量是0。当切换任务时,用户可以容易的知道就绪任务中优先级最高任务的栈顶。*/

#ifOS_TASK_CREATE_EXT_EN>0uvoid*OSTCBExtPtr;/*指向用户定义的扩展任务控制块*/OS_STK*OSTCBStkBottom;/*指向任务堆栈的栈底。需要考虑一下你使用的MCU的栈指针是按照从高到低还是从低到高变化的。这个变量在测试任务需要的栈空间的时候需要使用。*/INT32UOSTCBStkSize;/*同样,该变量也是测试任务需要的栈空间需要。需要注意的是,该变量存储的是指针元的数目,而不是字节数目。*/INT16UOSTCBOpt;/*传给函数OSTaskCreateExt()的选择项。目前有OS_TASK_OPT_STK_CHK,OS_TASK_OPT_STK_CLR,OS_TASK_OPT_SAVE_EP*/INT16UOSTCBId;/*TaskID(0..65535),目前没有使用。*/#endif

2022/12/224typedefstructos_tcb{2022/12structos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;/*指向TCB的双向链表的前后链接,在OSTimeTick()中使用,用来刷新各任务的任务延迟变量.OSTCBDly。*/

#if(OS_EVENT_EN)||(OS_FLAG_EN>0u)OS_EVENT*OSTCBEventPtr;/*指向事件控制块的指针。*/#endif

#if(OS_EVENT_EN)&&(OS_EVENT_MULTI_EN>0u)OS_EVENT**OSTCBEventMultiPtr;/*指向多重事件控制块的指针*/#endif

#if((OS_Q_EN>0u)&&(OS_MAX_QS>0u))||(OS_MBOX_EN>0u)void*OSTCBMsg;/*指向传递给任务的消息的指针。*/#endif

2022/12/225structos_tcb*OSTCBNext;20#if(OS_FLAG_EN>0u)&&(OS_MAX_FLAGS>0u)#ifOS_TASK_DEL_EN>0uOS_FLAG_NODE*OSTCBFlagNode;/*指向事件标志的节点的指针。*/#endifOS_FLAGSOSTCBFlagsRdy;/*当任务等待事件标志组时,该变量是使任务进入就绪态的事件标志。*/#endif

INT32UOSTCBDly;/*记录事件延时或者挂起的时间。*/INT8UOSTCBStat;/*任务状态字。比如就绪态、等待*/INT8UOSTCBStatPend;/*任务挂起状态。*/INT8UOSTCBPrio;/*任务优先级*/

INT8UOSTCBX;/*计算优先级用*/INT8UOSTCBY;/*计算优先级用*/#ifOS_LOWEST_PRIO<=63uINT8UOSTCBBitX;/*计算优先级用*/INT8UOSTCBBitY;/*计算优先级用*/#elseINT16UOSTCBBitX;/*计算优先级用*/INT16UOSTCBBitY;/*计算优先级用*/#endif

2022/12/226#if(OS_FLAG_EN>0u)&&(OS_M#ifOS_TASK_DEL_EN>0uINT8UOSTCBDelReq;/*表示任务是否需要删除。*/#endif

#ifOS_TASK_PROFILE_EN>0uINT32UOSTCBCtxSwCtr;/*任务切换的次数。*/INT32UOSTCBCyclesTot;/*任务运行的时钟周期数。*/INT32UOSTCBCyclesStart;/*任务恢复开始的循环计数器。*/OS_STK*OSTCBStkBase;/*指向任务栈开始的指针。*/INT32UOSTCBStkUsed;/*使用的栈的字节数*/#endif

#ifOS_TASK_NAME_EN>0uINT8U*OSTCBTaskName;#endif

#ifOS_TASK_REG_TBL_SIZE>0uINT32UOSTCBRegTbl[OS_TASK_REG_TBL_SIZE];#endif}OS_TCB;2022/12/227#ifOS_TASK_DEL_EN>0u2022/12任务控制块结构的主要成员2022/12/228任务控制块结构的主要成员2022/12/128任务控制块OS_TCB中几个成员的算法2022/12/229任务控制块OS_TCB中几个成员的算法2022/12/129任务控制链表uC/OS-II用两条链表管理任务控制块空任务块链表:其中所有任务控制块还为分配给任务任务块链表:其中所有任务控制块已分配给任务2022/12/230任务控制链表uC/OS-II用两条链表管理任务控制块2022为了加快对任务控制块的访问速度,uC/OS-II在uC/OS-II.H文件中还定义了一个数据类型为OS_TCB*的数组OSPrioTbl[]该数组以任务的优先级为顺序在各个元素里存放了指向各个任务控制块的指针删除一个任务,实质上就是把该任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表2022/12/231为了加快对任务控制块的访问速度,uC/OS-II在uC/OS任务控制块的初始化当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化INT8UOSTCBInit(INT8Uprio, //任务优先级别OS_STK*ptos, //任务堆栈栈顶指针OS_STK*pbos, //任务堆栈栈底指针INT16Ustk_size, //任务的标识符void*pext, //任务堆栈的长度INT16Uopt //任务控制块的选择项);2022/12/232任务控制块的初始化当应用程序调用函数OSTaskCreate该函数主要任务为被创建任务从空任务控制块链表获取一个任务控制块用任务的属性对任务控制块各个成员进行赋值把这个任务控制块链入到任务控制块链表2022/12/233该函数主要任务2022/12/1332022/12/2342022/12/134第三章任务管理3.3任务同步3.2

多任务3.1

任务描述和状态,控制

2022/12/235第三章任务管理3.3任务同步3.2多任务3.1任务3.1.1任务基本概念从代码上看,uC/OS-II任务就是一个函数uC/OS-II任务有两种:用户任务和系统任务从任务的存储结构上看,uC/OS-II由三部分组成:任务程序代码(函数):任务的执行部分任务堆栈:用来保存任务的工作环境任务控制块:记录任务的各个属性2022/12/2363.1.1任务基本概念从代码上看,uC/OS-II任务就是3.1.2任务的状态uC/OS-II中任务有5中状态睡眠状态:任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统管理时的情况叫做睡眠状态。即任务在没有被分配任务控制块或者被剥夺了任务控制块时的状态叫做睡眠状态。就绪状态:如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件这时任务的状态叫做就绪状态2022/12/2373.1.2任务的状态uC/OS-II中任务有5中状态202运行状态:处于就绪态的任务如果经调度器判断获得了CPU的使用权,进入运行状态。等待状态:正在运行的任务需要等待一段时间或需要等待一个事件发生在运行时,该任务就把CPU的使用权让给其他任务,进入等待状态2022/12/238运行状态:处于就绪态的任务如果经调度器判断获得了CPU的使用中断服务状态:一个正在运行的任务一旦响应中断请求就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。2022/12/239中断服务状态:一个正在运行的任务一旦响应中断请求就会中止运行状态间的切换2022/12/240状态间的切换2022/12/162022/12/2412022/12/173.1.3用户任务代码一般结构无限循环结构voidmytask(void*pdata){for(;;){

可以被中断的用户代码;OS_ENTER_CRITICAL();//进入临界段(关中断)不可以被中断的用户代码;OS_EXIT_CRITICAL();//退出临界段(开中断) 可以被中断的用户代码;

}}2022/12/2423.1.3用户任务代码一般结构无限循环结构2022/12/OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是uC/OS-II定义的两个宏。分别封装了关中断代码和开中断代码2022/12/243OS_ENTER_CRITICAL()和OS_EXIT_CR用户应用程序一般结构voidMytask1(void*pdata)//定义用户任务1{for(;;) {...... }}voidMytask2(void*pdata)//定义用户任务2{ for(;;) {...... }}voidmain(){ .... OSInit();//初始化uc/os ... OSTaskCreate(Mytask1,......);//创建用户任务1 OSTaskCreate(Mytask2,....);//创建用户任务2 .... OSStart();//启动uc/os}2022/12/244用户应用程序一般结构voidMytask1(void*p3.1.4系统任务uC/OS-II预定义了两个系统任务:空闲任务和统计任务空闲任务是每个应用程序必须使用的统计任务是应用程序可以根据实际需求来选择使用的2022/12/2453.1.4系统任务uC/OS-II预定义了两个系统任务:空1.空闲任务任务在系统中可以有5种状态,即系统极有可能会在某个时间内无用户任务可运行而处于所谓空闲状态。为了使CPU在没有用户任务可执行时有事可做,uC/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务。代码如下:2022/12/2461.空闲任务任务在系统中可以有5种状态,即系统极有可能会在某voidOSTask(void*pdata){ #ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata; //防止某些编译器报错for(;;){ OS_ENTER_CRITICAL();//关闭中断 OSdleCtr++; //计数 OS_EXIT_CRITICAL();//开中断}}2022/12/247voidOSTask(void*pdata)2022/122.统计任务该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便其他应用程序了解CPU的利用率。是否使用统计任务,用户可以根据应用程序的实际需求来进行选择。2022/12/2482.统计任务该任务每秒计算一次CPU在单位时间内被使用的时间3.1.4任务堆栈为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都有自己的堆栈所有uC/OS-II任务的控制块中都含有一个指向该任务堆栈的指针2022/12/2493.1.4任务堆栈为了满足任务切换和响应中断时保存CPU寄任务堆栈的创建为了定义任务堆栈的方便,在文件OS_CPU.H中专门定义了一个数据类型OS_STK:typedefunsignedintOS_STK;//该类型长度为16位在定义任务堆栈的栈区时,只要定义一个OS_STK类型的数组即可。如:#define TASK_STK_SIZE512 //定义堆栈长度(1024)OS_STKTaskStk[TASK_STK_SIZE] //定义数组作为任务堆栈2022/12/250任务堆栈的创建为了定义任务堆栈的方便,在文件OS_CPU.H当调用OSTaskCreate()来创建一个任务时,把数组的指针传递给函数OSTaskCreate()中的堆栈栈顶参数,就可以把数组与任务关联起来而成为该任务的任务堆栈2022/12/251当调用OSTaskCreate()来创建一个任务时,把数组的INT8U OSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata, //传递给任务的参数OS_STK*ptos, //任务堆栈栈顶指针INT8Uprio //任务优先级别);2022/12/252INT8U OSTaskCreate(2022/12/118需要注意的是:堆栈的增长方向是随系统所使用的处理器不同而不同的。有的处理器要求堆栈的增长方向是向上的,而另一些处理器要求堆栈的增长方向是向下的使用函数OSTaskCreate()创建任务时,要注意所使用的处理器所支持的堆栈增长方向2022/12/253需要注意的是:堆栈的增长方向是随系统所使用的处理器不同而不同任务堆栈的初始化应用程序在创建一个新任务时,必须把系统启动这个任务时所需要的CPU各寄存器初始数据(任务指针,任务堆栈指针,程序状态字等)存放在任务堆栈把任务初始数据存放到任务堆栈的工作就叫做任务堆栈的初始化系统提供OSTaskStkInit()2022/12/254任务堆栈的初始化应用程序在创建一个新任务时,必须把系统启动这OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16Uopt);通常用户不会直接接触到这个函数,改函数有任务创建函数OSTaskCreate()调用2022/12/255OS_STK*OSTaskStkInit(2022/12/3.1.5任务控制块uC/OS-II用来记录任务的堆栈指针,任务的当前状态,任务的优先级等一些任务管理有关的属性的表就叫做任务控制块任务控制块相当于一个任务的身份证,系统通过任务控制块感知和管理任务uC/OS-II把系统所有任务的控制块链接为两条链表,并通过它们管理各个任务2022/12/2563.1.5任务控制块uC/OS-II用来记录任务的堆栈指针任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任务的CPU的使用权被剥夺时,uCOS-II用它来保存任务的当前状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。任务控制块全部存放在RAM中。2022/12/257任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任typedefstructos_tcb{OS_STK*OSTCBStkPtr;/*指向当前任务使用的堆栈的栈顶。uCOS-II允许每个任务堆栈的大小可以不同,这样用户可以根据实际需要定义任务堆栈的大小,可以节省RAM的空间。另外,由于OSTCBStkPtr是该结构体中的第一个变量,所以可以使用汇编语言方便的访问,因为其偏移量是0。当切换任务时,用户可以容易的知道就绪任务中优先级最高任务的栈顶。*/

#ifOS_TASK_CREATE_EXT_EN>0uvoid*OSTCBExtPtr;/*指向用户定义的扩展任务控制块*/OS_STK*OSTCBStkBottom;/*指向任务堆栈的栈底。需要考虑一下你使用的MCU的栈指针是按照从高到低还是从低到高变化的。这个变量在测试任务需要的栈空间的时候需要使用。*/INT32UOSTCBStkSize;/*同样,该变量也是测试任务需要的栈空间需要。需要注意的是,该变量存储的是指针元的数目,而不是字节数目。*/INT16UOSTCBOpt;/*传给函数OSTaskCreateExt()的选择项。目前有OS_TASK_OPT_STK_CHK,OS_TASK_OPT_STK_CLR,OS_TASK_OPT_SAVE_EP*/INT16UOSTCBId;/*TaskID(0..65535),目前没有使用。*/#endif

2022/12/258typedefstructos_tcb{2022/12structos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;/*指向TCB的双向链表的前后链接,在OSTimeTick()中使用,用来刷新各任务的任务延迟变量.OSTCBDly。*/

#if(OS_EVENT_EN)||(OS_FLAG_EN>0u)OS_EVENT*OSTCBEventPtr;/*指向事件控制块的指针。*/#endif

#if(OS_EVENT_EN)&&(OS_EVENT_MULTI_EN>0u)OS_EVENT**OSTCBEventMultiPtr;/*指向多重事件控制块的指针*/#endif

#if((OS_Q_EN>0u)&&(OS_MAX_QS>0u))||(OS_MBOX_EN>0u)void*OSTCBMsg;/*指向传递给任务的消息的指针。*/#endif

2022/12/259structos_tcb*OSTCBNext;20#if(OS_FLAG_EN>0u)&&(OS_MAX_FLAGS>0u)#ifOS_TASK_DEL_EN>0uOS_FLAG_NODE*OSTCBFlagNode;/*指向事件标志的节点的指针。*/#endifOS_FLAGSOSTCBFlagsRdy;/*当任务等待事件标志组时,该变量是使任务进入就绪态的事件标志。*/#endif

INT32UOSTCBDly;/*记录事件延时或者挂起的时间。*/INT8UOSTCBStat;/*任务状态字。比如就绪态、等待*/INT8UOSTCBStatPend;/*任务挂起状态。*/INT8UOSTCBPrio;/*任务优先级*/

INT8UOSTCBX;/*计算优先级用*/INT8UOSTCBY;/*计算优先级用*/#ifOS_LOWEST_PRIO<=63uINT8UOSTCBBitX;/*计算优先级用*/INT8UOSTCBBitY;/*计算优先级用*/#elseINT16UOSTCBBitX;/*计算优先级用*/INT16UOSTCBBitY;/*计算优先级用*/#endif

2022/12/260#if(OS_FLAG_EN>0u)&

温馨提示

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

评论

0/150

提交评论