DJI嵌入了三边:RTOS系统任务计划如何?

关于“ RTOS系统如何进行任务计划”的问题,我将从任务调度的基本概念开始,详细分析常见的调度策略,例如优先率预先抢先计划,时间切片旋转时间表,协作计划等,并解释其各自的工作原理和适用的方案。然后,我们将深入探讨任务计划的实现机制,包括任务状态的转换过程,以及调度程序如何根据这些状态和特定机会完成任务切换。同时,我还将提供特定的解决方案和实际案例分析,以解决任务计划期间可能的优先级反转问题。通过这些解释,我全面而深入地展示了我对RTOS系统任务计划的理解,希望满足DJI对嵌入式开发领域中相关知识和技能的高度要求。

Part1 RTOS系统基础入门

1.1RTOS 系统是什么

RTO,即实时操作系统(实时操作系统),定义为可以在指定时间内响应外部事件并完成相应的任务的操作系统。与普通的操作系统相比,我们与日常生活接触,例如Windows,Linux等,RTO的最大功能是“实时”。

普通的操作系统更多地关注系统资源的平衡分配和同时处理多任务,以满足用户的各种需求。例如,当我们同时打开多个应用程序时,例如浏览器,文档编辑软件和Windows系统上的音乐播放器时,该系统将尝试尽可能公平地将CPU时间分配给每个应用程序,从而使它们似乎同时运行。但是在此过程中,我们可能会感到某些操作的延迟,例如打开大文件时等待几秒钟,这在普通操作系统的使用情况下是可以接受的。

RTO完全不同,并且对处理任务的及时性有极高的要求。在RTO中,每个任务都有明确的时间限制,并且系统必须确保这些任务在指定的时间内完成,否则可能会产生严重的后果。例如,在工业自动化生产线上,机器人的运动控制必须准确到毫秒级。一旦执行控制说明被延迟,它可能会导致产品质量问题甚至生产事故;在航空航天领域,飞机的态度调整还取决于RTO的实时控制,任何轻微的延迟都可能导致飞行安全事故。

对于DJI的嵌入式设备,实时是涉及产品性能和安全性的核心要素。以DJI无人机为例,在飞行过程中,无人机需要实时收集各种传感器的数据,例如陀螺仪,加速度计,GPS等。这些传感器不断反馈无人机的飞行态度,位置,速度和其他信息,以使系统反馈。 RTO必须在很短的时间内处理和分析这些数据,并基于预设算法生成相应的控制说明,以调整无人机的飞行态度和飞行路径,以确保其稳定的飞行。如果RTO未能及时处理这些任务,则无人机可能会带来严重的后果,例如失去控制和崩溃。

1.2为什么大疆选择 RTOS 系统

DJI的产品,尤其是无人机,需要在操作过程中实时处理大量复杂的任务,这确定其对操作系统实时和可靠性的要求非常高。 RTOS系统只能满足这些需求,这主要反映在以下方面:

多任务并行处理:当DJI无人机飞行时,它必须同时处理多个任务,例如飞行态度控制,传感器数据采集和处理,图像数据传输和处理,通信数据传输和接收。例如,在执行航拍摄影时,无人机应通过复杂算法实时调整其飞行态度,以保持稳定的射击角度;另一方面,它应该快速收集由摄像机捕获的高清图像数据,并通过无线通信模块实时将这些数据实时传输到地面控制终端。 RTOS系统支持多任务并行处理,可以将独立的资源和执行时间分配给每个任务,从而确保每个任务不会彼此干扰,并有效,协作地工作。通过RTOS任务调度机制,可以根据任务的优先级和时间要求合理地安排CPU和其他系统资源,以便无人机可以同时考虑多个任务的执行,从而确保飞行稳定性和数据处理及时性。

实时帮助:在无人机飞行期间,许多任务都有严格的时间限制。例如,飞行态度控制任务需要处理传感器数据和毫秒内的控制指令的生成,以应对飞行过程中的各种紧急情况。通过优化的任务调度算法和有效的中断处理机制,RTOS系统可以在指定的时间内及时地响应和执行高优先级任务,从而满足无人机实时的严格要求。例如,当无人机遇到突然的气流干扰时,RTO可以迅速响应传感器检测到的态度变化信号,优先考虑飞行态度控制任务,并及时调整无人机的飞行态度以避免发生事故。

