大疆嵌入式三面:RTOS 系统是如何任务调度的?

在众多实际项目里,像无人机飞行控制这类对实时响应要求近乎严苛的场景,RTOS 系统通过高效的任务调度,保障飞行姿态调整、传感器数据处理等关键任务有序且及时地执行,让无人机能够精准应对复杂多变的飞行环境 。又比如在大疆的一些智能影像设备中,RTOS 任务调度确保视频拍摄、图像传输与处理等任务协同工作,为用户呈现高质量的影像效果。

对于本次面试中 “RTOS 系统是如何任务调度的” 这一问题,我将从任务调度的基本概念入手,详细剖析常见的调度策略,如优先级抢占调度、时间片轮转调度以及协同调度等,阐述它们各自的工作原理与适用场景 。接着深入探讨任务调度的实现机制,包括任务状态的转换流程,以及调度器如何基于这些状态和特定时机完成任务切换。同时,我也会针对任务调度过程中可能出现的优先级反转问题,给出具体的解决方案和实际案例分析 。通过这些方面的阐述,全面且深入地展示我对 RTOS 系统任务调度的理解,希望能契合大疆在嵌入式开发领域对相关知识和技能的高要求 。

Part1.RTOS系统基础入门

1.1RTOS 系统是什么

RTOS,即实时操作系统(Real-Time Operating System) ,从定义上来说,它是一种能够在规定时间内对外部事件做出响应,并完成相应任务的操作系统。与我们日常接触的普通操作系统,如 Windows、Linux 等相比,RTOS 的最大特点就在于 “实时性”。

普通操作系统更侧重于系统资源的均衡分配和多任务的并发处理,以满足用户多样化的需求。例如,当我们在 Windows 系统上同时打开多个应用程序,如浏览器、文档编辑软件、音乐播放器时,系统会尽量公平地分配 CPU 时间给各个应用,让它们看起来像是在同时运行。但在这个过程中,我们可能会感觉到某些操作的延迟,比如打开一个大型文件时需要等待几秒钟,这在普通操作系统的使用场景中是可以接受的。

而 RTOS 则截然不同,它对任务的处理及时性有着极高的要求。在 RTOS 中,每个任务都有明确的时间限制,系统必须确保这些任务在规定的时间内完成,否则可能会导致严重的后果。例如在工业自动化生产线上,机器人的动作控制必须精确到毫秒级,一旦控制指令的执行出现延迟,就可能导致产品质量问题甚至生产事故;在航空航天领域,飞行器的飞行姿态调整也依赖于 RTOS 的实时控制,任何微小的延迟都可能引发飞行安全事故。

对于大疆的嵌入式设备而言,实时性更是关乎产品性能和安全的核心要素。以大疆无人机为例,在飞行过程中,无人机需要实时采集来自各种传感器的数据,如陀螺仪、加速度计、GPS 等,这些传感器不断地向系统反馈无人机的飞行姿态、位置、速度等信息。RTOS 必须在极短的时间内对这些数据进行处理和分析,并根据预设的算法生成相应的控制指令,以调整无人机的飞行姿态和飞行路径,确保其稳定飞行。如果 RTOS 不能及时处理这些任务,无人机就可能出现失控、坠毁等严重后果。

1.2为什么大疆选择 RTOS 系统

大疆的产品,尤其是无人机,在运行过程中需要实时处理大量复杂的任务,这就决定了它对操作系统的实时性和可靠性有着极高的要求,而 RTOS 系统恰好能够满足这些需求,主要体现在以下几个方面:

⑴多任务并行处理:大疆无人机在飞行时,要同时处理飞行姿态控制、传感器数据采集与处理、影像数据传输与处理、通信数据收发等多个任务。例如,在进行航拍时,无人机一方面要通过复杂的算法实时调整自身的飞行姿态,以保持稳定的拍摄角度;另一方面,要快速采集相机拍摄的高清影像数据,并通过无线通信模块将这些数据实时传输到地面控制端。RTOS 系统支持多任务并行处理,能够为每个任务分配独立的资源和执行时间,确保各个任务之间互不干扰,高效协同工作。通过 RTOS 的任务调度机制,可以根据任务的优先级和时间要求,合理安排 CPU 等系统资源,使无人机能够同时兼顾多个任务的执行,保证飞行的稳定性和数据处理的及时性。

