第10章RTX51实时操作系统课件

PPT
  • 阅读 55 次
  • 下载 0 次
  • 页数 47 页
  • 大小 266.540 KB
  • 2022-11-26 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
第10章RTX51实时操作系统课件
可在后台配置第一页与第二页中间广告代码
第10章RTX51实时操作系统课件
可在后台配置第二页与第三页中间广告代码
第10章RTX51实时操作系统课件
可在后台配置第三页与第四页中间广告代码
第10章RTX51实时操作系统课件
第10章RTX51实时操作系统课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 47
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】第10章RTX51实时操作系统课件.ppt,共(47)页,266.540 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-55027.html

以下为本文档部分文字说明:

第10章RTX51实时操作系统主要内容操作系统基本概念RTX51系统特点RTX51的程序结构RTX51的功能函数RTX51的任务调度RTX51的系统配置RTX51的应用举例10.1操作系统

基本概念10.1.1前后台系统前后台系统的组成:前台和后台程序后台:是一个无限循环的应用程序,循环中调用相应的任务函数完成相应的操作,各个任务依次运行,没有调度,运行的次序不能改变。前台:是中断服务程序,处理异步事件。任务1任务

2任务2任务n任务nISR3ISR2ISR1后台前台适用情形:一般不复杂且实时性要求不高的小系统很适合采用前后台系统,例如微波炉、电话机、玩具等。在另外一些基于省电的应用中,由于平时微处理器处在停机状态,所有的事都靠中断服务来完成,因此也常常采用前后台系统模式。10.1.2操作系

统操作系统(OperatingSystem,简称OS)是计算机中最基本的程序。操作系统负责计算机系统中全部软、硬资源的分配以及回收、控制与协调等并发的活动;操作系统提供用户接口,使用户获得良好的工作环境;操作系统为用户扩展新的系统功能提供软件平台。操作系统的主要包括四大功能:处

理机管理:解决CPU的分时复用。存储管理:配合CPU调度内存。设备管理:分配外设的使用,包括独享、共享和虚拟。软件资源管理:解决程序和信息的存取和管理等问题。实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处

理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的操作系统。用户的应用程序是运行于RTOS之上的各个任务,RTOS根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、

任务调度和异常处理等工作。实时多任务操作系统,以分时方式运行多个任务,看上去好像是多个任务“同时”运行。任务之间的切换应当以优先级为根据,只有具有优先服务方式的RTOS才是真正的实时操作系统,而时间分片方式和协作方式的RTOS并不是真正的“实时”。10.1.3实时操作系统10.1.4临

界区临界资源:任何时候都只允许一个任务访问的资源。临界区或临界段:用于访问临界资源的代码段。临界代码段不允许多个并发任务交叉执行,否则会产生严重后果,比如进入中断后的现场保护代码等。为确保临界区代码的安全执行,在进入临界区之前要关中断,而临界区代码执行完以后要立

即开中断程序运行时可使用的软、硬件环境统称为资源。资源可以是输入/输出设备,例如打印机、键盘和显示器;资源也可以是一个变量、一个结构或一个数组等。共享资源就是指可以被一个以上任务使用的资源。为防止数据被破坏,每个任务在与共享资源打交道时,必须独占

该资源,这叫互斥。10.1.5资源与共享资源任务,也称为线程,是一个简单的程序。一般地,每个任务都是一个无限的循环。任务有五种状态:休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态。任何时刻,一个任务都处于这五种状态之一的状态下。休眠态相当于该任务驻留在内存中,但并不被多任务内

核所调度。就绪态意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂不能运行。运行态的任务是指该任务掌握了CPU的控制权,正在运行。挂起态指该任务在等待,等待某一事件的发生。被中断状态是指,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运

行,就进入了被中断状态。10.1.6任务10.1.7内核与任务切换内核内核是操作系统最基本的部分。多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核负责任务之间的通信,它提供