可靠性和稳定性:DJI无人机被广泛用于各种复杂的环境和关键领域,例如电影和电视拍摄,测量和映射,农业植物保护,功率检查等。这要求无人机操作系统具有极高的可靠性和稳定性,以确保完成任务的顺利完成。 RTOS系统已严格测试和验证,并具有完整的错误检测和恢复机制。当系统无法确保系统的稳定操作时,它可以快速修复自身。同时,RTO更精心管理和调度任务,可以有效地避免任务之间的冲突和僵局,并提高系统可靠性。例如,在电力检查任务中,无人机需要长时间飞行,并且在复杂的传输线环境中稳定。 RTOS系统的高可靠性和稳定性可以确保无人机继续稳定工作,准确地检测到传输线路故障的潜在问题。

Part2 RTOS 系统的任务调度核心机制

2.1调度策略总览

DJI在其嵌入式系统中采用弗雷托斯和C/OS-III的混合体系结构。这种创新的体系结构结合了两者的优势,并为无人机系统提供了高效且稳定的任务计划支持。在此混合体系结构中,涉及两种主要的任务调度策略:优先级预先调度和时间切片旋转计划。他们每个人都有独特的工作方法和适用的方案,并共同努力确保无人机系统的正常操作。

顾名思义,优先率预先计划是基于任务优先级的调度方法。在此计划策略下,系统将为每个任务分配优先级。当高优先级任务进入就绪状态时,它将立即中断执行的低优先级任务并抓住CPU的控制,从而确保可以及时处理高优先级任务。这种调度策略适用于需要极高的实时要求的任务,例如飞行控制命令处理,紧急障碍避免任务等。在无人机飞行过程中,飞行控制说明与无人机的飞行安全性和稳定性直接相关。一旦生成了新的飞行控制说明,就必须立即执行它们。优先提取的优先派遣可以很好地满足这一需求。

时间切片旋转计划是针对相同优先级任务的调度策略。当多个任务具有相同的优先级时,系统将为每个任务分配一个相等的时间段(即时间段),该任务在CPU上按顺序运行。当任务的时间切片用完时,即使尚未完成,它也会被暂停,然后放置在准备好的队列的末端,等待下一轮调度,下一个任务将开始在CPU上运行。这种调度策略确保了相同优先级的任务之间的公平性,从而使每个任务都有机会执行,从而避免了任务长时间占用CPU并导致其他任务未经处理的情况。例如,在图像传输和一些无人机的辅助数据处理任务中,这些任务可能具有相同的优先级。时间切片旋转计划可以确保它们都可以获得合理的CPU时间,从而实现稳定的图像数据传输和及时处理辅助数据。

2.2优先级抢占调度详解

优先级预先计划的核心原则在于系统的实时监控和对任务优先级的响应。在DJI无人机的RTOS系统中,每个任务都有一个特定的优先级值,并且值越小,优先级就越高。当系统运行时,调度程序会不断检查就绪任务队列,并在发现高优先级任务处于现成状态后立即采取行动。首先,调度程序暂停了当前执行的低优先级任务,并将任务的上下文信息保存(包括CPU寄存器的值,任务堆栈指针等)到任务的堆栈中。这些上下文信息记录任务的当前执行状态,以便在恢复执行时可以从暂停的位置继续进行后续任务。然后,调度程序将其上下文信息从高优先级任务的堆栈加载到CPU寄存器中,在暂停高优先级任务时将CPU状态切换到状态,以便高优先级任务获得CPU的控制并开始执行。

以飞行控制命令任务为例,在飞行控制过程中,飞行控制系统将实时接收来自各种传感器的数据,例如陀螺仪,加速度计等。这些传感器数据将快速处理并生成相应的飞行控制命令。这些飞行控制命令任务通常设置为高优先级。当准备好新的飞行控制命令任务时,无论系统目前执行哪些低优先级任务,例如某些非关键设备状态监控任务,飞行控制命令任务都会立即抓住CPU,以确保无人机可以根据新指令及时调整飞行态度,并确保飞行的稳定性和安全性。

