[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

汽车安全 2年前 (2023) admin
565 0 0

如不做特别说明,本文基于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的特殊资源:

  1. 即使没有配置,也会存在于系统当中。OS总能知道RES_SCHEDULER的存在。

  2. 它拥有最高的任务优先级,当某一个任务被分配到这个任务上时,是无法被其他任务抢占的。

在AUTOSAR OS中,不再将RES_SCHEDULER作为特殊资源,也即不会自动生成。当然了,AUTOSAR OS会保留配置选项,以支持将这样的资源分配到任务上。

OSEK OS对于很多场景没有定义其行为,导致可移植性降低,针对这个情况,AUTOSAR OS定义了例如StartOS(),ShutdownOS()等行为或者使用场景的说明。

AUTOSAR OS还定义了很多扩展功能,例如提供中断控制服务,软件计数等等。

调度表

利用OSEK counter以及自启动的alarm,可以实现静态定义的任务激活机制。调度表提供一组静态定义的expiry points,解决同步问题。每一个expiry point都代表单位为tick,与调度表起始点的偏移值,当到达这个偏移值时,会触发一个或多个动作(例如激活任务,设置事件等)。

运行时,操作系统会遍历调度表,执行每一个expiry point对应的动作。

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

如上图所示,此示例调度表执行一次跨度为50 ticks,操作系统从tick 0处按顺序执行,从Initial Expiry Point到Final Expiry Point,在不同的expiry point上,对应有不同的动作;例如Expiry point会在tick 4的时候触发,激活任务A和任务B,并设置EventP。

对于一个调度表,应当对应一个counter,counter的每一个tick,代表调度表的一个tick。

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

调度表的状态如上图所示,当启动调度表后,状态将由STOPPED迁移到RUNNING,操作系统开始执行调度表并处理expiry point的动作。如果调用了服务,调度表进入到NEXT状态,它会等到当前调度表执行结束,再变为RUNNING状态。

根据不同需求,调度表可以被设置为单次执行或者重复执行。

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

操作系统提供两个api,可以启动调度表 —- StartScheduleTableAbs()与StartScheduleTableRel()。区别就是,调度表的启动时间点,是绝对时间点,还是相对于调用服务时时间点的相对偏移量。如上图所示,两个调度表开始运行的时间就不太一样。

栈使用监控

OS可以提供栈使用情况的监控,在上下文切换的时候任务或者中断是否使用了栈溢出,这种情况下OS会报告相应错误/故障。

对于使用了MPU的情况下,栈溢出一般会在操作系统监控到溢出前就已经触发了内存异常,进入错误处理函数。

OS Application

操作系统的配置当中,可以将任务、中断、Alarm、调度表、counter等服务于同样功能单元的集合组合在一起,称之为OS Application。

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

当使能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同理)

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

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数据如下:

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

假设0时刻点,所有任务都已在就绪状态,那么执行过程应该如下图所示:

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

如果任务A和任务B的执行出现非预期情况呢?比如,他们都执行了更久的时间,而且任务B第二次执行比预期还早2个tick,那么会出现下图结果:

[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

最终,导致任务C无法满足Deadline要求。

AUTOSAR OS提供Execution Budget的功能,对任务和二类中断进行时间保护,定义他们最长执行时间。

同时,AUTOSAR OS还提供Lock Budget功能,任务和二类中断对Resource/OS中断挂起/所有中断挂起的时间进行监测。

此外,AUTOSAR OS还有Time Frame的概念,无论是任务需要切换到READY状态,还是二类中断被OS识别到,这些事件发生的间隔时间,也会受到监测。

对于这些保护,和OS任务状态的关系是:

[Classic AUTOSAR学习] 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 操作系统模块(基础篇)

原文始发于微信公众号(车载嵌入式软件开发):[Classic AUTOSAR学习] OS 操作系统模块(基础篇)

版权声明:admin 发表于 2023年2月3日 上午9:01。
转载请注明:[Classic AUTOSAR学习] OS 操作系统模块(基础篇) | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...