⑵实时性保障:在无人机的飞行过程中,许多任务都具有严格的时间限制,如飞行姿态控制任务需要在毫秒级的时间内完成对传感器数据的处理和控制指令的生成,以应对飞行过程中的各种突发情况。RTOS 系统通过优化的任务调度算法和高效的中断处理机制,能够确保高优先级任务在规定的时间内得到及时响应和执行,满足无人机对实时性的苛刻要求。例如,当无人机遇到突然的气流干扰时,RTOS 能够迅速响应传感器检测到的姿态变化信号,优先调度飞行姿态控制任务,及时调整无人机的飞行姿态,避免发生飞行事故。

⑶可靠性与稳定性:大疆无人机广泛应用于各种复杂环境和关键领域,如影视拍摄、测绘、农业植保、电力巡检等,这就要求无人机的操作系统具备极高的可靠性和稳定性,以确保任务的顺利完成。RTOS 系统经过严格的测试和验证,具有完善的错误检测和恢复机制,能够在系统出现故障时快速进行自我修复,保证系统的稳定运行。同时,RTOS 对任务的管理和调度更加精细,能够有效避免任务之间的冲突和死锁等问题,提高系统的可靠性。例如,在电力巡检任务中,无人机需要长时间、稳定地飞行在复杂的输电线路环境中,RTOS 系统的高可靠性和稳定性能够确保无人机持续稳定地工作,准确地检测输电线路的故障隐患。

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

2.1调度策略总览

大疆在其嵌入式系统中采用了 FreeRTOS 与 μC/OS - III 混合架构,这一创新的架构融合了两者的优势,为无人机系统提供了高效、稳定的任务调度支持。在这个混合架构中,涉及到两种主要的任务调度策略:优先级抢占调度和时间片轮转调度 ,它们各自有着独特的工作方式和适用场景,共同协作以确保无人机系统的正常运行。

优先级抢占调度,顾名思义,是基于任务优先级的一种调度方式。在这种调度策略下,系统会为每个任务分配一个优先级,当有高优先级任务进入就绪状态时,它会立即打断正在执行的低优先级任务,抢占 CPU 的控制权,从而保证高优先级任务能够得到及时处理。这种调度策略适用于那些对实时性要求极高的任务,例如飞控指令的处理、紧急避障任务等。在无人机飞行过程中,飞控指令直接关系到无人机的飞行安全和稳定性,一旦有新的飞控指令产生,必须立即得到执行,优先级抢占调度就能很好地满足这一需求。

而时间片轮转调度则是针对相同优先级任务的一种调度策略。当多个任务具有相同的优先级时,系统会为每个任务分配一个相等的时间片段(即时间片),这些任务按照顺序轮流在 CPU 上运行。当一个任务的时间片用完后,即使它还没有完成,也会被暂停,然后被放入就绪队列的末尾,等待下一轮的调度,下一个任务则开始在 CPU 上运行。这种调度策略确保了相同优先级任务之间的公平性,使得每个任务都能有机会得到执行,避免了某个任务长时间占用 CPU 而导致其他任务得不到处理的情况。例如在无人机的影像传输和一些辅助数据处理任务中,这些任务可能具有相同的优先级,时间片轮转调度就可以保证它们都能得到合理的 CPU 时间,从而实现影像数据的稳定传输和辅助数据的及时处理。

2.2优先级抢占调度详解

优先级抢占调度的核心原理在于系统对任务优先级的实时监测和响应。在大疆无人机的 RTOS 系统中,每个任务都被赋予了一个特定的优先级数值,数值越小表示优先级越高。当系统运行时,调度器会不断地检查就绪任务队列,一旦发现有高优先级任务进入就绪状态,它就会立即采取行动。首先,调度器会暂停当前正在执行的低优先级任务,将该任务的上下文信息(包括 CPU 寄存器的值、任务堆栈指针等)保存到该任务的堆栈中,这些上下文信息记录了任务当前的执行状态,以便后续任务恢复执行时能够从暂停的地方继续。然后,调度器会从高优先级任务的堆栈中加载其上下文信息到 CPU 寄存器中,使 CPU 的状态切换到高优先级任务被暂停时的状态,从而让高优先级任务获取 CPU 的控制权,开始执行。

以飞控指令任务为例,在无人机飞行过程中,飞控系统会实时接收来自各种传感器的数据,如陀螺仪、加速度计等,这些传感器数据会被快速处理并生成相应的飞控指令,这些飞控指令任务通常被设置为高优先级。当新的飞控指令任务就绪时,无论此时系统正在执行什么低优先级任务,如一些非关键的设备状态监测任务,飞控指令任务都会立即抢占 CPU,确保无人机能够及时根据新的指令调整飞行姿态,保证飞行的稳定性和安全性。