实际情况:在DJI无人机的实际应用中,优先抢先计划起着至关重要的作用。例如,当无人机在飞行过程中遇到紧急情况时,例如突然的障碍物出现在您面前,需要迅速避免障碍,高优先级的飞行控制任务将通过优先抢先机制及时响应。一旦无人机避免障碍物传感器(例如双眼视觉传感器,毫米波雷达等)检测障碍物,它们将迅速传输信号到RTOS系统,并且该系统将立即生成高优先障碍避免飞行控制任务。

目前,将暂停其他低优先级任务(例如,实时图像传输中的某些图像优化处理任务),并且避免飞行控制任务将抢占CPU控制。该系统将迅速计算基于传感器数据避免障碍物所需的飞行态度调整参数,并将控制说明发送到无人机的电动机,伺服和其他执行器,以便无人机可以快速改变飞行方向并避免障碍物。避免障碍任务完成后,该系统恢复了先前暂停的低优先级任务的执行,以确保整个飞行过程的连续性和稳定性。通过这种优先抢先计划机制,DJI无人机可以快速,准确地应对复杂飞行环境中的各种紧急情况并确保飞行安全。

2.3时间片轮转调度详解

时间切片旋转计划主要用于处理具有相同优先级的任务。在DJI的嵌入式RTOS系统中,当将多个任务设置为相同的优先级时,该系统将为这些任务创建现成的队列,并为每个任务分配一个固定的时间切片。例如,假设图像传输任务和某些背景数据记录任务设置为相同的优先级,它们将被放置在相同的准备队列中。

调度程序将按顺序选择任务,并让他们按顺序在CPU上运行一个时间切片。当任务开始运行时,系统会启动计时器来记录任务的运行时间。当计时器计时器达到时间切片的长度时,无论任务是否完成当前操作,系统都会暂停任务的执行,并将其放回就绪队列的末端。

然后,调度程序从就绪队列的头部选择下一个任务,将上下文信息加载到CPU,并使其开始运行并重复自身。在图像传输任务中,在每个时间切片中,任务将读取一定数量的图像数据,并通过无线通信模块发送。在后台数据记录任务中,在每个时间切片中,该任务将记录无人机的一些关键状态数据(例如无人机的电池容量,飞行高度等)到存储设备。通过时间切片旋转计划,可以交替执行这两个具有相同优先级的任务,从而实现图像数据的持续传输和及时记录关键数据。

与优先优先级的合作:在DJI无人机的实际系统操作中,优先率预先计划和时间切片旋转计划不存在,而是孤立的,而是相互合作以共同确保系统的有效操作。优先优先级的计划确保可以首次处理关键任务,避免由于执行低优先级任务而延迟关键任务的响应,并确保系统的实时和安全性。时间切片旋转计划在相同优先级的任务之间实现了公平的CPU资源分配,从而确保所有任务都有机会被执行并提高系统资源的利用率。

例如,当无人机执行复杂的飞行任务时,飞行控制任务是优先任务。一旦生成新的飞行控制命令,它将立即抓住CPU,以确保无人机的飞行态度及时调整。在飞行控制任务之间的差距中,当未准备好较高的优先级任务时,图像传输任务和其他相同优先级的辅助任务将依次使用CPU,从而通过时间切片旋转调度机制。这不仅确保了关键任务的优先执行,例如飞行控制任务,而且还要考虑到同一级别的任务的公平执行,从而使DJI无人机可以在各种复杂的飞行方案中稳步有效地完成各种任务,例如飞行,数据传输和任务处理。

Part3 任务调度中的关键技术

3.1上下文切换技术

在DJI的嵌入式RTOS系统中,上下文切换是任务调度过程中的关键技术。这就像一个精心安排的舞台变化,确保每个任务都可以在正确的时间处于CPU“舞台”,并在离开时保留其“性能状态”,以便下次可以无缝连接。

当系统决定切换任务时,第一件事是保存当前任务的上下文。上下文主要包括CPU寄存器的状态。这些寄存器就像任务执行过程中的“小助手”,在任务执行过程中记录了各种关键信息,例如程序计数器(PCS),这些信息指示任务执行的下一个指令的地址,就像导航指导任务前进的方向一样;一般寄存器(例如R0 -R12等),该寄存器在任务执行过程中存储临时数据和操作数,并且是对执行各种计算和操作的任务的重要支持;指向任务堆栈的堆栈指针(SPS),堆栈用于存储返回地址,局部变量和函数调用的其他信息,并且是任务执行过程中的“数据仓库”。