的基本服务是任务切换。任务切换当多任务内核决定运行另外的任务时,保存正在运行任务的当前状态,即保存CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄存器,并开始下

一个任务的运行。这个过程就称为任务切换。任务1#任务3#任务2#TCBstatussppriority...TCBstatussppriority...TCBstatussppriority...CPU存储器sp...存储器CPU寄存器内容

多任务切换示意图调度是内核的主要职责之一,调度就是决定该轮到哪个任务运行了。任务的调度方式有基于时间片轮转的调度和基于优先级的调度。多数实时系统是基于优先级调度法的。基于优先级的调度法指CPU总是让处于

就绪态的优先级最高的任务先运行。至于何时让高优先级任务掌握CPU的使用权,有两种不同的情况。占先式调度;非占先式调度。10.1.8调度占先式调度任何时候具有最高优先级且已就绪的任务先执行。一个正在执

行的任务放弃处理器的条件为:自愿放弃处理器(等待资源或执行完毕);有高优先级任务启动,该高优先级任务将抢占其执行。当一个运行着的任务使一个比它优先级更高的任务进入了就绪状态时,当前任务的CPU使用权就被剥夺

了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序是一个高优先级的任务进入了就绪态,则中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。占先式调度的优点是实时性好、反应快,调度算法

相对简单,可优先保证高优先级任务的时间约束,其缺点是上下文切换多。非占先式调度非占先式调度要求每个任务自我放弃CPU的所有权。这种方式下,异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂

起状态变为就绪状态,但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。非占先式调度的优点是上下文切换少,几乎不需要使用信号量保护共享数据;缺点是处理器有效资源利用率低,任务级响应时间不

确定,可调度性不好。10.1.9函数的可重入性可重入(Reentrant)型函数:是指可以被多个任务并发使用,而数据不会遭到破坏的函数。可重入型函数特征:只使用局部变量,变量保存在CPU寄存器或堆栈中,可以在任意时刻被中断,再重新恢复运行时,数据不会被破坏;若使用全局变量

,则需满足互斥条件。可重入型函数实例voidfunc1(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}不可重入型函数清单staticinttemp;voidfunc2(int*x,int*y){temp=*x;*x=*y;*y=temp;}不可重入型

函数运行示意图使用以下技术之一可使函数func2()具有可重入性:(1)将temp定义为局部变量;(2)在调用前,禁止中断,执行完毕后再开中断;(3)在调用过程中,应用信号量独占使用该函数。低低低低低低TASKAwhile(1){x=1;Y=2;func2(&x,&y){temp=*x;*x=*y

;*y=temp;}OSTimeDly(1);}低低低低低低TASKBwhile(1){u=3;v=4;func2(&u,&v){temp=*u;*u=*v;*v=temp;}OSTimeDly(1);}ISROSOS(1)(2)(3)(4)(5)temp=1temp=3OSIn

tExit()10.1.10信号量信号量信号与信号量在英文中都是同一个词Semaphore,并不加以区别。是一种通信机制。主要用来实现任务间同步以及标识某类资源的可用个数。两种类型:①只取0和1两个值的二值(Binary)信

号量,这种信号量也称为信号;②由若干位组合而成的计数式(Counting)信号量,一般有8位、16位或者32位等若干种,具体是多少位取决于内核。作用:①满足互斥条件,实现共享资源的独占使用;②标志某事件的发生;③使两个任务的行为同步。(1)初始化信号量,也可称为建立(CREATE)信号

量。信号量初始化时,要给信号量赋初值,等待信号量的任务列表应清空。(2)等信号或申请信号量,可称做挂起(PEND)。对于执行等待信号量的任务来说,若该信号量有效,则信号量值减1,任务继续执行;若信号量值为0,则任务继续被挂起。若内核允许定义等待超时,则

