西安电子科技大学嵌入式实时操作系统课件第4章_第1页
西安电子科技大学嵌入式实时操作系统课件第4章_第2页
西安电子科技大学嵌入式实时操作系统课件第4章_第3页
西安电子科技大学嵌入式实时操作系统课件第4章_第4页
西安电子科技大学嵌入式实时操作系统课件第4章_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 中断处理与时间管理第4章 中断处理与时间管理4.1 中断处理的基本概念中断处理的基本概念 4.2 C/OS-的中断处理的中断处理 4.3 C/OS-的时钟节拍的时钟节拍 4.4 C/OS-的时间管理的时间管理 习题习题第4章 中断处理与时间管理4.1 中断处理的基本概念中断处理的基本概念4.1.1 中断中断中断定义为CPU对系统内外发生的异步事件的响应。异步事件是指没有一定时序关系的、随机发生的事件。当中断产生时,由硬件向CPU 发送一个异步事件请求,CPU接收到请求后,中止当前工作,保存当前运行环境,转去处理相应的异步事件任务,这个过程称为中断。事件处理完毕后,在前后台系统中,程序回

2、到后台程序;在不可剥夺型内核中,程序回到被中断了的任务;在可剥夺型内核中,让进入就绪态的优先级最高的任务开始运行,若没有高优先级任务准备就绪,则回到被中断了的任务。第4章 中断处理与时间管理使用中断机制的优点在于:CPU无需连续不断地查询是否有新的事件发生,只需在有事件发生时作出响应。CPU可以通过两条特殊指令关中断(Disable Interrupt)和开中断(Enable Interrupt)来响应和不响应中断。关中断会影响中断延迟时间,时间太长可能会引起中断丢失。所以在实时环境中,关中断的时间应尽量短。在中断服务期间,CPU一般允许中断嵌套(如图4.1所示),允许新的中断打入,识别中断优

3、先级别更高的事件。第4章 中断处理与时间管理图4.1 中断嵌套第4章 中断处理与时间管理4.1.2 中断延迟中断延迟中断延迟定义为从硬件中断发生到开始执行中断处理程序第一条指令所用的时间,也就是说,中断延迟是从中断发生到中断跳转指令执行完毕之间的这段时间,它是实时内核最重要的指标。由于实时操作系统考虑得更多的是最坏的情况,而不是平均的情况,因此指令执行的时间必须按照最长的指令执行时间来计算。所以,中断延迟时间通常是由关中断的最长时间来决定的。关中断的时间越长,中断延迟就越长。中断延迟由下式给出:第4章 中断处理与时间管理在前后台系统中:在不可剥夺型和不可剥夺内核中:第4章 中断处理与时间管理4

4、.1.3 中断响应中断响应中断响应定义为从中断发生起到开始执行中断用户处理程序的第一条指令所用的时间,换句话说,中断响应是从中断发生到刚刚开始处理异步事件之间的这段时间,它包括开始处理这个中断前的全部开销。一般地,执行用户代码之前要保护现场,将CPU的各个寄存器推入堆栈。在前后台系统和不可剥夺型内核中,保存寄存器以后立即执行用户代码,中断响应由下式给出:中断响应=中断延迟+保存CPU内部寄存器的时间第4章 中断处理与时间管理在可剥夺型内核中,则要先调用一个特定的函数,通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。对C/OS-说来,这个函数是OSIntEnter(),可剥夺型内核的中断响

5、应由下式给出:中断响应=中断延迟+保存CPU内部寄存器的时间+内核进入中断服务函数的执行时间中断响应考虑的是系统在最坏情况下的响应中断时间,而不是平均时间。如某系统100次中有99次在100 s之内响应中断,只有一次响应中断的时间是250 s,只能认为中断响应时间是250 s。第4章 中断处理与时间管理4.1.4 中断恢复时间中断恢复时间中断恢复时间(Interrupt Recovery)定义为CPU返回到被中断了的程序代码所需要的时间。在前后台系统和不可剥夺型内核中,中断恢复时间只包括恢复CPU内部寄存器值的时间和执行中断返回指令的时间。中断恢复时间由下式给出:第4章 中断处理与时间管理对于