DJI嵌入了三边:RTOS系统任务计划如何?

为了更生动地了解,我们可以将任务与持续的戏剧表演进行比较。 CPU寄存器状态是舞台上演员的表现状态,例如位置,表达,运动等,而堆栈是存储道具,服装和其他物品的仓库。堆栈指针就像仓库管理员一样,知道每个道具和服装的放置位置。当有必要切换到另一个任务时,就像暂停戏剧并让另一组演员在舞台上表演。目前,舞台工作人员(调度员)将迅速记录当前参与者的性能状态(保存CPU注册状态),并在仓库中组织项目(保存堆栈信息),以便随后的戏剧可以继续执行。

在保存上下文的过程中,通常会实现汇编语言,因为汇编语言可以直接在硬件上运行以实现高效且准确的上下文保存。例如,在ARM架构处理器中,推动指令用于将寄存器值推到堆栈上,从而保存寄存器状态。

保存当前任务上下文后,调度程序将选择要从就绪任务队列执行的下一个任务。然后,开始恢复下一个任务的上下文,这就像为新星的演员建立阶段并准备道具。调度程序将从所选任务的堆栈中读取先前保存的寄存器值,并将其加载到CPU寄存器中。同时,设置了堆栈指针以允许CPU切换到新任务的执行环境。这样,新任务可以从最后一次暂停的地方继续进行,就像戏剧性的表演无缝切换到下一个场景一样。

快速上下文切换对于系统的实时性能至关重要。在DJI无人机的飞行过程中,任务的执行时间通常以毫秒甚至微秒为单位计算。如果上下文切换时间太长,它将增加任务执行的延迟。例如,在飞行控制任务中,如果上下文切换时间太长,则可能导致无人机在时间上调整飞行态度,这可能会影响飞行的稳定性和安全性;在图像传输任务中,过度上下文切换时间可能会导致图像数据的丢失或滞后,从而影响图像的实时传输质量。因此,DJI优化了上下文切换的算法和过程,并采用有效的汇编语言,以减少上下文切换的时间开销,以确保系统可以快速响应各种任务的需求并确保无人机的高性能操作。

3.2优先级反转问题及解决

问题表现:在多任务系统中,优先级反转是一个可能的棘手问题,就像混乱的交通拥堵一样,高优先级任务被低优先级任务所阻止,并且无法顺利前进。在DJI嵌入式系统中,当多个任务共享资源时,可能会发生优先级反转。例如,假设无人机系统中有三个任务:任务A是一项高优先级飞行控制命令处理任务,该任务负责根据传感器数据实时调整无人机的飞行态度,并且对实时性能的要求非常高;任务B是一个中等优先级的图像数据处理任务,负责相机捕获的图像的实时处理和传输;任务C是低优先级设备状态监控任务,它会定期检查无人机的每个设备的状态。

在某个时候,任务C正在执行并占据共享资源(例如数据存储的缓冲区)。目前,发生A任务A的事件发生,任务A获得了CPU使用权并开始执行。但是,当任务A执行任务C需要访问的共享资源时,任务A由于被占用的资源而必须挂起,并等待任务C发布资源。在执行任务C期间,任务B进入现成状态。由于任务B的优先级高于任务C,因此任务B剥夺了任务C的CPU权限并开始执行。这会导致高优先级任务A需要等待低优先级任务C发布资源,而在等待期间,中优先级任务B在任务A之前执行,从而导致任务A延迟。

这种优先的逆转现象对DJI嵌入式系统非常有害。在无人机飞行过程中,飞行控制命令处理任务的延迟可能会导致无人机无法及时响应飞行态度的变化,从而增加了飞行损失的风险;图像数据处理任务的延迟可能会导致图像传输不合时宜,从而影响操作员对无人机飞行状态的实时监控;尽管设备状态监控任务的优先级较低,但由于优先级的逆转而无法长时间执行该任务,它也可能使无人机在设备故障发生故障时无法及时被发现和处理,从而影响无人机的整体性能和安全性。

解决方案分析:为了解决优先级逆转问题,DJI采用了其RTOS系统中的优先继承和优先级上限等机制。