超时后,该任务转入就绪,同时返回错误代码以示发生了超时错误。(3)给信号,可称做发信号(POST)。若没有任务等待该信号量,则信号量的值仅简单加1;若只有一个任务等待该信号量,则该任务转入就绪状态,信号量的值不加1;若有多个任务等待信号量,至于谁先得到信号量,那就要看内核是如何调度的了

。一般有两种可能:一是按优先级原则,等待信号量的任务中优先级最高的先得到;二是按先进先出的原则,最早开始等待信号量的那个任务先得到。工作原理所谓死锁,是指各并发任务彼此等待对方所拥有的资源,且这些并发任务在得到对方的资源之前不会释放自己所拥有的资源,从而造成大家都想得到资源而又都得

不到资源,各并发任务不能继续向前推进的状态。最简单的防止死锁发生的方法有两种:1.让每个任务先得到全部需要的资源,再进行下一步工作。2.让每个任务用同样的顺序去申请多个资源,释放资源时使用相反的顺序。10.1

.11死锁10.1.12消息队列消息用于两个任务之间的通信,消息队列是保存消息的容器。通过内核提供的服务,任务或中断服务子程序可以将一个消息放入消息队列。同样,一个或多个任务可以通过内核服务从消息队列中得到消息。通常,先

进入消息队列的消息先给任务,遵循先进先出原则(FIFO)。内核提供的典型消息队列服务如下:1.消息队列初始化,队列初始化时总是清为空;2.放一则消息到队列中去(POST);3.等待一则消息的到来(PEND);

4.无等待取得消息。如果队列中有消息则任务可以取得消息,消息从队列中取走;但如果此时队列为空,则内核不将该任务挂起,只是用特别的返回代码通知调用者,队列中没有消息。中断是指计算机在执行程序的过程中,当出现异常情

况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到以下部分:1.在前后台系统中,程序回到后台程序;2.对非占先式内核而言,程序回到被中断了的任务;3.对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。10.1.13

中断时钟节拍是特定的周期性中断。这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同应用,是机器周期的一个整数倍,一般为10~200ms,视系统的复杂性和对实时性的要求而定。内核对任务的切换和延时等操作都是基于时钟节拍的。时钟节拍的频率越快,系统的额外开销就越大。10.1

.14时钟节拍RTX51是一款小巧的针对基于8051系列嵌入式系统的多任务实时操作系统。它的使用可以简化比较复杂、有严格时间限制的软件的设计过程。RTX51主要有两个不同的可用版本:RTX5lFull标准版,既可以以循环(Round一Robin)方式执

行任务,也可以按4级任务优先级的方式切换不同优先级的任务。标准版以并行方式工作,支持中断管理,信号和消息可以通过邮箱系统在不同任务之间传递。RTX5lTiny精简版,是其标准版的一个子集。它可以很容易地运行在8051的单芯片系统而不

需要任何外部数据存储器。通用性强,系统需求低,但功能上受到限制。它只支持循环方式和信号方式的任务切换,而不支持优先级方式的任务切换。KEILC中自带了RTX5lTiny,以下只讲解RTX5lTiny的内容,出现RTX51的地方默认为其精简版RTX51Tiny。10.2RTX51系统特点RTX51

可以在所有的8051系列芯片上运行。用户只需要用标准的C语言编写RTX51程序,然后用C51编译器编译即可生成代码。RTX51程序设计需要包含实时运行头文件和必要的库文件,并且要用BL51连接/定位器来实现连接。在Keil

中,你只需要在目标选项的Target标签中的Operating中选择RTX-51Tiny,在你的头文件中加上#include<rtx51tny.h>即可。在RTX51TINY环境下生成代码,需要用到下列工具:C51编译器BL51连接/定位器A51宏汇编器此外,库文件RT

X51TNY.LIB必须存放在环境变量C51LIB所指定的路径下。RTX51Tiny版可以运行在8051的单芯片嵌入式系统上,且不需要任何外部数据存储器,但也不排斥应用程序访问外部的数据存储器。RTX51Tiny版本可以使用C51所支持的所有存储模式。所使用的存储模式只影响应用对象的存储位置