实际案例:在大疆无人机的实际应用中,优先级抢占调度发挥着至关重要的作用。例如,当无人机在飞行过程中遇到突发状况,如前方突然出现障碍物需要快速避障时,高优先级的飞控任务就会通过优先级抢占机制及时响应。无人机上的避障传感器(如双目视觉传感器、毫米波雷达等)一旦检测到障碍物,会迅速将信号传递给 RTOS 系统,系统会立即生成高优先级的避障飞控任务。

此时,正在执行的其他低优先级任务(如实时图传画面的一些图像优化处理任务)会被暂停,避障飞控任务抢占 CPU 控制权。系统会根据传感器数据快速计算出避障所需的飞行姿态调整参数,并向无人机的电机、舵机等执行机构发送控制指令,使无人机能够迅速改变飞行方向,避开障碍物。待避障任务完成后,系统再恢复之前被暂停的低优先级任务的执行,确保整个飞行过程的连续性和稳定性。通过这种优先级抢占调度机制,大疆无人机能够在复杂的飞行环境中快速、准确地应对各种突发情况,保障飞行安全。

2.3时间片轮转调度详解

时间片轮转调度主要应用于处理相同优先级的任务。在大疆嵌入式的 RTOS 系统中,当多个任务被设定为相同优先级时,系统会为这些任务创建一个就绪队列,并为每个任务分配一个固定时长的时间片。例如,假设影像传输任务和一些后台数据记录任务被设置为相同优先级,它们会被放入同一个就绪队列中。

图片

调度器会按照队列的顺序,依次选取任务并让其在 CPU 上运行一个时间片的时长。当一个任务开始运行时,系统会启动一个定时器,用于记录该任务的运行时间。当定时器计时达到时间片的长度时,无论该任务是否完成当前操作,系统都会暂停该任务的执行,并将其放回就绪队列的末尾。

然后,调度器从就绪队列的头部选取下一个任务,为其加载上下文信息到 CPU,使其开始运行,如此循环往复。在影像传输任务中,每个时间片内,任务会读取一定量的影像数据,并通过无线通信模块将其发送出去;而在后台数据记录任务中,每个时间片内,任务会将无人机的一些关键状态数据(如电池电量、飞行高度等)记录到存储设备中。通过时间片轮转调度,这两个相同优先级的任务能够交替执行,实现影像数据的持续传输和关键数据的及时记录。

与优先级抢占的协同:在大疆无人机的实际系统运行中,优先级抢占调度和时间片轮转调度并不是孤立存在的,而是相互配合,共同保障系统的高效运行。优先级抢占调度确保了关键任务能够在第一时间得到处理,避免因低优先级任务的执行而延误关键任务的响应,保障了系统的实时性和安全性。而时间片轮转调度则在相同优先级任务之间实现了公平的 CPU 资源分配,保证了各个任务都能有机会执行,提高了系统资源的利用率。

例如,在无人机进行复杂的飞行任务时,飞控任务作为最高优先级任务,一旦有新的飞控指令产生,它会立即抢占 CPU,确保无人机的飞行姿态得到及时调整。而在飞控任务执行的间隙,当没有更高优先级任务就绪时,相同优先级的影像传输任务和其他辅助任务则通过时间片轮转调度机制,轮流使用 CPU。这样,既保证了飞控任务等关键任务的优先执行,又兼顾了同级别任务的公平执行,使得大疆无人机能够在各种复杂的飞行场景下,稳定、高效地完成飞行、数据传输、任务处理等多项任务。

Part3.任务调度中的关键技术

3.1上下文切换技术

在大疆嵌入式的 RTOS 系统中,上下文切换是任务调度过程中的一项关键技术,它就像是一场精心编排的舞台换幕,确保每个任务都能在合适的时间登上 CPU 这个 “舞台”,并且在离开时保留好自己的 “演出状态”,以便下次能够无缝衔接。

当系统决定进行任务切换时,首先要做的就是保存当前任务的上下文。上下文主要包括 CPU 寄存器的状态,这些寄存器就像是任务执行过程中的 “小助手”,记录着任务运行时的各种关键信息,如程序计数器(PC),它指示着任务下一条要执行的指令地址,就如同导航为任务指引前进的方向;通用寄存器(如 R0 - R12 等),它们存储着任务执行过程中的临时数据和操作数,是任务进行各种计算和操作的重要依托;堆栈指针(SP),它指向任务的堆栈,堆栈则用于存储函数调用的返回地址、局部变量等信息,是任务运行时的 “数据仓库”。