6、可剥夺型内核,中断的恢复要复杂一些。一般地,可剥夺型内核在中断服务子程序的末尾都要调用一个由实时内核提供的中断脱离函数。在C/OS-中,这个函数叫做OSIntExit(),它首先判断是否脱离了所有的中断嵌套,然后再判断是否有更高优先级的任务准备就绪。若还处于中断嵌套中,那么程序返回到前一级中断服务子程序继续执行;若已经脱离了所有的中断嵌套,则检查当前是否有优先级更高的任务准备就绪。若有更高优先级任务准备就绪,则返回到这个优先级更高的任务,被中断了的任务只有重新成为优先级最高的就绪态任务时才能恢复运行;第4章 中断处理与时间管理如果没有,则返回到被中断的任务继续执行。在这种情况下,可剥夺型内核的

7、中断恢复时间由下式给出:第4章 中断处理与时间管理4.1.5 中断延迟、响应和恢复时间的比较中断延迟、响应和恢复时间的比较前后台系统、不可剥夺型内核以及可剥夺型内核的中断延迟、中断响应和中断恢复时间的比较如图4.2和图4.3所示。 第4章 中断处理与时间管理图4.2 前后台系统和不可剥夺型内核的中断延迟、响应和恢复时间的比较第4章 中断处理与时间管理图4.3 可剥夺型内核的中断延迟、响应和恢复时间的比较第4章 中断处理与时间管理4.1.6 非屏蔽中断非屏蔽中断非屏蔽中断(NMI)是指不能用系统指令来关闭的中断,其特点是中断优先级高、延迟时间短、响应快、不能被嵌套、不能忍受内核的延迟,一般常应用

8、于紧急事件处理,如掉电保护等。非屏蔽中断的规则如下:(1) 在非屏蔽中断处理程序中,不能处理临界区代码、不能使用内核提供的服务。(2) 在非屏蔽中断处理程序中,参数的传递必须用全程变量,且全程变量的字节长度必须能够一次读完。若一定要在非屏蔽中断产生时使用内核服务,则可以通过用非屏蔽中断产生普通可屏蔽中断的方法来实现。第4章 中断处理与时间管理4.2 C/OS-的中断处理的中断处理4.2.1 中断处理程序中断处理程序在C/OS-中,中断处理程序可用汇编语言编写,也可以用C语言编写。一个标准的C/OS-中断处理程序应该按图4.4所示流程图进行编写。特别需要注意的是:与前后台系统中的中断服务子程序不

9、同,C/OS-要知道当前内核是否正在处理中断、是否脱离中断。对此,C/OS-是通过在中断服务子程序中调用两个系统服务函数来实现的:一个是中断进入函数OSIntEnter(),其功能是通知内核系统已经进入了中断处理服务子程序;另一个是中断脱离函数OSIntExit(),第4章 中断处理与时间管理其功能是通知内核系统已经退出了当前的中断服务子程序。C/OS-是通过检查中断嵌套层数跟踪计数器OSInt Nesting来识别是否处于中断处理程序中的,OSIntEnter()的功能只是对OSIntNesting加1。因此,中断服务子程序也可以不调用OSIntEnter(),而直接对OSIntNestin