。RTX51Tiny的系统变量和应用程序的堆栈区总是存储在8051的片内RAM中(即DATA和IDATA)。典型的RTX51Tiny应用程序一般运行于SMALL存储模式下。RTX51Tiny版本使用了8051的定时器0和定时器0的中断信号

。SFR中的全局中断允许位或定时器0中断屏蔽位都可能使RTX51Tiny停止运行。因此,除非有特殊的应用目的,应该使定时器0的中断始终开启,以保证RTX51Tiny的正常运行。实时操作系统的性能参数对嵌入式系统的应

用开发也有着直接影响,RTX51的性能参数如下表所示。描述RTX51TINY版本任务数16RAM需求7Bytedata,3×(任务数)Byteidata代码要求900Byte硬件要求定时器0系统时钟100~65535周期中断响应时间<20周期任务切换时间100~700周期依赖于

堆栈装载10.3RTX51的程序结构RTX51Tiny通过循环(Round-Robin)方式来实现多任务,以达到多个无限循环或任务的准并行执行。这里的多任务并不是真正同时执行的,而是使用不同的时间片来执行,即只是宏观上的同时执行。它将可用的CPU周期分成多个

时间片,由RTX51把这些时间片分配给每一个任务使用。每个任务只能在预定的时间片里运行。然后,RTX51再切换到另一个己经准备就绪的任务,让它再执行一定的时间片。时间片一般是比较短促的,一个时间片大约

只有毫秒级时间。正是由于这个原因,在用户看来,多个任务似乎是在同时执行的。RTX51利用了一个由8051定时器中断信号驱动的定时程序来实现控制。定时器产生的周期性中断信号用来驱动RTX51的定时节拍。RTX51与用户程序中的main函数是

无关的。用户程序中即使没有main程序,操作系统也会自动从设定的任务0开始执行。如果用户程序中已经有了main函数,就必须用人工方式来启动RTX51。这对于RTX51Tiny版,可以调用os_create_task函数来完成.例:使用RTX51的Round-Robin任务方

式实现两个任务的调度执行。程序中的两个任务都是简单的计数循环。#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{os_create_task(1);/*任务l己准备就绪*/while(1)/*无限循环*/{count

er0++;/*更新计数值counter0*/}}voidjob1(void)_task_1{while(1)/*无限循环*/{counter1++;/*更新计数值counter1*/}}10.4RTX51的功能函数RTX51精简版支持的功能函数表函数描述

执行周期数os_create_task将任务移入执行队列302os_delete_task执行队列中移去某任务172os_send_signal发送一信号到某任务(从某任务调用)408(任务切换)316(快速任务切换)71(不含任务切换)os_clear_signal删除一发送信号57

isr_send_signal发送一信号到某任务(从中断调用)46os_running_task_id返回当前执行的任务号os_wait等待某事件68(对未就绪信号)160(对未就绪消息)os_wait1等待某事件os_wait2等待某事件10.4.1信号控制函数①isr_se

nd_signal函数原型charisr_send_signal(unsignedchartask_id);功能说明发送一个信号到task_id说明的任务。如果此任务已在等待一个信号,那么调用函数将使此任务就绪,准备执行。否则,信号将

存储在此任务的信号标志中。此函数只能从中断函数中调用。返回值如果执行成功,此函数返回0值;如果所指定的任务不存在,则返回-1。②os_clear_signal函数原型charos_clear_signal(unsignedchar

task_id);功能说明清除由task_id说明的任务的信号返回值如果信号清除成功,此函数返回0值;如果所指定的任务不存在,则返回-1③os_send_signal函数原型charos_send_signal(unsignedchartas

k_id);功能说明发送一个信号到task_id说明的任务。如果此任务已在等待一个信号,那么调用函数将使此任务就绪,准备执行。否则,信号将存储在此任务的信号标志中。此函数只能在任务函数中调用返回值如果执行成功,此