优先继承机制就像“将高优先级斗篷”放在低优先级任务中,允许其暂时具有高优先级任务的力量,尽快完成资源的使用并发布资源。当低优先级任务占据高优先级任务所需的资源和高优先级任务正在等待资源时,系统会暂时将低优先级任务的优先级提高到与高优先级任务相同的水平。在上面的示例中,当任务A等待任务C所占用的共享资源时,任务C的优先级与任务A相同。这样,任务B将不会被任务B抢占使用CPU,并且可以尽快执行并发布。任务A可以获取资源并继续尽快执行,从而避免优先逆转造成的延迟。当任务C释放资源时,其优先级将恢复到其原始的低优先级级别。

优先级的上限机制从资源的角度开始,并为每个共享资源设置了固定的优先级上限。此优先级上限等于或高于所有可能访问资源的任务的最高优先级。当任务想要访问共享资源时,如果其优先级低于资源的优先级上限,则该系统将其优先级提高到优先级上限的级别。在无人机系统中,如果共享资源的优先级上限(例如数据缓冲区)设置为高于任务A,B和C的优先级,则当任务C访问该资源时,任务C的优先级将提高到优先级上限的级别。这样,在任务C接收资源的时间里,其他任务(例如任务B)也无法占用任务C的CPU使用权,即使他们进入就绪状态,因为任务C目前具有最高优先级。只有任务C发布资源时,其优先级才能返回正常,其他任务才有机会争夺CPU使用情况。通过这种方式,优先级的上限机制有效地避免了优先级的反转问题,确保高优先级任务可以及时获得所需的资源并执行它们,并改善系统的实时和稳定性。

Part4 嵌入式 面试总结

4.1 RTOS 任务有哪些状态

RTOS中的任务通常具有以下状态:现成状态,运行状态,阻止状态和悬挂状态。

就绪状态表明该任务已准备就绪执行,并且只等待调度程序的选择。创建或从阻止状态恢复任务时,它将进入现成的状态。

运行状态表明该任务正在执行。在RTO中,通常只有一个任务在运行状态,而其他任务在就绪,阻塞或悬挂状态中。

阻止状态表明该任务正在等待事件发生,例如等待信号量,等待消息队列中的消息等。

暂停状态意味着该任务已被暂停,并且不会由调度程序选择。悬浮状态通常用于暂时停止执行任务,维护或其他操作。当任务需要恢复执行时,可以将其从悬挂状态恢复到现成的状态。

不同的RTOSS可能会有一些微小的差异,但是总体而言,任务的状态可以分为这些类型。了解任务的状态对于开发实时应用程序非常重要,因为它可以帮助开发人员更好地了解任务的执行过程和系统的行为。

4.2 RTOS 任务状态如何变化

RTOS任务的状态更改通常是由以下情况引起的:

创建任务时,它将输入现成的状态,等待调度程序被选中。如果任务需要等待在执行过程中发生事件,例如等待信号量,等待消息队列中的消息等,它将从运行状态过渡到阻止状态。当任务要等待的事件发生时,它将从阻塞状态返回到现状状态。

如果任务在执行过程中被较高的优先任务抢占,则它将从运行状态过渡到现成的状态。当执行较高的优先级任务时,调度程序将重新选择任务执行,如果原始任务仍然是最高优先级就绪任务,则将再次输入运行状态。

如果任务被暂停,它将从准备状态或悬挂状态过渡。当任务需要恢复执行时,可以将其从悬挂状态恢复到现成的状态。

此外,任务还可以通过调用特定功能来主动改变其状态。例如,一个任务可以调用函数以悬挂自身,或调用函数以将自己从阻塞状态恢复为现成状态。

了解任务状态的变化对于开发实时应用程序非常重要,因为它可以帮助开发人员更好地了解任务的执行过程和系统的行为,从而更好地执行任务计划和系统优化。

4.3 RTOS 任务调度如何满足实时性要求

为了满足实时要求,RTOS任务计划需要一系列措施。首先,任务调度算法需要能够快速响应任务优先级更改和事件。例如,当准备好高优先级任务时,调度程序需要能够立即暂停当前执行任务并切换到高优先级任务执行。