10、g加1,这样做的好处是可以使程序运行的时间更短。因为OSIntNesting是一个单字节整型全局变量,所以C/OS-的最大中断嵌套层数是255。第4章 中断处理与时间管理图4.4 标准的C/OS-中断处理程序流程图第4章 中断处理与时间管理如果中断服务子程序执行得很快,且在执行过程中禁止新的中断打入,那么就没有必要通知内核,已经进入了中断服务也无需调用OSIntEnter()或OSIntNesting加1,相应的在程序最后也无需调用中断脱离函数OSIntExit()。OSIntEnter()函数源代码如程序清单4.1所示。第4章 中断处理与时间管理程序清单程序清单4.1 OSIntEnter(

11、)函数源代码函数源代码void OSIntEnter (void) if (OSRunning = TRUE) /*在多任务启动后,方可通知内核,否则,直接退出*/ if (OSIntNesting 0) OSIntNesting-; if (OSIntNesting | OSLockNesting) = 0) (2)第4章 中断处理与时间管理OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStk Ptr=Stack Pointer,第4章 中断处理与时间管理调用OSTimeTick(); /*调

12、节拍服务程序*/ 清时钟中断; 重新允许中断;调用OSIntExit(); /*通知内核推出中断*/恢复处理器寄存器的值;执行中断返回指令;第4章 中断处理与时间管理时钟节拍中断服务子程序的特点如下:(1) 每个时钟周期中断一次,由它调用节拍服务函数OSTimeTick();(2) 时钟节拍中断服从C/OS-所描述的全部规则;(3) 这段代码必须用汇编语言编写,因为在C语言里不能直接处理CPU的寄存器。2. 节拍服务子程序节拍服务子程序节拍服务子程序OSTimeTick()的主要工作是:给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1,直到等于0,执行时间直接与任务个数成正比

13、。节拍服务子程序代码如程序清单4.4所示。第4章 中断处理与时间管理程序清单程序清单4.4 OSTimeTick()代码代码void OSTimeTick (void) OS_TCB *ptcb; /*定义一个事件控制块类型的指针*/ OSTimeTickHook(); /*调用由用户根据自己需要编写的扩展函数*/ ptcb = OSTCBList; /*将指针指向第一个事件控制块*/ while (ptcb-OSTCBPrio != OS_IDLE_PRIO) /*从第一个事件控制块起,做到空闲任务沿*/第4章 中断处理与时间管理/*事件控制块链表查找任务,直到空闲任务*/ OS_ENTER

14、_CRITICAL(); /*关中断,保护全局变量*/ if (ptcb-OSTCBDly != 0) /*延时项若不为0则继续,若为0则跳出*/ if (-ptcb-OSTCBDly = 0) /*若延时项减1后为0则继续,否则转出*/ if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) /*检查任务是否是被任务挂起函数挂起的,不是则任务不会进入就绪*/第4章 中断处理与时间管理 OSRdyGrp |= ptcb-OSTCBBitY;/*将任务置于就绪状态*/ OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OST

15、CBDly = 1; /*若是被任务挂起函数挂起的, 则将延时项置1,继续保持挂起状态*/ 第4章 中断处理与时间管理 ptcb = ptcb-OSTCBNext; /*指针指向下一个事件控制块,继续查找*/ OS_EXIT_CRITICAL(); /*开中断*/ OS_ENTER_CRITICAL(); /*关中断,保护所要操作的全局变量*/ OSTime+; /*累计时钟总数*/ OS_EXIT_CRITICAL(); /*开中断*/第4章 中断处理与时间管理4.3.3 时钟节拍器的正确用法时钟节拍器的正确用法C/OS-时钟节拍的正确用法是应该在多任务系统启动以后再开启时钟节拍器,也即调用

16、OSStart()后的第一件事就是开放时钟节拍中断,这段代码可以由用户嵌入到OSStart()函数内。反之,若在OSInit()与OSStart()之间开放时钟节拍器中断,时钟节拍中断就有可能在C/OS-启动第一个任务之前发生,此时C/OS-处在一种不确定的状态之中。用户应用程序有可能因此而崩溃。下面是一个错误用法的示意性程序清单(程序清单4.5),它在多任务调度前就开放了时钟中断。第4章 中断处理与时间管理程序清单程序清单4.5 错误的时钟节拍器用法错误的时钟节拍器用法void main(void) OSInit(); /*初始化C/OS-*/应用程序初始化代码;调用OSTaskCreate