函数返回0值;如果所指定的任务不存在,则返回-110.4.2任务控制函数①os_create_task函数原型charos_create_task(unsignedchartask_id);功能说明启动已定义的由task_id说明的任务。此任务根据RT

X51运行规则,标记为就绪,并准备执行。返回值如果任务成功启动,此函数返回0值;如果没有task_id说明的任务,则返回-1②os_delete_task函数原型charos_delete_task(unsignedchartas

k_id);功能说明停止task_id说明的任务,此任务将从任务表中删除。返回值如果任务成功启动,此函数返回0值;如果没有task_id说明的任务,则返回-1。③os_running_task_id函数原型charos_running_task_id

(unsignedchartask_id);功能说明判断当前执行任务的编号返回值返回当前正在执行的任务的编号,返回值为0~15。10.4.3延时控制函数①os_wait函数原型charos_wait(un

signedcharevent_sel,/*将要等待的事件*/unsignedchartisks,/*将要等待的定时器时标数*/unsignedchardummy);/*未用参数*/功能说明停止当前执行的任务,并等待一个或多个事件,如时间间隔、超时、从另一个任务或中断发出的信号

等。参数event_sel说明所等待的一个事件或几个事件的组合。事件种类如下表所示。事件描述K_IVL定时器溢出K_SIG收到信号K_TMO时间片超时RTX51的事件类别os_wait函数的返回值表②os_wait1函数原型charos_wait1(unsignedcharevent_s

el);功能说明暂停当前任务,等待一个事件的发生。它是os_wait函数的一个子集,不接受针对os_wait函数提供的全部事件。参数event_sel指定了等待的事件,它只能是K_SIG。返回值当信号事件发生时,任务就被允许执行,任务的

执行将恢复。返回用于识别事件、使任务重新启动的常量。返回值描述SIG_EVENT信号被接收TMO_EVENT发生超时或事件间隔已过NOT_OKevent_sel的值非法③os_wait2函数原型charos_wait2(unsignedcharevent_sel,/*将要

等待的事件*/unsignedchartisks);/*将要等待的定时器时标数*/功能说明与os_wait相同,但是不需要dummy参数。返回值与os_wait相同10.5RTX51的任务调度RTX51利用任务状态来管理各个任务。用户为RTX51定义的每个任务都会以各种状态的某一种来运行。RTX

51内核为每个任务保留了适当的状态如下表所示。RTX51的任务状态表状态描述Running运行状态当前正在执行的任务,在任一时刻只能有一个任务处于运行状态Ready就绪状态等待执行的任务,当前任务执行完后,接着执行就绪状态任务Wa

iting等待状态等待某一事件的任务,如事件发生,任务进入就绪状态Deleted删除状态没有启动的任务Time-out超时状态与就绪状态相似,放在round-robin中尚未执行的任务RTX51以ro

und-robin多任务方式执行程序,它支持多个无限循环或任务的准并行执行。任务不是被同时执行,而是以分时的方式轮片执行。可用的CPU时钟周期被分成多个时间片,然后由RTX51将这些时间片分配给各个任务。每个任

务只允许在预定的时间片中执行,时间片用完时,RTX51就切换至另一个就绪的任务,继续执行一段时间。时间片的具体长度可以用配置函数TIMESHARING来定义。如果遇到因为一个任务处于等待并且占用了时间片而暂时无法往下执行,可以调用系统函数o

s_wait来通知RTX51,以便将当前的任务挂起而提前执行另一任务。RTX51中处理任务分配的模块称为调度程序(Scheduler)。调度程序驱动哪个任务运行是按照以下的规则进行的:(1)如果发生以下情况时,当前运行