为了更形象地理解,我们可以把任务比作一场正在进行的戏剧表演,CPU 寄存器状态就是演员们在舞台上的站位、表情、动作等表演状态,而堆栈则是后台存放道具、服装等物品的仓库,堆栈指针就像是仓库管理员,知道每个道具和服装放在哪里。当需要切换到另一个任务时,就好比要暂停这场戏剧表演,让另一组演员上台表演。此时,舞台工作人员(调度器)会迅速记录下当前演员们的表演状态(保存 CPU 寄存器状态),并把仓库里的物品整理好(保存堆栈信息),以便后续这场戏剧能够继续表演。

在保存上下文的过程中,通常会使用汇编语言来实现,因为汇编语言能够直接对硬件进行操作,实现高效、精准的上下文保存。例如,在 ARM 架构的处理器中,会使用 PUSH 指令将寄存器的值压入堆栈,从而实现寄存器状态的保存。

完成当前任务上下文的保存后,调度器会从就绪任务队列中选择下一个要执行的任务。然后,开始恢复下一个任务的上下文,这就像是为新上台的演员们布置舞台、准备道具。调度器会从选定任务的堆栈中读取之前保存的寄存器值,并将其加载到 CPU 寄存器中,同时设置好堆栈指针,让 CPU 切换到新任务的执行环境。这样,新任务就可以从上次暂停的地方继续执行,就像戏剧表演无缝切换到了下一幕。

快速的上下文切换对于系统的实时性能至关重要。在大疆无人机的飞行过程中,任务的执行时间往往是以毫秒甚至微秒来计算的,如果上下文切换的时间过长,就会导致任务执行的延迟增加。例如,在飞控任务中,如果上下文切换时间过长,可能会导致无人机对飞行姿态的调整不及时,从而影响飞行的稳定性和安全性;在影像传输任务中,过长的上下文切换时间可能会导致图像数据的丢失或卡顿,影响图像的实时传输质量。因此,大疆通过优化上下文切换的算法和流程,采用高效的汇编语言实现,尽可能地减少上下文切换的时间开销,确保系统能够快速响应各种任务的需求,保障无人机的高性能运行。

3.2优先级反转问题及解决

①问题呈现:在多任务系统中,优先级反转是一个可能出现的棘手问题,就像一场混乱的交通堵塞,高优先级的任务被低优先级的任务阻挡,无法顺利前行。在大疆嵌入式系统中,当多个任务共享资源时,就有可能发生优先级反转现象。例如,假设无人机系统中有三个任务:任务 A 是高优先级的飞控指令处理任务,它负责根据传感器数据实时调整无人机的飞行姿态,对实时性要求极高;任务 B 是中优先级的影像数据处理任务,它负责对相机拍摄的图像进行实时处理和传输;任务 C 是低优先级的设备状态监测任务,它定期检查无人机的各个设备状态。

在某一时刻,任务 C 正在执行,并占用了一个共享资源(比如一个用于数据存储的缓冲区)。此时,任务 A 等待的事件发生,任务 A 获得 CPU 使用权开始执行。但当任务 A 执行到需要访问任务 C 占用的共享资源时,由于资源被占用,任务 A 不得不挂起,等待任务 C 释放资源。而在任务 C 执行过程中,任务 B 进入就绪态,由于任务 B 的优先级高于任务 C,任务 B 剥夺任务 C 的 CPU 使用权开始执行。这样就导致了高优先级的任务 A 需要等待低优先级的任务 C 释放资源,而在等待期间,中优先级的任务 B 却先于任务 A 执行,使得任务 A 的执行被延迟。

这种优先级反转现象对大疆嵌入式系统的危害是巨大的。在无人机飞行过程中,飞控指令处理任务的延迟可能会导致无人机无法及时响应飞行姿态的变化,增加飞行失控的风险;影像数据处理任务的延迟可能会导致图像传输不及时,影响操作人员对无人机飞行状态的实时监控;设备状态监测任务虽然优先级较低,但如果因为优先级反转导致其长时间无法执行,也可能会使无人机在出现设备故障时无法及时被发现和处理,从而影响无人机的整体性能和安全性。

②解决方案分析:为了解决优先级反转问题,大疆在其 RTOS 系统中采用了优先级继承和优先级天花板等机制。