17、()函数至少创建一个任务;允许时钟节拍中断; /*绝对不要在这里允许时钟节拍中断!*/OSStart(); /*开始多任务调度*/第4章 中断处理与时间管理4.4 C/OS-的时间管理的时间管理C/OS-有五个与时钟节拍有关的系统服务,它们分别如下:(1) OSTimeDly():任务延时函数。(2) OSTimeDlyHMSM():按时分秒毫秒延时函数。(3) OSTimeDlyResume():让处在延时期的任务结束延时。(4) OSTimeGet():获得系统时间。(5) OSTimeSet():设置系统时间。这些函数属于OS_TIME.C文件。要调用这些函数,必须首先在OS_CFG.H

18、文件中设置配置常量,见表4.1。第4章 中断处理与时间管理表表4.1 OS_CFG.H中与时间管理相关的配置常量一览表中与时间管理相关的配置常量一览表 第4章 中断处理与时间管理4.4.1 任务延时函数任务延时函数OSTimeDly() C/OS-的任务是一个无限循环,由于C/OS-是可剥夺型内核,如果高优先级任务不主动挂起,低优先级任务就永远无法取得运行权,最高优先级任务将独占CPU的使用权。因此,C/OS-规定:除了永不挂起的空闲任务外,其它所有的任务都要在合适的时候调用系统服务函数,自我挂起,暂时放弃CPU使用权,使低优先权任务能够得以运行。这种系统服务函数就包括这一小节将要介绍的任务延

19、时函数OSTimeDly()和下一小节将要介绍的按时分秒毫秒延时函数OSTimeDlyHMSM()。第4章 中断处理与时间管理1. 函数原型函数原型函数原型如下:void OSTimeDly(INT16U ticks)OSTimeDly()函数申请一个系统提供的延时,延时的单位是一个时钟节拍,最大可延时65 535个时钟节拍。调用该函数后,若延时时间不为0,则立即挂起当前任务,C/OS-进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,该任务就会马上进入就绪状态。当然

20、,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。 第4章 中断处理与时间管理由于中断不能延时,因此它的调用者一定是任务。函数只有一个参数ticks,它表示要延时的时钟节拍数,无返回值。2. 注意事项注意事项在调用OSTimeDly()函数时必须注意以下事项:(1) 时间的长短是用时钟节拍的数目来确定的。(2) 可提供的时钟节拍数范围是165 535。(3) 参数为0,表明不进行延时操作,而立即返回调用者。(4) 为了确保设定的延时时间,建议设定的时钟节拍数加1。(5) 只能在任务中调用,无开关量。第4章 中断处理与时间管理3. 程序流程和源代码程序流程和源代码OSTimeDl

21、y()函数程序流程如图4.10所示,源代码如程序清单4.6。第4章 中断处理与时间管理图4.10 任务延时函数流程图第4章 中断处理与时间管理程序清单程序清单4.6 OSTimeDly()函数的源代码函数的源代码void OSTimeDly (INT16U ticks) if (ticks 0) /*如果加入指定一个0值,则表示不想对任务延时,函数立即返回调用者*/OS_ENTER_CRITICAL(); /*关中断*/if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) /*从就绪表中移出当前任务*/OSRdyGrp &= OSTCB

22、Cur-OSTCBBitY;第4章 中断处理与时间管理OSTCBCur-OSTCBDly = ticks;/*保存节拍数,每隔一个时钟节拍,这个成员变量数减1*/OS_EXIT_CRITICAL(); /*关中断*/OSSched(); /*当前任务已经挂起,任务调度程序执行下一个优先级最高的就绪任务*/第4章 中断处理与时间管理4.4.2 按时、分、秒、毫秒延时函数按时、分、秒、毫秒延时函数OSTimeDly HMSM()1. 函数原型函数原型函数原型如下:INT8U OSTimeDlyHMSM(INT8U hour,INT8U minutes,INT8U seconds,INT8U mil

23、li)这是一个十分有用的函数,其功能是以时、分、秒、毫秒为单位进行延时。调用者只能是任务,调用后,如果延时时间不为0,系统将立即挂起当前任务,并进行任务调度。C/OS-可以将任务延时长达256个小时(接近11天)。第4章 中断处理与时间管理该函数需要如下四个参数:(1) hours:延时小时数,范围为0255。(2) mintues:延时分钟数,范围为059。(3) seconds:延时秒数,范围为059。(4) milli:延时毫秒数,范围为0999。第4章 中断处理与时间管理2. 返回值返回值OSTimeDlyHMSM()函数的返回值为下述内容之一:(1) OS_ON_ERR:调用成功。(

24、2) OS_TIME_INVALID_MINUTES:参数错误,分钟数大于59。(3) OS_TIME_INVALID_SECONDS:参数错误,秒数大于59。(4) OS_TIME_INVALID_MILLI:参数错误,毫秒数大于999。(5) OS_TIME_ZERO_DLY:四个参数全为0,表示不进行任何操作而直接返回。第4章 中断处理与时间管理3. 注意事项注意事项(1) 要使用该函数,首先要用OS_CPU.H文件中定义的全局常数OS_TICKS_PER_SEC将时间转换为时钟节拍数。这个全局常数表示的是每秒钟时钟节拍器产生的节拍数量,称为时钟节拍频率,其值一般设置在10100 Hz之