的任务将被中断:调用os_wait函数,而所等待的事件未来到;任务的执行时间已经超过所定义的Round-Robin循环时间间隔(2)如果发生以下情况时,另一个任务将被启动:已没有正在执行的任务;将要执行的任务处在就绪状态或超时状态。

10.6RTX51的系统配置编写RTX51程序需要包含RTX51TNY.H文件。在程序中,需要用一个关键字“_task_”来声明一个函数的任务属性。RTX51程序不需要main函数。在进行连接处理时,会将启动任务0的

执行所需要的代码连接进来,作为开始执行的代码。用户可以更改配置文件CONF_TNY.A51中的以下几个参数:①系统定时器中断所用的寄存器组②系统定时器的时间间隔③Round-Robin的超时(time-out)值④内部数据存储器的大小⑤R

TX5l启动后的自由堆栈大小以下是配置文件的部分内容:;RTX51的硬件定时器;用下面的EQU可预置RTX51的定时器时间常数;用8051定时器0作为控制软件的定时器;定义定时器中断用的寄存器组INT_REGBANKEQU1;默

认为寄存器1组;定义8051定时器0溢出所需的机器周期数INT_CLOCKEQU10000;默认周期数为10000;定义Round-Robin的Timeout所需的定时器溢出数TIMESHARINGEQU5;默认为5次;注意:Round-Robin任务切换

可用TIMESHARING为0来屏蔽;RTX51堆栈空间;以下的EQU语句定义了堆栈区的片内RAM体积和最小自由堆栈空间;定义了堆栈空间耗尽后所执行的宏代码;定义最大的堆栈RAM地址RAMTOPEQU0F

FH;默认地址是255;定义最小的堆栈自由空间FREE_STACKEQU20;默认为20字节堆栈自由空间;;发生堆栈用尽时的执行代码STACK_ERRORMACROCLREA;关闭所有中断SJMP$;如堆栈空间耗尽,进入死

循环ENDM在这个配置文件中,定义了许多可以修改的参数,以适应用户特定的应用程序环境。这些参数的说明详见下表。配置文件参数说明参数描述INT_REGBANK说明RTX51系统所用的寄存器组INT_CLOCK定义系统时间间隔,系统用这个间隔产生一个中断信号,定义的数据是指每次中

断发生所需的CPU周期数TIMESHARING定义Round-Robin任务切换的超时间隔(time-out),它是定时器溢出中断次数,发生指定次数中断后切换任务。如果是0,则多任务Round-Robin机制被屏蔽RAMTOP说

明8051片内RAM的最大地址,8051为7FH,8052为0FFHFREE_STACK定义任务切换的堆栈自由空间体积字节数。RTX51会检验堆栈体积是否合理。如太小,引用STACK_ERROR宏STACK_ERROR当RTX51检测到堆栈出错时执行的宏,可以根据应用程序需

求更换这个宏10.7RTX51的应用举例采用RTX51实现的简单的交通灯控制,交通灯控制过程如下:绿灯亮,车通行;绿灯保持10秒后,闪烁3秒转亮黄灯3秒;黄灯灭后,红灯亮10秒,人通行;然后又亮绿灯,周而复始。为方便学习调试,这里采用串口输出不同的文本串来指示绿灯亮、

绿灯闪烁(文本串闪烁)、黄灯亮、红灯亮4种状态。应用演示C:\DocumentsandSettings\AllUsers\桌面\KeiluVision2.lnk小结本章介绍了RTX51Tiny版的使用。RTX51是一款适合做8051嵌入式

系统平台的实时操作系统。RTX51专门针对51设计,小巧紧凑,代码开放。很多应用证明这是一个成功的8位单片机的RTOS。但是在应用过程中应该注意它的使用场合。比如说,开发一个某家电的红外遥控器,可以用8051实现,但没必要加入个RTOS,为其

编写个专用的监控程序就可以了。此外,由于RTX51是一个多任务的操作系统,所有在它的框架下所使用的函数一般都要求有可重入性。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?