1、OSEK OS
1.1 OSEK OS介绍
AUTOSAR OS是基于 OSEK OS发展而来,向下兼容OSEK OS,所以了解AUTOSAR OS之前我们了解一下OSEK OS。
OSEK操作系统(OS)是一个为分布式嵌入式系统所定义的单核操作系统。为适应汽车电子可靠性、实时性、成本敏感性的需求,OSEK OS特征如下:
1.2 OSEK OS处理等级
OSEK操作系统定义了三层处理等级:任务层(task level)、调度器的逻辑层(logicallevel for scheduler)和中断层(interrupt level)。如下图所示:
根据同一调度系统里任务的可抢占属性,任务层分为全抢占、非抢占和混合抢占(即既有可抢占任务也有不可抢占任务)。任务的执行时序由调度器(Scheduler)根据调度规则而决定。处理器中有一部分中断是不受操作系统控制的中断,称为一类中断,受操作系统控制的中断称为二类中断。
OSEK操作系统的优先级规则如下:
- 中断优先级总是高于任务优先级;
- 不同的中断和任务可以有一个或多个优先级;
- 中断和任务的优先级是静态分配(配置好的)的;
- 同一优先级的任务依照 FIFO 原则决定执行次序;
- 通过资源调度可实现优先级天花板模式(ceiling priority)。
AUTOSAR OS 完全继承了上述特性。
1.3 OSEK OS任务
1.3.1 基本任务与扩展任务
Task是OS调度的基本单位,Runables和底层基础服务都运行在Task中。
OSEK 操作系统中有两种任务:基本任务(Basic Task)和扩展任务(Extended Task)。基本任务有三种不同的状态,分别为运行状态(running)、就绪状态(ready)和阻塞状态(suspending)。处于阻塞状态的任务由API函数或报警器(Alarm)激活进入就绪状态,处于就绪状态的任务由调度器决定是否启动进入运行状态,处于运行状态的任务可能被高优先级的任务或中断抢占从而进入就绪状态,任务运行结束后将自己挂起进入阻塞状态。与基本任务相比,扩展任务多了等待状态,当任务的运行需要等待某一或某些事件时进入等待状态(waiting),当任务所等待的事件被置位时,任务进入就绪状态。基本任务与扩展任务的状态机及其之间的切换如下图所示。
- SUSPENDED(阻塞 激活)→ READY(就绪):必须由外部触发ActivateTask
- READY(就绪 启动)→ RUNNING(运行):只能由调度器触发
- RUNNING(运行 被抢占)→ READY(就绪):只能由调度器触发
- RUNNING(运行 挂起)→ SUSPENDED(阻塞):只能由Task自身触发TeminateTask
- RUNNING(运行 等待)→ WAITING(等待):只能由Task自身出发WaitEvent
- WAITING(等待 触发)→ READY(就绪):必须由外部事件触发SetEvent
因为基本任务没有等待状态,所以只能够在任务启动和终结时进行同步,基本任务的优点是占用较少的内存和执行时间。扩展任务的优点是包含多个同步点,没有同步请求的麻烦,当进一步的工作出现信息缺失时,任务切换至等待状态;其缺点是占用较多的内存和执行时间。
1.3.2 OSEK OS任务符合类
根据不同的软硬件需求,OSEK OS定义了四种符合类(Conformance classes, CC),分别是 BCC1, BCC2, ECC1和ECC2 (B:Basic, E:Extend) ,各种符合类及其属性见下表。
属性 | BCC1 | BCC2 | ECC1 | ECC2 |
支持多次任务激活 | No | Yes | No | Yes |
每个任务级的任务数 | 1 | ≥1 | 1 | ≥1 |
基本任务 | Yes | Yes | Yes | Yes |
扩展任务 | No | No | Yes | Yes |
由上表可知,基本符合类BCC1和BCC2仅支持基本任务,扩展符合类ECC1和ECC2支持基本任务和扩展任务;一类符合类BCC1和ECC1不支持多次任务激活请求,每个优先级只能有一个任务;二类符合类 BCC2 和ECC2支持多次任务激活请求,每个优先级可以有多个任务。
1.4 OSEK OS优先级天花板模式
下图显示了一个优先级反转问题,两个任务对一个信号量的共同访问顺序(在全抢占系统中,任务T1优先级最高)。任务T4优先级低,占用信号量S1。T1抢占T4并请求相同的信号量。由于信号量S1已经被占用,T1进入等待状态。现在低优先级的T4被T1和T4之间优先级的任务中断和抢占。T1只能在所有低优先级任务都被终止并且信号量S1再次释放之后执行。尽管T2和T3不使用信号量S1,但它们在运行时延迟了T1。优先级更高的T1结果延后优先级低的T4运行。
另一个典型问题是死锁问题。在这种情况下,死锁意味着由于无限等待相互锁定的资源而无法执行任务。下面的场景导致死锁:任务T1占用信号量S1,随后无法继续运行,例如,因为它正在等待一个事件。因此,较低优先级的任务T2进入运行状态。它占用了信号量S2。如果T1再次准备就绪并试图占用信号量S2,它将再次进入等待状态。如果T2现在试图占用信号量S1,这将导致死锁。
为了避免优先级反转和死锁的问题,OSEK操作系统需要以下行为:
- 在系统生成时,将静态地为每个资源分配其自己的最高优先级。上限优先级将至少设置为访问资源的所有任务的最高优先级。上限优先级必须低于所有未访问该资源的任务的最低优先级,且优先级必须高于所有访问该资源的任务的最高优先级。
- 如果某个任务需要使用某一资源,且当前任务的优先级低于该资源的最高优先级,则该任务的优先级将被提升到该资源的最高优先级。
- 如果任务释放资源,则该任务的优先级将重置为在需要该资源之前动态分配的优先级。
优先级天花板模式(ceiling priority)。即将访问共享资源的任务的优先级在占用资源的过程中提升至共享资源任务的最高优先级之上,从而避免优先级反转现象和死锁的出现。
优先级天花板可能导致优先级等于或低于资源优先级的任务出现时间延迟。该延迟受到任何低优先级任务占用资源的最大时间的限制。可能与正在运行的任务占用相同资源的任务不会进入运行状态,因为它们的优先级低于或等于正在运行的任务。当一个任务占用的资源被释放后,其他可能占用该资源的任务可以进入运行状态。
下图是实现优先级天花板模式的一个示例。任务T0的优先级最高,任务T4的优先级最低。任务T1和任务T4访问同一个资源。该系统清楚地表明,不需要无边界优先级反转。高优先级任务T1的等待时间小于Τ4占用资源的最大持续时间。
2、AUTOSAR OS
2.1 AUTOSAR OS介绍
AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一种开放的、标准化的汽车电子软件架构。AUTOSAR OS(Operating System,操作系统)规范是AUTOSAR架构中的一部分,它定义了操作系统的相关特性和功能。
AUTOSAR OS 具有包括但不限于以下一些特点和功能:
- 基于OSEK OS:AUTOSAR OS 的核心功能基于 OSEK OS(一种广泛应用于汽车行业的单核实时操作系统),并在此基础上进行了扩展和增强。
- 静态配置与实时性能:支持静态配置,以保证实时性能。可以提供基于优先级的调度表,确保任务按照优先级进行调度执行。
- 运行时保护:具备运行时保护功能,包括内存保护和时间保护等。内存保护可防止出错的应用模块影响到其他模块,降低系统完全瘫痪的风险;时间保护则用于预防超时任务的发生,通过设定任务或二类中断服务的运行时间上限、共享资源锁定时间上限、中断挂起时间上限以及任务或中断执行间隔时间下限等方式来实现。
- 调度表:利用 OSEK counter 以及自启动的 alarm,实现静态定义的任务激活机制。调度表提供一组静态定义的 expiry points(代表与调度表起始点的偏移值),当到达偏移值时,会触发相应动作,如激活任务、设置事件等。
- 栈使用监控:能够监控栈的使用情况,在上下文切换时检测任务或中断是否出现栈溢出,并报告相应错误或故障。在使用 MPU(内存保护单元)的情况下,栈溢出通常会在操作系统监控到之前触发内存异常,进入错误处理函数。
- OS Application:将任务、中断、Alarm、调度表、counter 等服务于相同功能单元的集合组合在一起。
- 支持多核、多分区:可以为不同核,不同分区配置独立的对象(任务、中断、Counter等),但他们都是部署在同一OS上,而不是说一个核有一个OS( AUTOSAR从4.0版本开始支持多核OS)。
- 启动/关闭接口:StartOS、StartupHook和shutdownOS、ShutdownHook。
为什么需要OS?相比于不带操作系统的“裸机编程”或者带简单时间轮询的操作系统,OS能够具备如下功能:
- 基于优先级的任务抢占
- 现场保护和恢复
- 执行时间的控制
- 访问权限的控制
- 共享资源的安全访问
2.2 OS应用OS Application
AUTOSAR OS有个容器来支持五个对象(Tasks, ISRs, Alarms, ScheduleTables, Counters),这些对象形成一个内聚的功能单元,这个容器被称为OS-Application。如果使用OS-Application,则所有的task、ISR、Counters、Alarms 和 ScheduleTables 必须属于某个OS-Application。属于同一OS-Application的所有对象都可以相互访问。OS Application 分为两类,即 Trusted(可信的)和 Non-Trusted(非可信的)。Trusted OS Application 可以在监控或保护功能关闭的情况下运行,对内存或 OS API 的访问没有限制,若处理器支持,还可运行在特权模式,但默认不会引发内存相关故障,若发生内存故障,系统稳定性可能无法保证,或许需要关闭 OS。Non-Trusted OS Application 不允许关闭监控或保护功能,对内存或 OS API 的访问受到权限控制,也不允许运行在特权模式。
2.3 调度表Schedule Table
调度功能是OS的核心功能,注意负责任务的激活及切换,OSEK OS调度一般通过Alarm和Event来激活任务,AUTOSAR OS在以上基础上增加了调度表Schedule Table。
每个调度表至少有一个到期点(Expiry Point),一个到期点包含一个或多个Task/Event。
调度表可以配置为只运行一次或重复运行。
Alarm和Expiry Point区别如下:
一般来说,能用Schedule Table就不要用Alarm,因为Schedule激活Task时间同步性更好(没有for循环间隔代码),alarm是进行for循环轮询激活,时间上会存在一点差异。
2.4 时钟Counters
Counter分为软件Counter和硬件Counter。
2.4.1 Software Counter
Software Counter有以下特征:
- 软件时钟由IncrementCounter函数驱动
- 每调用一次IncrementCounter,tick值只能增加1
- 每次tick加1后,查看是否与某个Alarm Expire匹配
- 需用户提供一个以tick为周期的周期性中断,不是每次中断都能匹配到Alarm
2.4.2 Hardware Counter
Hardware Counter有以下特征:
- 硬件时钟由硬件定时器驱动
- 硬件定时器的下一次中断由OS根据Alarm Expire计算而定
- 每次硬件定时器中断都能匹配Alarm周期,不会出现中断空跑
2.5 警报Alarm
Alarm有以下特征:
- Alarm必须与时钟Counter关联,一个Counter可以关联多个Alarm
- 当Counter tick值等于Alarm值时称为alarm到期( alarm expired )
- Alarm到期时可以执行如下动作:
- 激活TaskSet Event
- 调用callback
- 增加Counter值
由于对应AUTOSAR OS来讲,Alarm不是必须项,这里就不过多介绍。
2.6 事件Event
定义Event时需要关注三个要素:名字;所属的扩展任务;事件掩码。Event会触发扩展任务进入或者跳出Waiting状态。相关的函数接口包括:SetEvent, WaitEvent, ClearEvent。前两个接口函数会触发任务调度和上下文切换。
事件可用于为扩展任务提供多个同步点。同步的示例图如下图所示。扩展任务可以等待事件,这将导致任务进入等待状态。当系统中的任务或ISR设置事件时,等待任务将进入就绪状态。当它成为最高优先级的就绪任务时,OS将选择它来运行。
2.7 中断ISR
OSEK OS和AUTOSAR OS都将中断分为I类中断和II类中断。所有I类都认为是可信的,有最高的supervisor权限。II类中断可信度根据所在分区决定。当我们需要响应时间非常及时时可以使用I类中断。
2.7.1 I类ISR
对于I类中断,有以下特征:
- 进入/退出中断不受OS管控,中断发生时立即进入到中断函数,退出时返回到被中断打断的地方;
- 除了使能/禁止、挂起/恢复中断相关服务外,不能调用其他OS服务;
- 响应速度快。
2.7.2 II类ISR
对于II类中断,有以下特征:
- 进入/退出中断受OS管控,中断发生时OS将正在运行的Task从Running状态变为Ready状态,然后进入中断服务函数,退出时触发OS重新调度(即调度最高优先级的任务,而不是回到被打断的任务的地方);
- 除了调度相关服务(如ChainTask、TeminateTask、WaitEvent等)外,可以调用其他OS服务;
- 响应速度较慢。
II类中断发生时的状态图如下图所示:
2.7.3 中断延时
红色部分是硬件耗时,即程序跳转到中断向量表的时间,绿色部分是II类中断比I类中断多出来的延时时间,即OS对任务现场保护及跳转到中断服务函数的时间。
2.7.4 中断优先级
优先级排序:Task < Cat II ISR < Cat I ISR
一般而言,OS的系统时钟中断应设置为II类中断优先级最高,若较低则会影响系统实时性。
2.8 任务Task
同OSEK OS。这里不再复述。
3、总结
本篇主要对OSEK OS的一些知识点进行了描述,主要介绍了任务和优先级天花板模式,以及介绍了AUTOSAR OS中属于OS-Applicationd的对象,包括调度表,时钟,警报,事件,中断和任务。下一篇将继续介绍AUTOSAR OS的资源管理,分区,OS裁剪,OS保护,分区间通信,多核启动和下电,OS Error和Hook函数。
参考文档:《AUTOSAR_CP_SWS_OS》、《RTA-OS User Guide》、《OSEK/VDX Operating System Specification 2.2r3》、《ATOSAR多核操作系统及其应用》