25、间。(2) 四个参数全为0,表示不进行任何操作,直接返回。(3) 当时钟周期大于等于1 ms时,计时最小单位是一个时钟节拍,精度是0.5个节拍。例如,若将时钟节拍频率(OS_TICKS_PER_SEC)设置成100 Hz(10 ms),4 ms的延时不会产生任何延时,而5 ms的延时就等于延时10 ms。第4章 中断处理与时间管理(4) 当时钟周期小于1 ms时,最小计数值为OS_TICKS_ PER_SEC/1000个时钟节拍,分辨率为500L/ OS_TICKS_ PER_SEC/1000L。例如,OS_TICKS_PER_SEC=1000,最小计数单位是1 ms,精度为0.5(个最小计算

26、单位)。第4章 中断处理与时间管理(5) C/OS-支持的延时最长为65 535个节拍。要想支持更长时间的延时,需采用一定的算法,一般的做法是将延时时钟数分割为两部分:一部分是65 536个节拍的整数倍;另一部分是总数减去这个整数倍节拍后剩下的节拍数,然后先算剩下的节拍数,再算这个整数倍节拍数。例如,若OS_TICKS_PER_SEC的值为100,用户想延时15 min,则OSTimeDlyHMSM()会延时1560100=90 000个时钟。这个延时会被分割成两次32 768个节拍的延时(因为用户只能延时65 535个节拍而不是65 536个节拍)和一次24 464个节拍的延时。在这种情况下

27、,OSTimeDlyHMSM()首先计算24 464个节拍,然后计算两次32 768个节拍。第4章 中断处理与时间管理(6) 由于受到OSTimeDlyHMSM()具体实现方法的限制,用户不能用函数OSTime DlyResume()结束延时调用OSTimeDlyHMSM()要求延时超过65 535个节拍的任务。假如,时钟节拍的频率是100 Hz,用户就不能调用OSTime DlyHMSM(0,10,55,350)或更长延迟时间的任务。(7) 只能在任务中调用,开关量是OS_TIME_DLY_ HMSM_EN。4. 源代码及其注释源代码及其注释OSTimeDly()函数的源代码如程序清单4.7

28、所示。第4章 中断处理与时间管理程序清单程序清单4.7 OSTimeDlyHMSM()函数的源代码函数的源代码INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) INT32U ticks; INT16U loops; if (hours 0 | minutes 0 | seconds 0 | milli 0) /*条件检查,全为0,则跳出*/ if (minutes 59) return (OS_TIME_INVALID_MINUTES);第4章 中断处理与时间管理 if (seconds

29、59) return (OS_TIME_INVALID_SECONDS); if (milli 999)return (OS_TIME_INVALID_MILLI); ticks = (INT32U)hours * 3600L * OS_TICKS_PER_SEC + (INT32U)minutes * 60L * OS_TICKS_PER_SEC + (INT32U)seconds * OS_TICKS_PER_SEC+ OS_TICKS_PER_SEC * (INT32U)milli+ 500L/OS_TICKS_PER_SEC) / 1000L; /*计算时钟节拍数,其精度为0.5个时钟

30、 */第4章 中断处理与时间管理 loops = ticks / 65536L; /*从这里开始,按注意事项第5条所述方法开始延时 */ ticks = ticks % 65536L; OSTimeDly(ticks); while (loops 0) OSTimeDly(32768); OSTimeDly(32768); loops-;第4章 中断处理与时间管理 return (OS_NO_ERR); else return (OS_TIME_ZERO_DLY); 第4章 中断处理与时间管理5. 范例范例必须注意的是:必须在OS_CFG.H文件中设置OS_ TICKS_PER_SEC。OST