其次,任务计划需要确保可以在指定时间内完成关键任务。可以通过合理地设置任务的优先级,使用适当的调度算法并优化任务的执行时间来实现这一点。例如,对于某些关键的控制任务,可以将它们优先级,以确保可以及时执行它们。

此外,RTO还可以采用一些技术来改善任务计划的实时性质。例如,可以使用中断处理机制来快速响应外部事件的发生。计时器可用于准确控制任务的执行时间;并且可以使用多核处理器并行执行多个任务,以提高系统的处理功能。

用户评论


古巷青灯

终于看到关于大疆嵌入式三面的文章了!我一直很好奇是怎样实现高效的任务调度的,这个题目太吸引人了。

    有17位网友表示赞同!


坏小子不坏

我虽然不是工程师但我也很喜欢电子产品的发展历史,大疆的创新一直很厉害!这篇文章能了解它们是如何把芯片变成实际产品的吗?

    有9位网友表示赞同!


寻鱼水之欢

RTOS 系统听起来很复杂,文章能不能解释一下它和普通操作系统之间的区别? 还有就是这款嵌入式三面在哪些实际应用中体现出来的效果?

    有19位网友表示赞同!


刺心爱人i

大疆的技术总是让我佩服!这种高度定制化的系统设计,对于复杂的任务调度应该能做到非常精准吧?期待看到更多深入的解析。

    有8位网友表示赞同!


追忆思域。

这个RTOS系统的任务调度算法是什么样的呢?文章能介绍一下吗?我觉得这样的知识对学习嵌入式开发很有帮助!

    有15位网友表示赞同!


夏以乔木

看了标题,我以为会详细讲解大疆三面系统的一些设计细节,比如电路原理和硬件架构,没想到主要还是围绕软件层面的RTOS系统。有点失望哦!

    有18位网友表示赞同!


坠入深海i

对于初学者来说,可能需要一些更基础的概念解释,才能更好地理解嵌入式三面和RTOS系统的概念。

    有11位网友表示赞同!


拥菢过后只剰凄凉

大疆的产品经常用到非常精密的传感器数据处理技术,这篇文章提到系统调度时会不会考虑传感器数据的实时要求? 还有多任务协同的优化策略?

    有7位网友表示赞同!


何年何念

学习一下嵌入式开发一直是我的愿望,大疆的技术真的很厉害!希望这篇文章能让我对RTOS系统有一个更清晰的认识,也能激发我的学习热情!

    有8位网友表示赞同!


苍白的笑〃

感觉这篇博文偏理论,缺乏一些工程实践案例的分享。如果可以结合具体的应用场景来讲解,更容易理解和记忆。

    有14位网友表示赞同!


oО清风挽发oО

我最近也在研究嵌入式系统的任务调度问题,这篇博文对我有很大参考价值!尤其是RTOS的各个功能模块以及如何进行参数配置的内容,让我受益匪浅!

    有8位网友表示赞同!


不要冷战i

其实我想了解更多大疆三面的应用场景,比如它在航空器或无人机中的作用是什么?

    有15位网友表示赞同!


野兽之美

文章介绍的非常全面,从RTOS 的概念到具体的调度策略都进行了深入的讲解。对于想要学习嵌入式开发的人来说,这是一篇很好的入门文章!

    有6位网友表示赞同!


今非昔比'

我觉得大疆三面的应用场景应该不止于此,期待未来看到更多他们基于这种新技术做出的创新和突破!

    有20位网友表示赞同!


有些人,只适合好奇~

这个标题确实很吸引人,但我感觉文章没有完全满足我的预期。我希望能够看到更具体的技术细节和案例分析。

    有8位网友表示赞同!


放肆丶小侽人

RTOS 系统的优缺点比较是什么?大疆三面在这个框架下的优势到底体现在哪些方面?这篇文章似乎没有深入探讨这样的问题

    有6位网友表示赞同!


瑾澜

大疆嵌入式三面的应用领域非常广阔,文章提到它的哪些方面值得我们更多关注?比如安全和可靠性的设计?

    有16位网友表示赞同!


▼遗忘那段似水年华

希望以后可以再更新一些关于大疆三面技术的文章,比如它在不同硬件平台上的实施方案或最新的研究成果等!

    有8位网友表示赞同!

上一篇
下一篇

为您推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@zhutibaba.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部