优先级继承机制就像是给低优先级任务 “穿上了高优先级的外衣”,让它暂时拥有高优先级任务的权力,尽快完成资源的使用并释放资源。当低优先级任务占用了高优先级任务需要的资源时,并且高优先级任务正在等待该资源,系统会临时将低优先级任务的优先级提升到与高优先级任务相同的水平。在上述例子中,当任务 A 等待任务 C 占用的共享资源时,任务 C 的优先级会被提升到与任务 A 相同。这样,任务 C 就不会被任务 B 抢占 CPU 使用权,能够尽快执行并释放资源,任务 A 也就能尽快获得资源继续执行,从而避免了优先级反转带来的延迟。当任务 C 释放资源后,它的优先级会恢复到原来的低优先级水平。

优先级天花板机制则是从资源的角度出发,为每个共享资源设定一个固定的优先级天花板。这个优先级天花板等于或者高于所有可能访问该资源的任务的最高优先级。当一个任务想要访问某个共享资源时,如果它的优先级低于该资源的优先级天花板,系统会将其优先级临时提升到优先级天花板的水平。在无人机系统中,如果共享资源(如数据缓冲区)的优先级天花板被设定为高于任务 A、B、C 的优先级,那么当任务 C 访问该资源时,任务 C 的优先级会被提升到优先级天花板的水平。这样,在任务 C 占用资源期间,其他任务(如任务 B)即使进入就绪态,也无法抢占任务 C 的 CPU 使用权,因为任务 C 此时的优先级是最高的。只有当任务 C 释放资源后,其优先级才会恢复正常,其他任务才有机会竞争 CPU 使用权。通过这种方式,优先级天花板机制有效地避免了优先级反转问题,确保了高优先级任务能够及时获得所需资源并执行,提高了系统的实时性和稳定性。

Part4.嵌入式面试总结

4.1 RTOS 任务有哪些状态

RTOS 中的任务通常有以下几种状态:就绪状态、运行状态、阻塞状态和挂起状态。

就绪状态表示任务已经准备好执行,只等待被调度器选中。当一个任务被创建或者从阻塞状态恢复时,它会进入就绪状态。

运行状态表示任务正在执行。在 RTOS 中,通常只有一个任务处于运行状态,其他任务处于就绪、阻塞或挂起状态。

阻塞状态表示任务正在等待某个事件的发生,如等待一个信号量、等待一个消息队列中的消息等。当任务等待的事件发生时,它会从阻塞状态恢复到就绪状态。

挂起状态表示任务被暂停执行,不会被调度器选中。挂起状态通常用于暂时停止一个任务的执行,以便进行调试、维护或其他操作。当任务需要恢复执行时,可以从挂起状态恢复到就绪状态。

不同的 RTOS 可能会有一些细微的差别,但总体上任务的状态可以分为这几种。了解任务的状态对于开发实时应用程序非常重要,因为它可以帮助开发人员更好地理解任务的执行流程和系统的行为。

4.2 RTOS 任务状态如何变化

RTOS 任务的状态变化通常由以下几种情况引起:

当任务被创建时,它会进入就绪状态,等待被调度器选中执行。如果任务在执行过程中需要等待某个事件的发生,如等待一个信号量、等待一个消息队列中的消息等,它会从运行状态转换为阻塞状态。当任务等待的事件发生时,它会从阻塞状态恢复到就绪状态。

如果任务在执行过程中被更高优先级的任务抢占,它会从运行状态转换为就绪状态。当更高优先级的任务执行完成后,调度器会重新选择任务执行,如果原来的任务仍然是最高优先级的就绪任务,它会再次进入运行状态。

如果任务被挂起,它会从就绪状态或运行状态转换为挂起状态。当任务需要恢复执行时,可以从挂起状态恢复到就绪状态。

此外,任务还可以通过调用特定的函数来主动改变自己的状态。例如,任务可以调用函数将自己挂起,或者调用函数将自己从阻塞状态恢复到就绪状态。

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

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

为了满足实时性要求,RTOS 的任务调度需要采取一系列措施。首先,任务调度算法需要能够快速地响应任务的优先级变化和事件的发生。例如,当一个高优先级的任务就绪时,调度器需要能够立即暂停当前正在执行的任务,切换到高优先级的任务执行。

其次,任务调度需要保证关键任务能够在规定的时间内完成。这可以通过合理地设置任务的优先级、使用合适的调度算法以及优化任务的执行时间等方式来实现。例如,对于一些关键的控制任务,可以将它们的优先级设置得非常高,以确保它们能够及时得到执行。

此外,RTOS 还可以采用一些技术来提高任务调度的实时性。例如,可以使用中断处理机制来快速响应外部事件的发生;可以使用定时器来精确地控制任务的执行时间;可以使用多核处理器来并行执行多个任务,提高系统的处理能力。

THE END