31、ime DlyHMSM()函数的使用范例如下:viod task( void *pdata) for(; ;) 应用程序;OSTimeDlyHMSM(0, 0, 5, 0);/*延时5 s*/第4章 中断处理与时间管理4.4.3 让处在延时期的任务结束延时函数让处在延时期的任务结束延时函数OSTimeDlyResume()1. 函数原型函数原型函数原型如下:INT8UOSTimeDlyResume(INT8U prio)OSTimeDlyResume()函数用于唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数延时的任务。正在延时的任务可以通过其它任务调用该函数取消延时来使自

32、己处于就绪态,而不必等待延时期满。该函数还可以唤醒正在等待事件的任务,但不推荐使用这种方法。第4章 中断处理与时间管理另外,如果任务是通过等待信号量、消息邮箱或消息队列来延时自己的,那么可以简单地通过控制信号量、消息邮箱或消息队列来恢复任务。这种情况存在的唯一问题是可能会多占用一些内存,因为它要求用户分配事件控制块。不能唤醒一个用OSTimeDlyHMSM()延时且总延时时间超过65 535个时钟节拍的任务。只能在任务中调用,开关量是OS_TIME_DLY_ RESUME_EN。函数只需要1个参数prio,即指定要唤醒任务的优先级。 第4章 中断处理与时间管理2. 返回值返回值OSTimeDl

33、yResume()函数的返回值为下述内容之一:(1) OS_ON_ERR:调用成功。(2) OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO。(3) OS_TASK_NOT_DLY:要唤醒的任务不在挂起状态。(4) OS_TASK_NOT_EXIST:指定的任务不存在。第4章 中断处理与时间管理3. 源代码及其注释源代码及其注释OSTimeDlyResume()函数的源代码如程序清单4.8所示。程序清单程序清单4.8 OSTimeDlyResume()函数的源代码函数的源代码INT8U OSTimeDlyResume (INT8U prio)#if OS_CRI

34、TICAL_METHOD = 3OS_CPU_SR cpu_sr; #endif第4章 中断处理与时间管理 OS_TCB *ptcb; if (prio = OS_LOWEST_PRIO) return (OS_PRIO_INVALID); /*确保任务优先级是有效的*/ OS_ENTER_CRITICAL(); ptcb = (OS_TCB *)OSTCBPrioTblprio; if (ptcb != (OS_TCB *)0) /*确保所要恢复的任务存在*/ if (ptcb-OSTCBDly != 0) /*确保任务在等待延时期满*/第4章 中断处理与时间管理 ptcb-OSTCBDly

35、 = 0; /*将.OSTCBDly设置为0,从而取消延时*/ if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) /*检查任务是否处于挂起状态*/ OSRdyGrp |= ptcb-OSTCBBitY;/*若挂起,则将任务置于就绪*/ OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL(); OSSched();/*检查被恢复任务是否为准备就绪的最高优先级任务,若是,则切换*/第4章 中断处理与时间管理 else OS_EXIT_CRITICAL();/*如果被恢复任务不是处于挂起状态,则关中断*/ return (OS_NO_ERR); else /*如果不在等待延时期满*/ OS_EXIT_CRITICAL(); return (OS_TIME_NOT_DLY);第4章 中断处理与时间管理 OS_EXIT_CRITICA

温馨提示

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

评论

0/150

提交评论