AUTOSAR OS对象详解之Task

2021年11月29日汽车技术评论14,8221阅读模式

前文提到,Autosar OS提供基于优先级的调度策略,具有可抢占属性和同步的机制,通过事件和资源的属性来实现。AUTOSAR中包含诸多对象(object),包括:Alarm,Application,Application mode,Counter,Event,ISR,Register Set,Resource,Schedule table,Spinlock,Task。今天详细阐述下AUTOSAR操作系统中对象中的任务调度策略

AUTOSAR OS对象详解之Task

阅读本文前,请先阅读《AUTOSAR之操作系统概览》,总体上掌握AUTOSAR OS的概览知识。

1    任务 — Task
在实时操作系统中,每个执行的动作都放在task里。代码需要按何种方式触发,就将代码放在对应的task中。AUTOSAR OS中提及的任务,包含两种类型,每个task类型又分两级Class1和Class2:
  • Basic Task:包含状态Ready,Running,Suspend
  • Extended Task:包含状态Ready,Running,Suspend和Waiting
1.1  Basic Task

Basic task是一个单点的task,意思是这个task在ready状态之后就会开始start执行,在执行过程中,它可能会被更高优先级的task抢占,但它会在抢占task完成之后继续执行。Basic task有三个状态:Ready,Running 和Suspend。默认状态是Suspend,这个task将通过显性调用转至Ready状态,如图1所示。Basic task不能等待一个指定的event或者作为延时等待。

Basic task的两个类型为BCC1和BCC2。BCC:Basic Conformance Class。

BCC1:task有唯一优先级,只有在suspended状态下才能激活。

BCC2:task可共享优先级,且能够被多次激活。激活次数可以配置。

如果出现多个task配置相同优先级,每个共享优先级的task在运行时会出现互斥。这种情况下,一个task在running状态,那么其他相同优先级的task不能抢占,只能在FIFO队列中排队等候。

Basic Task不能等待指定的时间或者延时一个时间段,因为它没有waiting状态。

考虑到实际应用,为了AUTOSAR SWC高效执行,应该分配唯一的task优先级并且使用内部资源来强行互斥,这点在配置中非常重要。

AUTOSAR OS对象详解之Task

                                 图1      Task的状态

1.2  Extended Task

Extended Task通常存在无限循环,一旦进入Running状态,任务一般不会结束,可以在Waiting状态时进入到Sleep模式,等待某个时间的结果。

Extended Task存在四个状态,除了Basic Task的三个外,还有Waiting状态,如图1所示。

Extended Task当需要等待事件触发时,会从Running状态切换到Waiting状态。事件就是一个简单的系统对象,例如读取传感器的值。当事件触发,Task就会从Waiting状态切换到Ready状态。如果Extended Task正处于Waiting状态等待事件触发,那么低优先级的Task将被执行。

扩展任务也有两级ECC1和ECC2。ECC:Extended Conformance Class

ECC1:这种类型的Task能够等待事件并且有唯一的Task优先级。因此,ECC1 Task和BCC1 Task基本一致,只是多了Waiting状态。

ECC2:这种类型的Task可以等待事件触发的同时,能够和其他task有同样的优先级。但是这个Task必须按照激活指令工作,而不能像BCC2一样,ECC2不能被多次激活。

要注意,扩展任务不适合时序分析。AUTOSAR限制任何的分析给Basic Task和ISR,这些任务的优先级都高于扩展任务。什么意思呢?这意味着,系统的硬实时方面必须具有比最高优先级扩展任务更高的优先级。

总结一下,咳咳,划重点!

  1. Basic task任务的释放,要么任务执行完成,要么有更高优先级的Task抢占,要么有中断产生。Extended Task除了以上三种情况,还可以处于等待事件触发状态,可以理解为“任务挂起”。

  2. 任务可以激活其他任务,当然也可以激活自己。

  3. 执行任务的前提是激活任务,即必须由SuspendReady→Running。

  4. 多个激活触发,可以将运行任务的激活保存下来,由调度表按照优先级执行调度。

  5. 任务通常包含程序代码的主要部分。

  6. 一个功能需求是通过不同任务的协同来实现的。

  7. 任务的激活都是通过外部触发的。

  8. 任务的结束只能由它自己完成。

  9. 等待事件的释放也是由任务自己完成的。

1.3  任务的属性

任务的配置过程中,共有五个属性:

  • Name
    在建立Task时就要考虑,根据功能起个独特、易识别的名字。
  • Priority
    分配任务的优先级,数字越大优先级越高。0是最低优先级,254是最高优先级,255为资源调度预留。
  • Activation
    允许在排队中激活状态任务的最大数,一般配置为1。
  • Schedule
    明确任务为抢占式任务还是协作式任务,这两个名词我们在讲解调度表和调度原则时展开。
  • Autostart
    如果在StartOS()时开始,就需要定义该属性。
