前文提到,Autosar OS提供基于优先级的调度策略,具有可抢占属性和同步的机制,通过事件和资源的属性来实现。AUTOSAR中包含诸多对象(object),包括:Alarm,Application,Application mode,Counter,Event,ISR,Register Set,Resource,Schedule table,Spinlock,Task。今天详细阐述下AUTOSAR操作系统中对象中的任务和调度策略。
阅读本文前,请先阅读《AUTOSAR之操作系统概览》,总体上掌握AUTOSAR OS的概览知识。
-
Basic Task:包含状态Ready,Running,Suspend -
Extended Task:包含状态Ready,Running,Suspend和Waiting
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优先级并且使用内部资源来强行互斥,这点在配置中非常重要。
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,这些任务的优先级都高于扩展任务。什么意思呢?这意味着,系统的硬实时方面必须具有比最高优先级扩展任务更高的优先级。
总结一下,咳咳,划重点!
-
Basic task任务的释放,要么任务执行完成,要么有更高优先级的Task抢占,要么有中断产生。Extended Task除了以上三种情况,还可以处于等待事件触发状态,可以理解为“任务挂起”。
-
任务可以激活其他任务,当然也可以激活自己。
-
执行任务的前提是激活任务,即必须由Suspend→Ready→Running。
-
多个激活触发,可以将运行任务的激活保存下来,由调度表按照优先级执行调度。
-
任务通常包含程序代码的主要部分。
-
一个功能需求是通过不同任务的协同来实现的。
-
任务的激活都是通过外部触发的。
-
任务的结束只能由它自己完成。
-
等待事件的释放也是由任务自己完成的。
1.3 任务的属性
任务的配置过程中,共有五个属性:
-
Name 在建立Task时就要考虑,根据功能起个独特、易识别的名字。 -
Priority 分配任务的优先级,数字越大优先级越高。0是最低优先级,254是最高优先级,255为资源调度预留。 -
Activation 允许在排队中激活状态任务的最大数,一般配置为1。 -
Schedule 明确任务为抢占式任务还是协作式任务,这两个名词我们在讲解调度表和调度原则时展开。 -
Autostart 如果在StartOS()时开始,就需要定义该属性。
2.1 抢占式任务
图2 抢占式任务和协作式任务对比
2.3 调度表
- TerminateTask()
- ChainTask()
- Schedule()
- ActivateTask()
- SetEvent()
- ReleaseResource()
- IncrementCounter()
- return from ISR()