嵌入式实时操作系统调度机制分析

时间:2022-03-26 02:09:30

嵌入式实时操作系统调度机制分析

目前,嵌入式系统在各个领域得到了广泛应用,与社会经济发展、科技进步息息相关。嵌入式系统的核心能力是智能化处理,来自于其中嵌入式实时软件的控制逻辑,而复杂的逻辑一般依托嵌入实时操作系统(Embedded Real Time Operating System,以下简称ERTOS)来实现。因此,ERTOS是整个嵌入式系统的核心支撑平台,是其重要组成部分。

只有合理使用ERTOS才能开发出满足现场功能、性能需求,可靠、高效的嵌入式实时软件。而达到上述能力的前提是对ERTOS内部实现机制与算法的完整理解。本文将对嵌入式实时操作系统的核心-调度内核进行深入分析,以帮助嵌入式系统开发人员正确使用ERTOS。

1 调度内核的任务管理

1.1 任务的概念

实时应用中的复杂控制软件可以根据实时性要求划分为多个部分,并分别通过任务来实现,而任务的具体实现是执行体函数。ERTOS支持同步和异步两种任务执行方式,其调度内核提供任务切换机制,负责组织任务的执行顺序。

1.2 任务状态模型

由于处理器在任一时刻只能执行一条指令,而同一时刻会有多个任务竞争处理器使用权,因此任务会在不同状态间切换。状态切换时ERTOS调度内核负责当前任务上下文的保存。

任务有四种状态:

运行态 在运行态时任务掌握CPU使用权,任务指令得以执行。任一时刻只有一个任务处于运行态。

就绪态 就绪态是任务进入运行态的必要条件,在此状态下任务已经准备就绪,只需得到处理器使用权就可转为运行态。多个任务处于此状态时,由调度内核决定下一个将要执行的任务。

等待态 等待状态的任务未被执行,需要等待某一事件才能触发运行。

挂起态 处于挂起态的任务是静止的,可以被再次激活,从头开始运行。

只有当任务自己结束自己时(self-terminatian)才发生任务终止,任务不能从挂起态直接转为等待态。

1.3 任务切换机制

可认为调度内核也是一种能被任务占用和释放的资源。即,任务可通过占有调度权来避免任务切换。

1.4 任务优先级

最低任务优先级值为0,优先级数值越大,任务优先级越高。ERTOS支持多个相同优先级的任务。同一优先级的任务由激活顺序决定其启动顺序,处于等待状态的任务不会挂起后续的相同优先级任务。

当前优先级等级的就绪任务列表中,第一个任务为抢占任务。从等待状态释放出来的任务为就绪任务队列中排在最后的最新任务。

图2为优先级等级调度方法的一个示例。多个具有不同优先级的任务处于就绪态,其中,有三个任务的优先级为3,一个优先级为2,一个优先级为1,还有两个优先级为0。根据请求顺序,等待时间最长的任务位于队列的低端。处理器刚处理完并终止了一个任务。调度内核选择下一个要处理的任务(优先级3,第一个队列)。只有当所有更高优先级的任务离开运行态或就绪态后,即任务启动并由于终止或者转为等待态而从队列中删除后,优先级2的任务才能被处理。

以下是决定下一个执行任务的基本步骤:

? 搜索所有处于就绪或运行态任务的集合。

? 在处于就绪或运行态任务的集合中,找出具有最高优先级任务的集合。

? 在处于就绪或运行态并具有最高优先级任务的集合中,找出等待时间最长的任务。

? 1.5 调度策略

1.5.1 完全抢占式调度

完全抢占式调度是指处于运行态的任务能在任一时刻被中断,只要有高优先级的任务就绪,当前处于运行态的任务就被转为就绪态。此时任务的上下文会被保存,以便被抢占的任务能在被抢占的位置继续执行。

在完全抢占式调度方式下,响应时间与低优先级任务的运行时间无关;多个任务共享的资源在使用时需要保护。

在图3中,低优先级的任务2并没有延迟高优先级任务1的调度。

以下几种情况,调度内核将被激活:

? 成功终止一个任务;

? 成功终止一个任务,并且激活另一个任务;

? 来自任务级的API激活任务(如ActivateTask,或者在定义了任务激活的情况下消息通知、警告到达时);

? 任务状态转换为等待态;

? 任务级的资源释放;

? 从中断级返回到任务级

? 在中断服务程序的执行过程中,不会发生重调度。

? 使用完全抢占式调度的应用软件不需要使用进入调度内核的API(Schedule),但其它调度方式会用到该服务。为了使应用软件在不同的调度策略下可移植,可以在分配CPU使用权的位置通过调用Schedule来进行强制调度。

1.5.2 非抢占式调度

只有通过调用操作系统API才能进行任务切换的调度方式称作非抢占式调度。非抢占式调度会影响系统的实时性。例如:当一个运行的低优先级任务处于不可抢占阶段时,会使高优先级任务延迟到下一个重调度时刻开始运行。非抢占式调度能节省RAM消耗。

在图4中,低优先级的任务2将高优先级的任务1延迟到下一个重调度时刻(在本例中是任务2的终止时刻)。

在非抢占式任务中,任务的重调度发生在:

? 任务被系统API(TerminateTask)终止

? 任务被终止,后续任务被ChainTask激活

? 直接调用Schedule

? 调用WaitEvent将任务转为等待态

1.5.3 任务组

ERTOS允许定义任务组来综合使用抢占式和非抢占式两种调度方式。对于优先级小于等于任务组中最高优先级的任务来说,组内任务类似不可抢占任务。对于优先级大于任务组中最高优先级的任务,组内任务类似可抢占任务。

1.5.4 混和抢占式调度

ERTOS支持混和抢占式调度,此时系统中既有可抢占式任务又有不可抢占式任务,调度策略根据运行任务的调度类型而定。如果正在运行的是不可抢占式任务,那么调度策略就为非抢占式调度;如果正在运行的是可抢占式任务,那么调度策略就为抢占式调度。

在很多应用中,长时间并行执行的任务很少,对于此类任务,使用完全抢占式调度;更多的是有确定执行时间的短时任务,这些任务使用非抢占式调度会更有效。所以,对这些应用使用混合抢占式调度更为合适。

2 小结

本文对嵌入式实时操作系统的核心-调度内核的内部机制与调度算法进行了深入的剖析,包括:任务定义、任务状态模型及迁移的触发条件和任务调度策略等。上述分析和讲解有助于开发人员从正确角度分析应用需求,合理地映射功能模块到任务,选择正确的任务优先级,从而开发出符合应用特征的嵌入式实时软件。

上一篇:UP干扰的原因分析与解决方案 下一篇:場所表現としての 「をの用法について