2    调度策略 — Scheduling Policy
了解了任务之后,必须要配合任务调度策略,理解效果才能更好。任务有了,但是它自己跑不起来,前面我们提到,任务的激活都是由外部触发,外部具体是什么,那就是调度策略决定的。
调度表的作用是用来执行任务切换,通过调度策略来实现。 这个策略规定当一个任务停止执行的时候,另一个任务才应该启动。AUTOSAR操作系统指定了固定优先级的调度策略。
基于这个策略,每个任务被分配一个固定的优先级,如果多个任务同时进入到Ready状态,那么调度表将会以最高优先级的任务先执行。如果一个任务处于running,但是一个更高优先级的任务已经进入ready状态准备执行,那么这个更高优先级的任务就会抢占低优先级的任务。当更高优先级的任务执行完成,低优先级的任务才会被恢复到被抢占前的位置继续执行。
提到调度机制,首先我们要了解两个概念:抢占式和协作式。
操作系统将所有任务根据调度方式的不同,分为抢占式任务和协作式任务。

2.1  抢占式任务

抢占式任务:任务会在更高优先级任务激活后被抢占执行。
对于抢占式任务,调度表总是执行最高优先级的Ready Task,更高优先级的任务可以抢占低优先级的任务,在任务Running状态时也可以执行任务的切换。如图2所示。

AUTOSAR OS对象详解之Task

                图2    抢占式任务和协作式任务对比

2.2   协作式任务
协作式任务:任务会自愿释放CPU资源。
对于协作式任务,调度表也总是执行最高优先级Ready Task,但是高优先级的任务不能抢占低优先级的任务。任务的切换,只能在任务结束时进行。如图2所示。
那么,抢占式任务和协作式任务有何优劣特点呢?
抢占式任务,看似有些“霸道”,但是却可以提供最大的灵活性和最小的数据块划分,能有效提高CPU的使用效率,更有效地响应系统需求,软件的维护和升级更加方便简洁。
协作式任务,如果任务执行时间不是很长或者RAM需要保存时,可以使用。
思考一个case,当一个任务特别长,足够长,这时候如果用协作式任务,那么它会一直执行不完成,占用这CPU资源,其他的任务无法进入,会有多糟糕。所以,这是,通过抢占式任务及时抢占,执行完高优先级的任务后,再继续执行该协作式任务。
在一个分区Application中,抢占式任务和协作式任务可以共存。

2.3   调度表

调度表(Schedule tables),是包含了很多调度点的表,AUTOSAR OS中一般这么用调度表,比如有1ms,2ms,5ms 三个周期需要调度的任务,那么会根据公约数,生成一个表,这个表在1ms 处调度1ms任务,2ms处调度1ms和2ms任务,4ms处调度1ms和2ms任务,5ms处调度1ms和5ms任务,10ms处调度1ms,2ms,5ms任务,然后按照这样的关系循环,这就是所谓的调度表。目前有部分主流的Autosar开发商使用这种方式进行任务的调度。当然,Schedule Table有自己的状态机,Schedule Table调度方式最大的好处在于保持调度的同步性。
最后,列举几个在操作系统中使用到的调度函数,不展开介绍了,基本从名字也能看出是什么接口。比如,TerminateTask()就是任务结束时调用的,ChainTask()是任务结束时调用,同时连接到下一个任务。
详细的解释可以参看《AUTOSAR_SWS_OS.pdf》,后台回复【SWS OS】获取。
  • TerminateTask()
  • ChainTask()
  • Schedule()
  • ActivateTask()
  • SetEvent()
  • ReleaseResource()
  • IncrementCounter()
  • return from ISR()

weinxin
扫码关注公众号
关注公众号领精彩彩蛋!
AUTOSAR通信篇—AUTOSAR COM模块 汽车技术

AUTOSAR通信篇—AUTOSAR COM模块

AUTOSAR COM是AUTOSAR通讯的重要组成部分,它是从OSEK COM标准的基础上发展而来的。它提出了一个不同速率的总线网络之间进行数据交换的方法,为汽车控制单元应用软件提供了统一的通信环境...
AutoSar之方法论Methodology 汽车技术

AutoSar之方法论Methodology

AUTOSAR为汽车电子软件系统开发定义了通用的技术方法,即AUTOSAR方法论。该方法论描述了从系统底层配置到ECU可执行代码产生过程的设计步骤。AUTOSAR开发方法是基于虚拟功能总线的开发方法。...

发表评论