如不做特别说明,本文基于AUTOSAR 19-11规范进行解读。
简介
总体上来说,操作系统可以分类为静态配置的或者动态管理的,对于AUTOSAR架构中的操作系统,需要提供的基础功能有:
-
静态配置的
-
能够保证实时性能的
-
提供基于优先级的调度表
-
提供运行时保护功能(内存,时间等)
-
能够在没有外部资源的情况下支持低端控制器
这些功能广泛运用于当前的汽车ECU当中(远程终端通信/车载娱乐系统除外)。
对于远程终端通信或者车载娱乐系统,目前看来它们仍旧会采用VxWorks, QNX,Windows CE等操作系统,只是,需要在这些操作系统上运行AUTOSAR组件的时候,应当提供一个操作系统抽象层(OSAL)来包含上述的功能。
AUTOSAR操作系统规范的定义,使用了工业标准ISO 17356-3作为基础,对于阅读/使用者来说,也应当参考此标准作为操作系统KnowHow的基础。
核心部分
OSEK/VDX操作系统广泛运用于汽车行业,能够在不同等级ECU上运行至今也已充分证明它的能力。
OSEK OS是一个事件触发型的操作系统,能够为AUTOSAR系统提供设计与维护上的高度灵活性。事件触发使得运行时拥有选择事件驱动调度的自由度,例如角度旋转,本地时间来源,全局时间来源以及错误发生等情况。
因此AUTOSAR OS的核心功能是基于OSEK OS的,OSEK OS提供了以下功能来支持AUTOSAR概念:
-
固定优先级的调度
-
处理中断
-
中断优先级比任务高
-
对错误请求OS服务的保护措施
-
OS启动的接口, StartOS()和StartupHook()
-
OS关闭的接口, ShutdownOS()和ShutdownHook()
OSEK OS还提供了更多功能,详细的可以参考ISO 17356-3: 2005: Road vehicles — Open interface for embedded automotive applications — Part 3: OSEK/VDX Operating System (OS)。
由于AUTOSAR OS是基于OSEK OS的,也就是说过去基于OSEK OS开发的应用,仍旧可以基于AUTOSAR OS运行。当然,部分在AUTOSAR OS中引入的功能,相比较于现有的OSEK OS,对使用上会有一些限制。
OSEK OS提供功能来处理任务间的通信(借助于OSEK COM),而在AUTOSAR中,ECU内部通信由AUTOSAR RTE或者AUTOSAR COM来完成。所以,AUTOSAR OS并不需要支持内部通信。
OSEK OS有一个称为RES_SCHEDULER的特殊资源:
-
即使没有配置,也会存在于系统当中。OS总能知道RES_SCHEDULER的存在。
-
它拥有最高的任务优先级,当某一个任务被分配到这个任务上时,是无法被其他任务抢占的。
在AUTOSAR OS中,不再将RES_SCHEDULER作为特殊资源,也即不会自动生成。当然了,AUTOSAR OS会保留配置选项,以支持将这样的资源分配到任务上。
OSEK OS对于很多场景没有定义其行为,导致可移植性降低,针对这个情况,AUTOSAR OS定义了例如StartOS(),ShutdownOS()等行为或者使用场景的说明。
AUTOSAR OS还定义了很多扩展功能,例如提供中断控制服务,软件计数等等。
调度表
利用OSEK counter以及自启动的alarm,可以实现静态定义的任务激活机制。调度表提供一组静态定义的expiry points,解决同步问题。每一个expiry point都代表单位为tick,与调度表起始点的偏移值,当到达这个偏移值时,会触发一个或多个动作(例如激活任务,设置事件等)。
运行时,操作系统会遍历调度表,执行每一个expiry point对应的动作。
如上图所示,此示例调度表执行一次跨度为50 ticks,操作系统从tick 0处按顺序执行,从Initial Expiry Point到Final Expiry Point,在不同的expiry point上,对应有不同的动作;例如Expiry point会在tick 4的时候触发,激活任务A和任务B,并设置EventP。
对于一个调度表,应当对应一个counter,counter的每一个tick,代表调度表的一个tick。
调度表的状态如上图所示,当启动调度表后,状态将由STOPPED迁移到RUNNING,操作系统开始执行调度表并处理expiry point的动作。如果调用了服务,调度表进入到NEXT状态,它会等到当前调度表执行结束,再变为RUNNING状态。
根据不同需求,调度表可以被设置为单次执行或者重复执行。
操作系统提供两个api,可以启动调度表 —- StartScheduleTableAbs()与StartScheduleTableRel()。区别就是,调度表的启动时间点,是绝对时间点,还是相对于调用服务时时间点的相对偏移量。如上图所示,两个调度表开始运行的时间就不太一样。
栈使用监控
OS可以提供栈使用情况的监控,在上下文切换的时候任务或者中断是否使用了栈溢出,这种情况下OS会报告相应错误/故障。
对于使用了MPU的情况下,栈溢出一般会在操作系统监控到溢出前就已经触发了内存异常,进入错误处理函数。
OS Application
操作系统的配置当中,可以将任务、中断、Alarm、调度表、counter等服务于同样功能单元的集合组合在一起,称之为OS Application。
当使能OS Application时,所有上述提到的OS对象都需要被分配到某一OS Application上,同一OS Application内的OS对象可以互相访问,如果有其他OS Application中的OS对象想访问,权限需要在配置中提前配置好。
OS Application分为两类,一类是Trusted, 一类是Non-Trusted。
对于Trusted OS Application,可以运行在监控或保护功能关闭的情况下,对于内存或者OS Api的访问没有限制;如果处理器支持,可以运行在特权模式,OS默认Trusted类型的OS Application不会引发内存相关故障,如果发生了内存故障,系统稳定性将不再保证,可能需要关闭OS。
对于Non-Trusted OS Application,不允许关闭监控或保护功能,对于内存或OS Api的访问也受权限控制,也不允许运行在特权模式。
需要注意的是,Resource不属于任何OS Application,在配置工具中的选择仅代表OS Application是否有权限访问。(Spinlock同理)
OS Application的状态迁移图如上图所示。
OS保护
一般来说,我们会考虑到内存保护,时间保护,服务保护等(一类中断除外)。
内存保护
对于内存保护,必须要求硬件支持MPU这样基于硬件的内存保护功能。内存保护基于可执行程序的data, code, stack段保护。
OS Application包含任务和中断,每一个任务和中断执行时都有它自己的stack,不需要共享给其他任务,即使它们都属于同一个OS Application。
对stack进行保护,一方面可以监测到stack overflow或者underflow,另一方面也可以用来实现功能安全需求。
OS Application有自己的数据区,其数据可以共享给所有此OS Application包含的任务和中断。
对于代码段,既可以是某一OS Application私有,又可以共享给多个OS Application。
时间保护
当任务或中断没有满足实时系统中运行时的deadline要求时,会产生时间故障。
假设有三个任务,其优先级,运行时间,Deadline数据如下:
假设0时刻点,所有任务都已在就绪状态,那么执行过程应该如下图所示:
如果任务A和任务B的执行出现非预期情况呢?比如,他们都执行了更久的时间,而且任务B第二次执行比预期还早2个tick,那么会出现下图结果:
最终,导致任务C无法满足Deadline要求。
AUTOSAR OS提供Execution Budget的功能,对任务和二类中断进行时间保护,定义他们最长执行时间。
同时,AUTOSAR OS还提供Lock Budget功能,任务和二类中断对Resource/OS中断挂起/所有中断挂起的时间进行监测。
此外,AUTOSAR OS还有Time Frame的概念,无论是任务需要切换到READY状态,还是二类中断被OS识别到,这些事件发生的间隔时间,也会受到监测。
对于这些保护,和OS任务状态的关系是:
服务保护
OS Application可以通过OS服务与操作系统进行交互,为了避免破坏操作系统的运行,需要在运行时做服务保护。
几个常见的在调用OS Service时需要做服务保护的场景:
无效或超出范围的参数
在错误的上下文中(例如在StartupHook中调用ActivateTask)
在没有释放资源的情况下结束任务
影响其他OS Application行为(例如ShutdownOS)
操作另一个OS Application中的OS对象,但并没有访问权限
保护硬件
如果处理器支持特权模式以及非特权模式,那么对于non-trusted OS Application,操作系统会保护MPU,timer,中断控制器等控制寄存器,不允许修改。如果需要修改这些寄存器,那么OS服务必须执行在特权模式。
所以,OS会在非特权模式下执行non-trusted OS Application.
中断一般运行在特权模式,如果ISR Handler在non-trusted OS Application中,那么OS需要在ISR() wrapper中先切换到非特权模式,再执行ISR handler。
Trusted Functions
OS Application可以请求另一个trusted OS Application中的Trusted Function,且这个操作会从非特权模式切换到特权模式。
哪些是可以给其他non-trusted OS Application访问的Trusted Function需要在配置工具中先配置好,调用时操作系统会提供trap/software interrupt的机制来完成。
System Scalability
OS根据使用功能/场景的不同,可以分为SC1-SC4 4个等级:
原文始发于微信公众号(车载嵌入式软件开发):[Classic AUTOSAR学习] OS 操作系统模块(基础篇)