嵌入式开发:如何用RTOS实现实时动态负载平衡
人们很容易忘记,嵌入式Linux不能为所有嵌入式开发者做所有的事情。虽然它适用于一些具有许多兆字节内存和强大处理器的应用程序,但有越来越多的使用案例表明,嵌入式Linux和类似操作系统的开销会对确定性和内存消耗产生负面影响。
蜂窝调制解调器、高性能视频处理和复杂的汽车控制器只是在小尺寸、低功耗多核平台上的对称多处理(SMP)架构下运行的高度确定性应用的几个例子。这种系统需要底层操作系统的核心分配和任务调度支持,以满足严格的实时要求,同时不影响资源的使用。
对于资源受限的平台上的SMP来说,嵌入式Linux不是一个可行的选择,而且很少有实时操作系统(RTOS)支持SMP。因此,开发人员必须创建自己的方法来跨多个内核调度和管理任务。
随着越来越多的嵌入式设备需要在多个内核上部署确定性工作负载,RTOS级的动态负载平衡需求只会越来越大。
对称多处理与非对称多处理
SMP和非对称多处理(AMP)是两个或多个处理器协同工作来调度和运行工作负载的架构模型。虽然SMP系统具有相同的内核,可以运行分配给它们的任何任务,但AMP系统通常依赖单个主内核来根据可用性和优先级调度和分配任务。在AMP下,内核本身不需要相同的类型或架构(例如,MPU可以与GPU协同工作),任务通常特定于内核类型。
当嵌入式开发人员可以依赖一个稳定且可预测的环境,以便操作系统可以有效地分配工作负载而没有显著的开销时,AMP模型工作得最好。相比之下,对于在事件不断变化并需要在内核间动态转移工作负载的环境中运行的应用程序,SMP模型通常效果最佳。例如,许多手机使用SMP,例如那些在ArmCortex-A53平台上实现蜂窝调制解调器功能的手机。
为了在多个内核之间有效地分配应用线程,嵌入式软件开发人员使用了动态负载平衡技术。主要目标是确保应用在运行时在内核之间平均分配计算工作负载,并保证优先级最高的线程不会被优先级较低的线程抢占。
动态负载平衡背后的原则
动态负载平衡中的“动态”是指在运行时对线程调度的持续评估,它使应用程序能够适应不断变化的任务需求和系统条件。动态负载平衡对于以下方面至关重要:
l提高利用率:通过在多个内核之间分配任务,嵌入式开发人员可以充分利用每个内核的计算能力,从而提高整体系统利用率。
l缩短响应时间:适当的负载平衡可确保将关键任务分配给竞争最少的内核,从而缩短响应时间并提高任务执行的可预测性。
l容错:负载平衡可将任务重新分配给未发生故障的内核,从而确保系统功能持续运行,有助于减轻软件故障和硬件故障的影响。
l可扩展性:随着系统需求的增长和更多内核的添加,平均分配任务对于扩展容量而不引入瓶颈至关重要。
嵌入式Linux带有负载平衡机制,但有一个缺点:操作系统会产生很高的开销,这可能会严重影响确定性。由于大多数硬实时RTOS不支持SMP架构上的负载平衡,开发者通常求助于构建他们自己的支持。这项工作本身也存在挑战:
l资源使用:由于每个内核都有自己的缓存、寄存器和其他独特的功能,嵌入式开发人员必须花时间彻底了解平台,以便在不影响性能或资源争用的情况下有效地分配任务。
l内存访问:如果开发人员将具有公共内存池的任务分配给不同的内核,如果没有充分考虑应用程序的控制和数据流,就可能会出现内存访问争用问题。
l任务优先级:开发人员必须了解所有任务的优先级和截止日期,以确保高优先级任务被分配了足够的资源和时间来避免延迟。
l动态适应:因为负载平衡是一个适应不断变化的系统条件的过程,所以开发人员必须实现某种反馈循环或控制机制,以便在运行时不断重新评估线程分配并调整策略。
l同步开销:开发人员必须最大限度地减少内核间任务切换所需的开销,以减少延迟并保持系统的实时响应能力。
RTOS级别的负载平衡
像PX5RTOS这样的RTOS是为基于多核MPU的应用程序设计的,它提供了内置的负载平衡,与嵌入式Linux和其他操作系统相比,它可以以显著更低的开销满足硬实时决定论。PX5RTOS实现了本机POSIXpthreadsAPI,运行所需空间小于10KB,具有极强的可移植性和资源效率,使嵌入式开发人员无需构建自己的负载均衡器。
这款RTOS本地负载平衡器的运行方式与许多流行的负载平衡技术相同:
1.给定任意数量的内核,RTOS会跟踪每个内核上运行的线程。当一个内核变得空闲并且一个线程可用于调度时,RTOS调度该线程在该内核上运行。
2.如果没有空闲的内核,并且有一个新线程准备就绪,则RTOS使用该线程的优先级进行调度:如果其优先级高于当前正在运行的任何其他线程,则RTOS会调度新线程来抢占正在运行的线程。如果其优先级低于当前运行的任何线程,RTOS将等待下一个可用的内核运行。
这种方法使用与嵌入式Linux相同的处理器亲和API,使得开发人员可以轻松地将线程分配给特定的内核,并依靠RTOS来执行这种分配。与大多数RTOS一样,开发人员必须确保共享资源的正确管理,以避免争用问题。
并非所有线程都被认为是平等的
在典型的单核、基于优先级的抢占式调度环境中,嵌入式开发人员一次只能运行一个线程。在SMP环境中,这种情况无法保证,因为多线程可以在任意数量的内核上并行运行。为了避免这种行为对要求在给定时间只运行最高优先级线程的系统的潜在负面影响,PX5RTOS使开发人员能够配置调度,只允许同等优先级的线程在所有内核上并行运行。这种方法加强了更严格的并行度,使开发人员对他们系统的可预测性更有信心。
结论
开发人员必须实现动态负载平衡,才能在占地面积小、功耗低的多核平台上实现硬实时性能和响应能力。像PX5RTOS加载平衡功能这样的机制支持就绪应用程序线程与可用内核的动态配对,所有这些都在一个超小型(小于10KB)、超可移植(具有完全兼容的pthreadsAPI)和经过严格测试(每个版本的100%C语句和分支决策覆盖率)的包中。
RTOS本机负载平衡使嵌入式开发开发人员能够专注于应用程序逻辑和测试,而不必构建自己的跨多个处理器分配工作负载的方法。