AUTOSAR OS规范解析(一)

1 引言和功能概述

本文档描述了满足AUTOSAR SRS [2]中提出的顶层要求的AUTOSAR操作系统的基本要求。

一般来说,操作系统可以根据其特性分为不同的类别,例如静态配置的操作系统和动态管理的操作系统。为了对AUTOSAR操作系统进行分类,以下是其基本特性:该操作系统

  • 是静态配置和扩展的
  • 适合进行实时性能推理
  • 提供基于优先级的调度策略
  • 在运行时提供保护功能(内存、时序等)
  • 可在低端控制器上运行,且无需外部资源

这一特性集定义了当前一代汽车电子控制单元(ECU)中常用的操作系统类型,但车载信息娱乐系统除外。可以认为,车载信息娱乐系统将继续在AUTOSAR框架下使用专有操作系统(例如Windows CE、VxWorks、QNX等)。如果需要在这些专有操作系统上运行AUTOSAR组件,应将本文档中定义的接口作为操作系统抽象层(OSAL)提供。

本文档以行业标准[15](ISO 17356-3)作为AUTOSAR操作系统的基础。读者在阅读本文档之前,应熟悉该标准。

本文档描述了对[15]的扩展和限制。

2 首字母缩写词和缩略语

缩写描述
API应用程序编程接口
ARAUTOSAR
BSW基础软件
BSWMD基础软件模块描述
CDD复杂驱动程序
COM通信
ECC扩展一致性类
ECU电子控制单元
HW硬件
ID标识符
IOC操作系统应用程序间通信器
ISR中断服务程序
LE可定位实体是一个独特的软件片段,无论位于哪个内核,其效果都是相同的
MC多核
MCU微控制器单元
ME互斥
MPU内存保护单元
NMI不可屏蔽中断
OILOSEK实现语言
OS操作系统
OSEK/VDX汽车电子开放式系统及其接口
RTE运行时环境
RTOS实时操作系统
SC单核
SLA软件分层架构
SW软件
SWC软件组件
SWFRT软件自由运行定时器

2.1 术语表

术语定义
访问权限指示操作系统应用程序的某个对象(如任务、中断服务程序、钩子函数)具有对内存、操作系统服务或(一组)操作系统对象进行访问或操作的权限。
基数集合中项目的数量。
计数器记录滴答计数的操作系统对象。计数器有两种类型:
硬件计数器:由硬件(如定时器)推进的计数器。计数值由外设“在硬件中”维护。
软件计数器:通过调用IncrementCounter() API(参见SWS_Os_00399)来递增的计数器。计数值由操作系统“在软件中”维护。
截止时间任务/2类中断服务程序必须在其执行过程中到达系统设计定义的某个特定点的时间,该时间相对于触发激活的刺激。见图2.1
延迟调度表上两个相邻到期点之间的滴答数。
在文本中使用时,延迟是从指定到期点开始测量的相对滴答数。例如:X.延迟是从X到下一个到期点的延迟。
不存在到期点Z,使得X.偏移量<Z.偏移量<Y.偏移量。在这种情况下,延迟=Y.偏移量-X.偏移量
X和Y分别是最终到期点和初始到期点。在这种情况下,延迟=(持续时间-X.偏移量)+Y.偏移量
偏差显式同步的调度表上的当前位置与同步计数模调度表持续时间的值之间的最小滴答数。
持续时间调度表从虚拟零点开始循环的滴答数。
执行时间任务:任务在不进入挂起或等待状态的情况下处于运行状态的净时间,不包括由于中断服务程序抢占任务而导致的所有抢占时间。执行WaitEvent() API调用以等待已设置的事件的扩展任务名义上进入等待状态。对于多次激活的基本任务,净时间是每个任务激活的时间。
中断服务程序:用户提供的2类中断处理程序的第一个指令到最后一个指令的净时间,不包括由于更高优先级中断服务程序优先执行而导致的所有抢占时间。执行时间包括在错误、任务前和任务后钩子中花费的时间,以及进行操作系统服务调用花费的时间。
执行预算任务/中断服务程序允许的最大执行时间。
到期点调度表上从零点开始测量的偏移量,在该偏移量处操作系统激活任务和/或设置事件。
初始到期点偏移量最小的到期点
最终到期点偏移量最大的到期点
钩子函数钩子函数由用户实现,在发生某些事件时由操作系统调用。为了在系统或应用程序级别对这些事件做出反应,有两种钩子函数:
特定于应用程序的:在单个操作系统应用程序范围内的钩子函数。
特定于系统的:在整个系统范围内的钩子函数(通常由集成商提供)。
初始偏移量调度表上最小的到期点偏移量。可以为零。
到达间隔时间基本任务:见图2.1。从挂起状态进入就绪状态的连续时间。任务的激活总是代表一个新的到达。这适用于多次激活的情况,即使任务的现有实例处于运行或就绪状态。
扩展任务:从挂起或等待状态进入就绪状态的连续时间。如果任务处于等待状态,为其设置事件,如果任务正在等待该事件,则代表一个新的到达。在运行状态下等待已设置的一个或多个事件,代表一个名义上的等待/释放/开始转换,因此被视为一个新的释放。
中断服务程序:中断连续发生的时间。
中断锁定时间任务/中断服务程序在禁用/挂起1类中断和/或禁用/挂起2类中断的情况下执行的时间。
硬件异常-
中断源使能硬件中使能特定中断源的开关。
中断向量表概念上,中断向量表包含从硬件中断请求到(软件)中断服务程序的映射。中断向量表地址的实际内容是硬件特定的,例如,它可以包含中断服务程序的起始地址。
最终延迟调度表上最终到期点偏移量与持续时间之间的滴答差。该值定义了从最终到期点到单触发和“下一个”调度表逻辑结束的延迟。
强制终止操作系统应用程序操作系统释放所有与该操作系统应用程序相关联的系统对象,例如强制终止任务、禁用中断等。操作系统应用程序和内部变量可能处于未定义状态。
操作系统终止任务/2类中断服务程序,并且不“解锁”其持有的资源。详情参见SWS_Os_00108和SWS_Os_00109
强制终止-
链接器文件包含链接器链接设置的文件。链接器文件的语法取决于特定的链接器,因此定义以“特定于链接器”的方式存储在链接器文件中。
锁定预算允许的最大中断锁定时间或资源锁定时间。
主内核主内核是引导AUTOSAR系统的内核。
内存保护单元内存保护单元(MPU)支持具有单独保护属性的内存分区。这不同于内存管理单元(MMU),后者在运行时提供虚拟地址和物理内存位置之间的映射。请注意,某些设备可能在MMU中实现MPU的功能。
模式描述处理器上可用的权限。
特权模式:通常,在“特权模式”下,可以不受限制地访问内存以及底层硬件。
非特权模式:在“非特权模式”下,访问受到限制。
模数OSEK计数器完成一次完整循环所需的滴答数。等于计数器的OsCounterMaxAllowedValue +1滴答。
操作系统应用程序操作系统对象的集合
可信的:可信操作系统应用程序可以在运行时禁用监控或保护功能的情况下运行。它们可以不受限制地访问内存、操作系统模块的API,并且不必在运行时强制执行其定时行为。当处理器支持时,它们可以在特权模式下运行。操作系统模块假设可信操作系统应用程序(和可信函数)不会导致与内存相关的保护故障。如果发生此类故障,系统稳定性可能会丧失, shutdown可能是唯一的选择。
非可信的:非可信操作系统应用程序在运行时不允许禁用监控或保护功能。它们对内存的访问受限,对操作系统模块的API的访问受限,并且其定时行为在运行时受到强制执行。当处理器支持时,它们不允许在特权模式下运行。
操作系统对象属于单个操作系统应用程序的对象:任务、中断服务程序、警报、事件、调度表、资源、可信函数、计数器、特定于应用程序的钩子。
操作系统服务操作系统服务是操作系统的API。
保护错误操作系统应用程序软件中的系统性错误。
内存访问违规由于以没有访问权限的方式访问地址而导致的保护错误。
定时故障违反定时保护的保护错误。
非法服务违反服务保护的保护错误,例如未经授权调用操作系统服务。
硬件异常除零、非法指令等。
资源锁定时间任务/中断服务程序持有OSEK资源的时间(不包括任务/中断服务程序被更高优先级任务/中断服务程序抢占的时间)。
响应时间从任务/中断服务程序准备好执行到产生指定响应的时间。该时间包括所有抢占。见图2.1
重启操作系统应用程序操作系统应用程序在自终止或因保护错误被强制终止后可以重启。当操作系统应用程序重启时,操作系统激活配置的OsRestartTask。
可扩展性类本文档描述的操作系统特性(如内存保护或定时保护)可以组合在一起,以根据应用程序的需求自定义操作系统。有4个定义的特性组,称为可扩展性类。详情参见第7.11章
调度表静态定义的一组到期点的封装。
对象文件中指令或数据组合形成一个单元的部分(为数据或代码分配的内存中的连续地址空间)。对象文件(对象文件格式)中的段有一个名称和一个大小。从链接器的角度来看,可以区分两个不同的方面:输入段是链接器的输入对象文件中的内存段。输出段是链接器的输出对象文件中的内存段。
(操作系统对象的)集合本文档使用术语“集合”,表示同一类型的操作系统对象的集合,严格按照数学意义,即:- 集合包含零个或多个操作系统对象(这意味着集合可以是空的)- 集合中的操作系统对象是唯一的(这意味着集合中不能有重复的操作系统对象)
自旋锁自旋锁是一种锁定机制,任务在循环中等待(“自旋”),反复检查共享变量是否变为某个值。该值指示锁是空闲的还是被占用的。在多核系统中,变量的比较和更改通常需要原子操作。由于任务保持活跃但不做任何有用的事情,自旋锁是一种忙等待机制
自旋锁变量自旋锁变量是自旋锁使用的共享变量,用于指示自旋锁是空闲的还是被占用的。
符号软件模块可以导入/使用并由链接器解析的地址标签。标签的确切语法是特定于链接器的。这里,这些地址标签用于标识内存段的开始和结束。
起始符号标记内存段的开始
结束符号标记内存段的结束
调度表与同步计数器的同步如果调度表的到期点在与同步计数器的绝对偏差小于或等于精度阈值的范围内处理,则实现了与同步计数器的同步。
同步计数器“同步计数器”不同于操作系统计数器对象,是操作系统外部的外部计数器,调度表的到期点与该计数器同步。
任务任务是执行(用户)代码并由操作系统管理的对象。例如,操作系统在不同任务之间切换(“调度”)。有两种类型的任务;更多详情参见[15]。
基本任务本身不能阻塞的任务。这意味着它不能等待(操作系统)事件。
扩展任务本身可以阻塞并等待(操作系统)事件的任务。
时间帧任务/中断服务程序的最小到达间隔时间。
可信函数由可信操作系统应用程序提供的服务,其他操作系统应用程序(可信或非可信)可以使用。
最坏情况执行时间(WCET)最长可能的执行时间。
写访问在寄存器或内存位置存储值。所有具有写入结果的内存访问(例如具有写入内存位置副作用的读取)都被视为写访问。

3 相关文档

3.1 输入文档

[1] 《分层软件架构》AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] 《操作系统要求》AUTOSAR_SRS_OS.pdf
[3] 《基础软件模块通用要求》AUTOSAR_SRS_BSWGeneral.pdf
[4] 《虚拟功能总线规范》AUTOSAR_EXP_VFB.pdf
[5] 《软件自由运行定时器要求》AUTOSAR_SRS_FreeRunningTimer.pdf
[6] 《GPT驱动程序规范》AUTOSAR_SWS_GPTDriver.pdf
[7] 《标准类型规范》AUTOSAR_SWS_StandardTypes.pdf
[8] 《内存映射规范》AUTOSAR_SWS_MemoryMapping.pdf
[9] 《运行时环境规范》AUTOSAR_SWS_RTE.pdf
[10] 《ECU配置规范》AUTOSAR_TPS_ECUConfiguration.pdf
[11] 《基础软件模块描述模板》AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[12] 《基础软件模块列表》AUTOSAR_TR_BSWModuleList.pdf
[13] 《运行时环境规范》AUTOSAR_SWS_RTE.pdf
[14] 《基础软件模块通用规范》AUTOSAR_SWS_BSWGeneral.pdf

3.2 相关标准和规范

3.2.1 ISO 17356

ISO 17356(《道路车辆——嵌入式汽车应用开放式接口》)是先前由OSEK/VDX组织发布的标准。
[15] ISO 17356-3:2005:《道路车辆——嵌入式汽车应用开放式接口——第3部分:OSEK/VDX操作系统(OS)》
[16] ISO 17356-6:2006:《道路车辆——嵌入式汽车应用开放式接口——第6部分:OSEK/VDX实现语言(OIL)》

3.3 公司报告、学术著作等

[17] 《OSEK操作系统对受保护应用程序的扩展》OSEK支持项目DC058_02,戴姆勒-克莱斯勒股份公司

3.4 相关规范

AUTOSAR提供了基础软件模块通用规范[14](SWS BSW General),该规范同样适用于操作系统。
因此,SWS BSW General规范应被视为操作系统的附加且必需的规范。

4 约束和假设

4.1 现有标准

本文档对引用的相关标准和规范做出以下假设:

  • [15] 提供了足够灵活的调度策略来调度AUTOSAR系统。
  • [15] 是一个成熟的规范,其实现已在全球数百万个ECU中使用。
  • [15] 对在运行时隔离多源软件组件的支持不足。
  • [15] 对在安全案例中证明不存在某些类别的故障传播的运行时支持不足。

4.2 术语

本规范在需求指定多个术语时使用以下运算符:

  • NOT:对单个术语的否定,例如 NOT Weekend
  • AND:两个术语的合取,例如 Weekend AND Saturday
  • OR:两个术语的析取,例如 Monday OR Tuesday

包含多个术语的需求按从左到右的顺序进行评估。

优先级规则如下:

  • 最高优先级:NOT
  • 最低优先级:AND、OR

表达式 NOT X AND Y 表示 (NOT X) AND (Y)。

当同一语句中使用具有相同优先级的运算符时,使用逗号来消除歧义。表达式 X AND Y, OR Z 表示 (X AND Y) OR Z。

4.3 与RTE的交互

AUTOSAR系统的配置[4]将软件组件的“可运行实体”映射到由操作系统调度的(一个或多个)任务。一个任务中的所有可运行实体共享相同的保护边界。在AUTOSAR中,软件组件不得包含中断处理程序。因此,软件组件仅通过在任务体内执行的可运行实体来实现,或者仅通过一组任务来实现。

可运行实体通过AUTOSAR RTE访问硬件源数据。RTE提供了可运行实体与基础软件模块之间的运行时接口。

基础软件模块还包括许多由操作系统调度的任务和中断服务程序。

假设软件组件模板和基础软件模块的描述提供了足够的关于所需运行时行为的信息,以便能够指定配置操作系统所需的任务属性。

4.4 操作系统抽象层(OSAL)

不使用AUTOSAR中定义的操作系统的系统可以通过操作系统抽象层为AUTOSAR软件组件的执行提供平台。OSAL的接口与为AUTOSAR操作系统定义的接口完全相同。

4.5 多核硬件假设

目前,多核微处理器存在几种现有的和建议的硬件架构。这些架构提供的功能存在很大差异。因此,本节试图捕捉多核所需的一组共同架构特征。

硬件假设应保持为假设,不应成为AUTOSAR的正式要求。

4.5.1 CPU内核特性

  1. 同一硅片上有多个内核。
  2. 硬件提供一种可被软件用于识别内核的方法。
  3. 硬件支持针对固定字长的原子读和原子写操作,具体取决于硬件。
  4. 硬件支持一些原子测试-设置功能或类似功能,可用于构建内核之间的临界区。可能存在其他原子操作。
  5. 内核可以具有相同的指令集;所有内核至少有一个共同的基本指令集。可能存在特定于内核的附加功能,但不会被考虑在内。
  6. 内核具有相同的数据表示。例如,相同的整数大小、相同的字节和位顺序等。
  7. 如果存在每个内核的缓存,AUTOSAR要求支持硬件或软件中的RAM-缓存一致性。在软件方面,这意味着缓存控制器可以通过软件编程,以使其使缓存行无效或将某些内存区域排除在缓存之外。
  8. 在发生异常(如非法内存引用或除零)时,异常发生在引入异常的内核上。
  9. 为了通知,有可能在任何内核上触发中断/陷阱。

4.5.2 内存特性

所有内核都可访问共享RAM;至少所有内核可以共享内存的很大一部分。

至少所有内核之间应共享闪存。但是,如果可以对闪存/ RAM进行分区,使内核到闪存有单独的路径,则可以提高性能。

假设有一个单一的地址空间,至少在内存地址空间的共享部分是这样。

AUTOSAR多核架构应能够在支持和不支持内存保护的系统上运行。如果存在内存保护,则所有内核都由基于硬件的内存保护覆盖。

4.5.3 多核限制

  • 在AUTOSAR R4.0中,不支持在操作系统启动后激活由AUTOSAR控制的额外内核。
  • 调度算法不会将任务动态分配给内核。
  • AUTOSAR OS资源算法不支持跨内核使用。资源只能在绑定到同一内核的任务之间本地使用,而不能在绑定到不同内核的任务/中断服务程序之间使用。

4.6 限制

4.6.1 硬件

核心AUTOSAR操作系统假设可以自由访问由操作系统本身管理的硬件资源。这包括但不限于以下硬件:

  • 中断控制寄存器
  • 处理器状态字
  • 栈指针

核心操作系统的特定(扩展)功能扩展了对硬件资源的要求。以下列表概述了对硬件有要求的功能。不使用这些操作系统功能的系统没有这些硬件要求。

  • 内存保护:需要硬件内存保护单元。所有具有写入结果的内存访问(例如具有写入内存位置副作用的读取)都应被视为写入。
  • 时间保护:用于监控执行时间和到达率的定时器硬件。
  • MCU上的“特权”和“非特权”模式:用于保护操作系统免受因写入操作系统控制的寄存器而导致的内部损坏。此模式不得允许操作系统应用程序规避保护(例如,写入控制内存保护的寄存器、写入处理器状态字等)。特权模式必须完全由受保护的操作系统控制,该操作系统在内部使用该模式,并用于将控制权从非可信操作系统应用程序来回转移到可信操作系统应用程序。微处理器必须支持将处理器移入此特权模式的受控方式。
  • 本地/全局时间同步:需要全局时间源。

一般来说,操作系统不会检测处理器中的硬件故障。在发生硬件故障的情况下,不能保证操作系统的正确操作。

特定操作系统实现所管理的资源必须在操作系统的相应配置文件中定义。

4.6.2 编程语言

操作系统的API定义为C函数调用或宏。如果使用其他语言,它们必须适应C接口。

4.6.3 其他

操作系统不提供动态内存管理服务。

4.7 对汽车领域的适用性

该操作系统具有与[15]设计时相同的关于大小和可扩展性的设计约束。因此,其直接适用领域目前是车身、底盘和动力传动系统ECU。但是,没有理由该操作系统不能用于实现信息娱乐应用的ECU。

5 与其他模块的依赖关系

不存在对其他模块的强制依赖,但是:

  • 假设操作系统可以直接使用定时器单元来驱动计数器。
  • 如果用户需要直接从全局时间驱动调度,则需要全局时间中断。
  • 如果用户需要将调度表的处理与全局时间同步,则需要通过SyncScheduleTable()服务告知操作系统全局时间。
  • 本文档中描述的IOC提供操作系统应用程序之间的通信。IOC的生成基于由RTE生成器生成的配置信息。另一方面,RTE使用由IOC生成的函数来传输数据。

5.1 文件结构

5.1.1 代码文件结构

除了通用SRS中的要求外,操作系统模块的代码文件结构不是固定的。

5.1.2 头文件结构

IOC生成器生成一个额外的头文件Ioc.h。Ioc.h的用户应包含Ioc.h文件。如果IOC的实现需要额外的头文件,它可以自由包含它们。头文件是自包含的,这意味着它们将包含所有其他需要的头文件。

5.1.3 ARTI文件结构(草案)

为了支持基于ARTI的调试和跟踪,所有带有ARTI钩子宏的源文件都应包含“arti.h”文件。该文件(以及相应的arti.c文件)将由ARTI钩子实现者(即跟踪工具)提供。在构建最终可执行文件时,链接器也会拉入编译后的arti.c文件。

ARTI钩子宏的使用是可配置的。如果操作系统被配置为不使用ARTI,则可以省略“arti.h”的包含,并且ARTI钩子宏可以扩展为空宏(“无”)。

6软件可追溯性

略。

7 功能规范

7.1 核心操作系统

7.1.1 背景与原理

OSEK/VDX操作系统[15]在汽车行业中被广泛使用,并且已在现代车辆中的各类电子控制单元(ECU)中得到应用验证。OSEK操作系统所引入的概念已被广泛理解,汽车行业在基于OSEK操作系统的系统工程方面拥有多年的集体经验。

OSEK操作系统是事件触发型操作系统。这为基于AUTOSAR的系统的设计和维护提供了高度的灵活性。事件触发使得在运行时可以自由选择驱动调度的事件,例如角度旋转、本地时间源、全局时间源、错误发生等。

基于这些原因,AUTOSAR操作系统的核心功能应以OSEK操作系统为基础。特别是,OSEK操作系统提供了以下支持AUTOSAR概念的功能:

  • 固定优先级调度
  • 中断处理机制
  • 只有优先级高于任务的中断
  • 针对操作系统服务错误使用的一些保护措施
  • 通过StartOS()和StartupHook()实现的启动接口
  • 通过ShutdownOS()和ShutdownHook()实现的关闭接口

此外,OSEK操作系统还提供了许多其他功能。读者可参考规范[15]了解详情。

将AUTOSAR操作系统基于OSEK操作系统,意味着遗留应用程序将具有向后兼容性——即针对OSEK操作系统编写的应用程序可以在AUTOSAR操作系统上运行。然而,AUTOSAR操作系统引入的一些功能需要对OSEK操作系统的现有功能进行限制,或者是对OSEK操作系统现有功能的扩展。

7.1.2 要求

[SWS_Os_00001] ⌈操作系统模块应提供与OSEK操作系统API [15]向后兼容的API。⌋(SRS_Os_00097)

7.1.2.1 对OSEK操作系统的限制

为警报回调实现时序和内存保护的效率太低。因此,在特定的可扩展性类中,不允许使用警报回调(SWS_Os_00242)

[SWS_Os_00242] ⌈操作系统模块仅允许在可扩展性类1中使用警报回调。⌋()

当系统中只需要内部通信时,OSEK操作系统需要提供根据OSEK COM规范处理任务间(内部)通信的功能。在AUTOSAR中,内部通信由AUTOSAR RTE或AUTOSAR COM提供,对于所有AUTOSAR ECU,至少会提供其中之一。

因此,在AUTOSAR系统中使用的AUTOSAR操作系统不需要支持内部通信。

如果定义了符号LOCALMESSAGESONLY,OSEK操作系统必须实现内部通信。AUTOSAR操作系统可以通过确保在始终存在未定义LOCALMESSAGESONLY的环境中使用AUTOSAR操作系统,来弃用实现OSEK COM功能的需求,同时保持与OSEK规范套件的兼容性。

OSEK操作系统有一个特殊的资源,称为RES_SCHEDULER。该资源有两个特定方面:

  1. 它始终存在于系统中,即使未进行配置。这意味着操作系统始终知道RES_SCHEDULER。
  2. 它始终具有最高的任务优先级。这意味着分配了该资源的任务不会被其他任务抢占。

由于特殊情况总是难以处理(例如,在这种情况下,对于时序保护而言),AUTOSAR操作系统将RES_SCHEDULER当作其他任何资源来处理。这意味着不会自动创建RES_SCHEDULER。但是,一个配置属性允许AUTOSAR操作系统中的某个资源可选地被分配系统中最高优先级任务的优先级。

为了与OSEK操作系统系统保持向后兼容性,参见第12.7章,了解如何将名为RES_SCHEDULER的标准资源配置为与OSEK操作系统中自动声明的同名资源兼容。

在OSEK操作系统中,用户必须使用特定的宏(例如DeclareTask()等)声明操作系统对象。AUTOSAR操作系统的实现不应依赖此类声明,并且为了向后兼容,应提供无功能的宏。

7.1.2.2 OSEK操作系统中的未定义行为

OSEK操作系统在很多情况下存在未定义的行为。这些情况会阻碍可移植性。AUTOSAR操作系统通过定义所需行为,对OSEK操作系统规范进行了完善。

[SWS_Os_00304] ⌈在调用SetRelAlarm()时,如果参数“increment”被设为零,在标准状态和扩展状态下,该服务应返回E_OS_VALUE。⌋()

[SWS_Os_00424] ⌈第一次调用StartOS()(用于启动操作系统)不应返回。⌋()

[SWS_Os_00425] ⌈如果调用ShutdownOS()且ShutdownHook()返回,那么操作系统模块应禁用所有中断并进入无限循环。⌋()

7.1.2.3 对OSEK操作系统的扩展

[SWS_Os_00299] ⌈在调用StartOS()之前和调用ShutdownOS()之后,操作系统模块应提供DisableAllInterrupts()、EnableAllInterrupts()、SuspendAllInterrupts()、ResumeAllInterrupts()服务。⌋(SRS_Os_11018)

假设SWS_Os_00299中提到的函数的静态变量已初始化。

[SWS_Os_00301] ⌈操作系统模块应提供将软件计数器递增作为警报到期时的替代操作的能力。⌋(SRS_Os_11021)

操作系统模块提供API服务IncrementCounter()(参见SWS_Os_00399)来递增软件计数器。

[SWS_Os_00476] ⌈操作系统模块应允许在操作系统启动期间自动启动预先配置的绝对警报。⌋()

SWS_Os_00476是对OSEK操作系统的扩展,OSEK操作系统仅允许对相对警报执行此操作。

[SWS_Os_00566] ⌈在扩展模式下,操作系统API应检查所有指针参数是否为NULL指针,如果存在此类参数,在扩展状态下返回E_OS_PARAM_POINTER。⌋()

7.2 软件自由运行定时器

由于定时器的数量通常非常有限,因此添加了一些功能和配置来扩展定时器的复用。例如,这允许进行定时器测量。更多详情另见[5](SWFRT)。

[SWS_Os_00374] ⌈操作系统模块应处理直接由操作系统模块使用且不由GPT驱动程序处理的定时器的所有初始化和配置。⌋(SRS_Frt_00020)

操作系统模块提供API服务GetCounterValue()(参见SWS_Os_00383)来读取计数器的当前计数值(如果计数器由硬件驱动,则返回硬件定时器滴答数;如果由用户驱动,则返回软件滴答数)。

操作系统模块提供API服务GetElapsedValue()(参见SWS_Os_00392)来获取当前滴答值与先前读取的滴答值之间的滴答数。

[SWS_Os_00384] ⌈操作系统模块应调整硬件定时器(驱动计数器)的读取值,使得最小值为零,并且连续读取会返回递增的计数值,直到定时器按其模数循环。⌋(SRS_Frt_00030、SRS_Frt_00031)

7.3 调度表

7.3.1 背景与原理

可以使用OSEK计数器和一系列自动启动的警报来实现静态定义的任务激活机制。在简单情况下,只需指定警报在启动后不被修改即可实现。只有在能够保证警报之间的相对同步时,才能进行运行时修改,这通常意味着在禁用与计数器滴答中断相关的警报时修改警报。

调度表通过封装静态定义的一组到期点来解决同步问题。每个到期点定义:

  • 处理到期点时必须发生的一个或多个操作,其中操作是任务激活或事件设置
  • 从调度表开始起的滴答偏移量

每个调度表都有以滴答为单位的持续时间。该持续时间从零点开始测量,并定义了调度表的模数。

在运行时,操作系统模块将遍历调度表,依次处理每个到期点。遍历由OSEK计数器驱动。因此,计数器的属性会对调度表的可配置内容产生影响。

7.3.2 要求

7.3.2.1 调度表的结构

在这里插入图片描述

[SWS_Os_00401] ⌈一个调度表应至少有一个到期点。⌋()

[SWS_Os_00402] ⌈一个到期点应包含一组(可能为空)要激活的任务。⌋()

[SWS_Os_00403] ⌈一个到期点应包含一组(可能为空)要设置的事件。⌋()

[SWS_Os_00404] ⌈一个到期点应包含从调度表开始起的以滴答为单位的偏移量。⌋()

7.3.2.2 对到期点的约束

空的到期点没有使用场景,因此每个到期点必须至少定义一个操作。

[SWS_Os_00407] ⌈一个到期点应至少激活一个任务或设置一个事件。⌋()

操作系统需要知道到期点的处理顺序。因此,必须确保调度表上的到期点可以完全排序。通过强制调度表上的每个到期点都有唯一的偏移量,可以保证这一点。

[SWS_Os_00442] ⌈给定调度表上的每个到期点应具有唯一的偏移量。⌋()

调度表上到期点的遍历由OSEK计数器驱动。计数器的特性(OsCounterMinCycle和OsCounterMaxAllowedValue)对到期点偏移量施加了约束。

[SWS_Os_00443] ⌈初始偏移量应为零,或者在基础计数器的OsCounterMinCycle到OsCounterMaxAllowedValue范围内。⌋()

同样,相邻到期点之间的延迟以及到调度表逻辑结束的延迟也受到约束。

[SWS_Os_00408] ⌈相邻到期点之间的延迟应在基础计数器的OsCounterMinCycle到OsCounterMaxAllowedValue范围内。⌋()

7.3.2.3 调度表的处理

[SWS_Os_00002] ⌈操作系统模块应按照从初始到期点到最终到期点的顺序,以偏移量递增的方式处理调度表上的每个到期点。⌋(SRS_Os_00098)

[SWS_Os_00007] ⌈操作系统模块应允许同时处理多个调度表。⌋(SRS_Os_00098)

[SWS_Os_00409] ⌈操作系统模块的一个调度表应仅由一个计数器驱动。⌋()

[SWS_Os_00410] ⌈在任何给定时间,操作系统模块应能够为每个计数器处理至少一个调度表。⌋()

[SWS_Os_00411] ⌈操作系统模块应使用滴答,使得计数器上的一个滴答对应调度表上的一个滴答。⌋()

在同一个到期点激活任务并为同一任务设置(一个或多个唯一)事件是可能的。从到期点执行的任务激活和事件设置的顺序可能导致不同实现表现出不同的行为(例如,激活挂起的任务然后为该任务设置事件会成功,但如果顺序相反,事件设置可能会失败)。为防止这种不确定性,必须强制规定到期点上操作的严格顺序。

[SWS_Os_00412] ⌈操作系统模块应首先处理到期点上的所有任务激活,然后再设置事件。⌋()

调度表始终具有定义的状态,下图说明了不同状态(针对非同步调度表)以及状态之间的转换。

在这里插入图片描述

如果调度表未激活——即未被操作系统处理,其状态为调度表停止状态。启动调度表后,调度表进入调度表运行状态,操作系统在该状态下处理到期点。如果调用了切换调度表的服务,调度表将进入调度表下一状态,并等待“当前”调度表结束。

7.3.2.4 调度表的重复处理

调度表在处理完最终到期点后可配置为重复处理或不重复处理。这支持两种行为:

  1. 单次触发(single-shot)——调度表按顺序处理每个到期点,处理完成后停止。这适用于响应某个触发信号,执行一系列分阶段操作的场景。
  2. 重复触发(repeating)——调度表依次处理每个到期点,处理完最终到期点后,循环回到初始到期点。这适用于需要重复执行处理的应用,或需要将处理与驱动源同步的系统。

重复触发的调度表意味着每个到期点会以等于调度表持续时间的周期重复出现。

[SWS_Os_00413] ⌈调度表应可配置为单次触发或重复触发模式。⌋()

[SWS_Os_00009] ⌈若调度表为单次触发模式,操作系统模块应在处理完最终到期点后的“最终延迟(Final Delay)”滴答数时,停止该调度表的处理。⌋()

[SWS_Os_00427] ⌈若调度表为单次触发模式,操作系统模块应允许“最终延迟”的取值范围为基础计数器的0到OsCounterMaxAllowedValue。⌋()

[SWS_Os_00444] ⌈对于周期性调度表,“最终延迟”的取值应在基础计数器的OsCounterMinCycle到OsCounterMaxAllowedValue范围内。⌋()

[SWS_Os_00194] ⌈若调度表为重复触发模式,在处理完最终到期点后,操作系统应在经过“最终延迟+初始偏移量”滴答数后,处理下一个初始到期点。⌋()

7.3.2.5 调度表处理的控制

应用程序负责启动和停止调度表的处理。

操作系统模块提供服务StartScheduleTableAbs()(参见SWS_Os_00358),用于在基础计数器的绝对数值“Start”处启动调度表处理(初始到期点的处理时机为基础计数器值等于Start + 初始偏移量时)。

操作系统模块提供服务StartScheduleTableRel()(参见SWS_Os_00347),用于在基础计数器的“当前值”相对偏移“Offset”处启动调度表处理(初始到期点的处理时机为基础计数器值等于当前值 + Offset + 初始偏移量时)。

下图以一个由模数为65536的计数器(即OsCounterMaxAllowedValue = 65535)驱动的调度表为例,说明两种启动方式的差异。

在这里插入图片描述

操作系统模块提供服务StopScheduleTable()(参见SWS_Os_00006),用于在调度表运行期间的任意时刻立即取消其处理。

[SWS_Os_00428] ⌈若调度表的处理在到达最终到期点之前被取消,随后又被重新启动,则SWS_Os_00358/SWS_Os_00347意味着重新启动将从调度表的起始处开始。⌋()

操作系统模块提供服务 NextScheduleTable()(参见 SWS_Os_00191),用于将处理从一个调度表切换到另一个调度表。

[SWS_Os_00414] ⌈当请求切换调度表时,操作系统应继续处理当前调度表上的到期点。在最终到期点之后,会有一段相当于最终延迟(Final Delay)滴答数的延迟,之后再开始处理被切换到的调度表。初始到期点将在初始偏移量(initial offset)之后被处理。⌋()

操作系统模块提供服务GetScheduleTableStatus()(参见SWS_Os_00227),用于查询调度表的状态。

调度表可配置为在操作系统模块启动期间自动启动(类似OSEK OS中的任务和警报)。OSEK OS定义了特定的顺序:任务的自动启动先于警报的自动启动执行。AUTOSAR OS在此基础上扩展了调度表的自动启动。

[SWS_Os_00510] ⌈在启动过程中,操作系统模块应在任务和警报的自动启动之后,执行调度表的自动启动。⌋()

7.4 调度表同步

7.4.1 背景与原理

调度表初始 expiry 点的绝对处理时间由用户控制。但如果调度表重复执行,初始 expiry 点首次处理时的绝对计数值与后续处理时的绝对计数值不一定相同,因为调度表的持续时间无需与计数器模数相等。

在许多场景中,确保调度表的 expiry 点在底层计数器的特定绝对数值处处理至关重要,这一过程称为同步。典型应用场景包括:

  • 使 expiry 点与电机管理中的角度旋转度数同步
  • 使计算与全局(网络)时基同步。需注意,在 AUTOSAR 中,操作系统不提供全局(网络)时间源,原因如下:
    1. 许多场景中无需全局时间;
    2. 其他 AUTOSAR 模块(如 FlexRay)独立提供此功能;
    3. 若操作系统需同步到多个全局(网络)时间源(如构建两个时间触发网络间的网关),操作系统无法作为唯一全局时间源。

AUTOSAR 操作系统通过两种方式支持同步:

  1. 隐式同步:驱动调度表的计数器本身就是需要同步的计数器。这通常用于与时间触发网络技术(如 FlexRay、TTP)的同步——底层硬件管理网络时间同步,仅通过输出/比较定时器接口向操作系统提供时间。下图展示了支持隐式同步的调度表可能的状态:

    在这里插入图片描述

  2. 显式同步:调度表由操作系统计数器驱动,但需与另一个非操作系统计数器的同步计数器保持同步。操作系统提供额外功能,确保由操作系统计数器驱动的调度表处理与同步计数器保持同步。这通常用于与周期性广播的全局时间同步。下图展示了此类调度表的状态:

    在这里插入图片描述

7.4.2 要求

[SWS_Os_00013] ⌈操作系统模块应能将调度表的处理与已知的计数器值同步。⌋ (SRS_Os_11002)

7.4.2.1 隐式同步

操作系统模块无需为调度表的隐式同步提供额外支持,但需约束调度表的配置和运行时控制,确保调度表的 ticks 与计数器的 ticks 对齐。这要求调度表的范围与计数器的范围完全一致(调度表与计数器的 tick 分辨率一致性由调度表/计数器交互要求保证):

[SWS_Os_00429] ⌈采用隐式同步的操作系统模块调度表,其持续时间必须等于关联 OSEK 操作系统计数器的 OsCounterMaxAllowedValue + 1。⌋ ( )

为使调度表处理同步,必须在已知的计数器值处启动调度表。这意味着需隐式同步的调度表只能在绝对计数器值处启动,不能在相对计数值处启动:

[SWS_Os_00430] ⌈操作系统模块应禁止在相对计数值处启动需隐式同步的调度表。⌋ ( )

当调度表在绝对计数器值处启动时,每个 expiry 点将在计数器等于服务调用中指定的值加上 expiry 点偏移量时处理。常见用法是通过 StartScheduleTableAbs(Tbl,0) 确保调度表配置中指定的偏移量与底层计数器的绝对数值对应,如下所示:

在这里插入图片描述
后,初始 expiry 点在计数器值为 0 + 初始偏移量时处理)

7.4.2.2 显式同步

显式同步的调度表需要操作系统模块提供额外支持。调度表由操作系统模块的计数器(称为“驱动计数器”)正常驱动,但需与另一个非操作系统模块计数器的“同步计数器”保持同步。

调度表、操作系统模块计数器与同步计数器之间必须满足以下约束:
约束1:
[SWS_Os_00431] ⌈采用显式同步的调度表,其持续时间不得大于驱动计数器的模数。⌋ ( )

约束2:
[SWS_Os_00462] ⌈采用显式同步的调度表,其持续时间必须等于同步计数器的模数。⌋ ( )

约束3:
[SWS_Os_00463] ⌈同步计数器与调度表关联的驱动计数器必须具有相同的分辨率,即调度表的一个 tick 与同步计数器的一个 tick 持续时间相同。⌋ ( )

注:操作系统模块用户需自行验证其系统是否满足约束2和约束3。

显式同步的作用是,操作系统模块需确保每个 expiry 点在同步计数器的绝对数值等于 expiry 点偏移量时处理。这意味着显式同步始终假设调度表的虚拟零点需与同步计数器的绝对数值零同步。

为实现这一点,用户需告知操作系统模块同步计数器的值。由于同步计数器的模数与调度表的持续时间相同,操作系统模块可利用该信息计算调度表时间与同步计数之间的偏差,并自动调整特定配置的 expiry 点之间的延迟(按需延迟或提前),以维持同步。

  1. 启动方式
    启动显式同步调度表有两种方式:
  • 异步启动:在同步计数器的任意值处启动调度表。
  • 同步启动:仅在同步计数已知后,在同步计数器的绝对数值零处启动调度表。这可能意味着需无限期等待首次同步。

异步启动通过现有的绝对和相对调度表启动服务实现。这两种服务均基于驱动计数器(而非同步计数器)设置初始 expiry 点的处理时间,允许调度表在同步计数器值已知前启动。

同步启动需要额外服务,该服务仅在操作系统模块获取同步计数器值后启动调度表。

操作系统模块提供 StartScheduleTableSynchron() 服务(见 SWS_Os_00201),用于同步启动显式同步调度表。初始 expiry 点将在驱动计数器经过 (Duration – Value) + Initial Offset 个 ticks 后处理,其中 Value 是提供给调度表的同步计数器绝对数值。

[SWS_Os_00435] ⌈若显式同步调度表通过同步方式启动,操作系统模块在 StartScheduleTableSynchron() 服务调用返回时,必须保证调度表处于“等待”状态。⌋ ( )

  1. 提供同步计数
    操作系统模块必须获取同步计数器的值。由于调度表持续时间与同步计数器的模数相等,操作系统模块可据此确定调度表时间与同步计数之间的偏差,并判断是否需要采取同步动作。

操作系统模块提供 SyncScheduleTable() 服务(见 SWS_Os_00199),用于向调度表提供同步计数并启动同步。

  1. 指定同步边界
    调度表默认禁止所有 expiry 点的调整。仅当显式配置时,才允许调整。操作系统模块在可调整 expiry 点处的调整范围由以下参数控制:
  • OsScheduleTableMaxShorten:可从 expiry 点偏移量中减去的最大 tick 数
  • OsScheduleTableMaxLengthen:可添加到 expiry 点偏移量的最大 tick 数

下图展示了基于 OsScheduleTableMaxShortenOsScheduleTableMaxLengthen 的行为:

在这里插入图片描述

[SWS_Os_00415] ⌈expiry 点应允许配置 OsScheduleTableMaxShorten,用于定义可从 expiry 点偏移量中减去的最大 tick 数。⌋ ( )

[SWS_Os_00416] ⌈expiry 点应允许配置 OsScheduleTableMaxLengthen,用于定义可添加到 expiry 点偏移量的最大 tick 数。⌋ ( )

在执行同步时,确保调度表上的 expiry 点按照其偏移量定义的总顺序处理至关重要。这意味着 OsScheduleTableMaxShortenOsScheduleTableMaxLengthen 的允许值必须确保下一个 expiry 点不会延迟到过去,也不会提前超过调度表的一个迭代周期。

[SWS_Os_00436] ⌈expiry 点的 (Offset – OsScheduleTableMaxShorten) 值必须大于前一个 expiry 点的 (Offset + OsCounterMinCycle) 值。⌋ ( )

[SWS_Os_00559] ⌈OsScheduleTableMaxLengthen 的值必须小于调度表的持续时间。⌋ ( )

[SWS_Os_00437] ⌈expiry 点的 (OsScheduleTableMaxLengthen + 前一个 expiry 点的延迟) 值必须小于底层计数器的 OsCounterMaxAllowedValue。⌋ ( )

显式同步的调度表允许调度表值与同步计数器值之间存在一定的偏差容限。该容限可以为零,表示仅当两者值相同时,调度表才被视为同步。

[SWS_Os_00438] ⌈调度表应定义一个精度边界,其值在 0 到持续时间范围内。⌋ ( )

  1. 执行同步
    操作系统模块使用同步计数,通过计算下一个 expiry 点延迟的调整量,在每个 expiry 点处支持调度表的(重新)同步。这比仅在最终 expiry 点执行同步能更快地实现调度表同步。

[SWS_Os_00206] ⌈当提供新的同步计数时,操作系统模块应计算显式同步调度表与同步计数器之间的当前偏差。⌋ (SRS_Os_11002)

在提供同步计数前,尝试同步显式同步调度表是无意义的。

[SWS_Os_00417] ⌈操作系统模块应在提供同步计数后开始同步显式同步调度表,并持续调整 expiry 点直至同步完成。⌋ ( )

[SWS_Os_00418] ⌈若偏差小于或等于配置的 OsScheduleTblExplicitPrecision 阈值,操作系统模块应将显式同步调度表的状态设置为“运行且同步”。⌋ ( )

[SWS_Os_00419] ⌈若偏差大于配置的 OsScheduleTblExplicitPrecision 阈值,操作系统模块应将显式同步调度表的状态设置为“运行”。⌋ ( )

[SWS_Os_00420] ⌈若偏差非零,且下一个 expiry 点可调整,且调度表落后于同步计数器(TableTicksAheadOfSyncCounter ≤ TableTicksBehindOfSyncCounter),则操作系统应将下一个 expiry 点设置为从当前 expiry 点开始延迟(delay - min(MaxShorten, Deviation))个 ticks 后到期。⌋ ( )

[SWS_Os_00421] ⌈若偏差非零,且下一个 expiry 点可调整,且调度表领先于同步计数器(TableTicksAheadOfSyncCounter > TableTicksBehindOfSyncCounter),则操作系统应将下一个 expiry 点设置为从当前 expiry 点开始延迟(delay + min(MaxLengthen, Deviation))个 ticks 后到期。⌋ ( )

在这里插入图片描述

操作系统模块提供 SetScheduleTableAsync() 服务(见 SWS_Os_00422),用于取消调度表上可调整 expiry 点处正在执行的同步。

操作系统模块提供 GetScheduleTableStatus() 服务(见 SWS_Os_00227),用于查询调度表的状态(包括同步相关状态)。

7.5 堆栈监控机制

7.5.1 背景与原理

在不提供内存保护硬件的处理器上,仍可能需要针对可检测类别的内存故障提供“基于可用资源的最大努力”方案。堆栈监控将在上下文切换时识别任务或中断服务程序(ISR)是否超出指定的堆栈使用量。这可能意味着系统出错与故障检测之间存在相当长的时间间隔。同样,故障可能在检测到时已被清除(上下文切换时堆栈可能小于指定大小)。

通常,仅监控系统的整个堆栈空间是不够的,因为超出堆栈空间的可能不是正在执行的任务/ISR,而是被抢占的低优先级对象。

让操作系统正确识别出错的任务/2类 ISR 可节省大量调试时间。

注:对于使用内存保护单元(MPU)且属于可扩展性等级 3 或 4 的系统,堆栈溢出可能在堆栈监控检测到故障前引发内存异常。

7.5.2 要求

[SWS_Os_00067] ⌈操作系统模块应提供堆栈监控功能,用于检测任务/2类 ISR 的可能堆栈故障。⌋ (SRS_Os_11003)

[SWS_Os_00068] ⌈若堆栈监控检测到堆栈故障且未配置 ProtectionHook(),操作系统模块应调用 ShutdownOS() 服务,并传入状态 E_OS_STACKFAULT。⌋ (SRS_Os_11003, SRS_Os_11013)

[SWS_Os_00396] ⌈若堆栈监控检测到堆栈故障且配置了 ProtectionHook(),操作系统模块应调用 ProtectionHook() 并传入状态 E_OS_STACKFAULT。⌋ ( )

7.6 操作系统应用(OS-Application)

7.6.1 背景与原理

AUTOSAR 操作系统必须能够支持一组操作系统对象(任务、ISR、警报、调度表、计数器)的集合,这些对象构成一个内聚的功能单元,称为操作系统应用(OS-Application)

操作系统模块负责在共享处理器的多个操作系统应用之间调度可用的处理资源。若使用操作系统应用,所有任务、ISR、计数器、警报和调度表必须属于某个操作系统应用。属于同一操作系统应用的所有对象可相互访问。其他操作系统应用对这些对象的访问权限可在配置时授予。事件的可访问性取决于其所属任务的可访问性。“访问”指这些操作系统对象可作为 API 服务的参数使用。

操作系统应用分为两类:

  1. 可信操作系统应用(Trusted OS-Applications):允许在运行时禁用监控或保护功能。它们可无限制地访问内存、操作系统模块的 API,且无需在运行时强制其定时行为。当处理器支持特权模式时,它们可在特权模式下运行。操作系统模块假设可信操作系统应用(及可信函数)不会导致与内存相关的保护故障。若发生此类故障,系统稳定性可能受损,可能只能选择关机。

  2. 非可信操作系统应用(Non-Trusted OS-Applications):不允许在运行时禁用监控或保护功能。它们对内存和操作系统模块 API 的访问受限,且其定时行为会在运行时被强制约束。当处理器支持特权模式时,它们不允许在特权模式下运行。

操作系统模块本身被假设为可信的。

AUTOSAR 操作系统提供的部分服务可向调用者提供关于访问权限和对象所属关系的信息。这些服务旨在用于跨操作系统应用调用时检查访问权限和参数。

注:资源对象不属于任何操作系统应用,但对它们的访问必须显式授予(多核系统中的自旋锁也遵循此原则)。

运行中的操作系统应用指当前运行的任务或 ISR 所属的操作系统应用。对于钩子程序,触发钩子程序调用的任务或 ISR 决定运行中的操作系统应用。

在这里插入图片描述

操作系统应用具有状态,该状态定义了其他操作系统应用对其操作系统对象的访问范围。每个操作系统应用始终处于以下状态之一:

  • 活动且可访问(APPLICATION_ACCESSIBLE):其他操作系统应用可访问其操作系统对象。这是启动时的默认状态。
  • 正在重启(APPLICATION_RESTART):其他操作系统应用不可访问其操作系统对象。该状态持续到操作系统应用调用 AllowAccess() 为止。
  • 已终止且不可访问(APPLICATION_TERMINATED):其他操作系统应用不可访问其操作系统对象。状态不会再改变。

下图展示了状态及可能的转换:

在这里插入图片描述

7.6.2 要求

[SWS_Os_00445] ⌈操作系统模块应支持操作系统应用,其由可信函数、任务、ISR、警报、调度表、计数器、钩子(启动、错误和关机)的可配置集合组成。⌋ ( )

[SWS_Os_00446] ⌈操作系统模块应支持可信和非可信操作系统应用的概念。⌋ ( )

[SWS_Os_00464] ⌈可信操作系统应用可向其他(甚至非可信)操作系统应用提供服务(“可信服务”)。⌋ ( )

操作系统模块提供 GetApplicationID()GetCurrentApplicationID() 服务(见 SWS_Os_00016),用于确定配置的或当前执行的操作系统应用(每个应用分配唯一标识符)。

操作系统模块提供 CheckObjectOwnership() 服务(见 SWS_Os_00017),用于确定给定任务、ISR、计数器、警报或调度表所属的操作系统应用。

操作系统模块提供 CheckObjectAccess() 服务(见 SWS_Os_00256),用于确定哪些操作系统应用被允许在 API 调用中使用任务、资源、计数器、警报或调度表的 ID。

操作系统模块提供 TerminateApplication() 服务(见 SWS_Os_00258),用于终止调用任务/2类 ISR/应用特定错误钩子所属的操作系统应用(这是操作系统应用级别的 TerminateTask() 服务变体)。

操作系统提供 TerminateApplication() 服务(见 SWS_Os_00258),用于终止另一个操作系统应用;若调用者不属于可信操作系统应用,该服务调用将被忽略。

[SWS_Os_00447] ⌈若操作系统模块终止某个操作系统应用,则必须:

  • 终止该操作系统应用的所有运行中、就绪和等待状态的任务/ISR
  • 禁用该操作系统应用的所有中断
  • 停止该操作系统应用的所有活动警报
  • 停止该操作系统应用的所有调度表。⌋ ( )

[SWS_Os_00448] ⌈操作系统模块应阻止操作系统应用(无论可信还是非可信)访问不属于该应用的对象,除非通过配置显式授予了对这些对象的访问权限。⌋ ( )

操作系统提供 GetApplicationState() 服务(见 SWS_Os_00499),用于查询操作系统应用的当前状态。

[SWS_Os_00500] ⌈在调用 StartOS() 后且任何 StartupHook 调用前,操作系统模块应将所有操作系统应用的状态设置为 APPLICATION_ACCESSIBLE。⌋ ( )

操作系统模块提供 AllowAccess() 服务(见 SWS_Os_00501),用于将操作系统应用自身的状态从 APPLICATION_RESTARTING 设置为 APPLICATION_ACCESSIBLE

[SWS_Os_00502] ⌈若操作系统应用被终止(如通过服务调用或保护钩子)且未请求重启,则操作系统模块应将该应用的状态设置为 APPLICATION_TERMINATED。⌋ ( )

[SWS_Os_00503] ⌈若操作系统应用被终止(如通过服务调用或保护钩子)且请求重启,则操作系统模块应将该应用的状态设置为 APPLICATION_RESTARTING。⌋ ( )

[SWS_Os_00504] ⌈对于未处于 APPLICATION_ACCESSIBLE 状态的操作系统应用,操作系统模块应拒绝其他操作系统应用对其操作系统对象的访问。⌋ ( )

[SWS_Os_00509] ⌈若对属于未处于 APPLICATION_ACCESSIBLE 状态的其他操作系统应用的操作系统对象进行服务调用,则操作系统模块应返回 E_OS_ACCESS。⌋ ( )

例如,对处于重启状态的操作系统应用中的任务调用 ActivateTask() 即符合上述情况。

7.7 保护机制

保护仅适用于操作系统管理的对象。这意味着:

  • 无法在1类 ISR 运行时提供保护,因为操作系统无法感知1类 ISR 的调用。因此,若需要任何保护,必须避免使用1类 ISR。若同时使用1类中断和操作系统应用,则所有1类 ISR 必须属于可信操作系统应用。
  • 无法在同一任务/2类 ISR 体内调用的函数之间提供保护。

7.7.1 内存保护

7.7.1.1 背景与原理

仅在提供内存保护硬件支持的处理器上,内存保护才可行。

内存保护方案基于可执行程序的(数据、代码和堆栈)段:

  • 堆栈:操作系统应用包含多个任务和 ISR。根据定义,这些对象的堆栈仅属于所有者对象,因此即使对象属于同一操作系统应用,也无需在对象之间共享堆栈数据。
    对任务和 ISR 的堆栈进行内存保护主要有两个用途:

    1. 比堆栈监控更及时地检测任务或 ISR 的堆栈溢出和下溢
    2. 在操作系统应用的组成部分之间提供保护,例如满足某些安全约束
  • 数据:操作系统应用可拥有私有数据段,任务/ISR 也可拥有私有数据段。操作系统应用的私有数据段由该应用的所有任务/ISR 共享。

  • 代码:代码段要么为操作系统应用私有,要么可在所有操作系统应用之间共享(用于共享库)。在不使用代码保护的情况下,执行错误代码最终会导致内存、定时或服务违规。

7.7.1.2 要求

数据段和堆栈
[SWS_Os_00198] ⌈操作系统模块应阻止非可信操作系统应用对其自身数据段和堆栈的写访问。⌋ ( )

[SWS_Os_00795] ⌈操作系统应能以与非可信操作系统应用相同的方式限制可信操作系统应用的写访问。⌋ (SRS_Os_11005)
这可通过 OsTrustedApplicationWithProtection 配置。

操作系统应用的私有数据
[SWS_Os_00026] ⌈操作系统模块可阻止其他非可信操作系统应用对某个操作系统应用数据段的读访问。⌋ (SRS_Os_11000)

[SWS_Os_00086] ⌈操作系统模块应允许操作系统应用对其自身的私有数据段进行读和写访问。⌋ (SRS_Os_11006)

[SWS_Os_00207] ⌈操作系统模块应阻止其他非可信操作系统应用对某个操作系统应用私有数据段的写访问。⌋ (SRS_Os_11005)

任务/ISR 的私有堆栈
[SWS_Os_00196] ⌈操作系统模块应允许任务/2类 ISR 对其自身的私有堆栈进行读和写访问。⌋ (SRS_Os_11006)

[SWS_Os_00208] ⌈操作系统模块可阻止同一操作系统应用中的其他任务/ISR 对某个非可信应用的任务/2类 ISR 的私有堆栈的写访问。⌋ (SRS_Os_11005)

[SWS_Os_00355] ⌈操作系统模块应阻止其他非可信操作系统应用对某个操作系统应用的所有任务/2类 ISR 的私有堆栈的写访问。⌋ ( )

任务/ISR 的私有数据
[SWS_Os_00087] ⌈操作系统模块应允许任务/2类 ISR 对其自身的私有数据段进行读和写访问。⌋ (SRS_Os_11006)

[SWS_Os_00195] ⌈操作系统模块可阻止同一操作系统应用中的其他任务/ISR 对某个非可信应用的任务/2类 ISR 的私有数据段的写访问。⌋ (SRS_Os_11005)

[SWS_Os_00356] ⌈操作系统模块应阻止其他非可信操作系统应用对某个操作系统应用的所有任务/2类 ISR 的私有数据段的写访问。⌋ ( )

代码段
[SWS_Os_00027] ⌈操作系统模块可允许操作系统应用保护其代码段,防止非可信操作系统应用执行。⌋ ( )

[SWS_Os_00081] ⌈操作系统模块应能提供共享库代码,这些代码位于所有操作系统应用均可执行的段中。⌋ (SRS_Os_11007)

外设
[SWS_Os_00209] ⌈若 OsTrustedApplicationWithProtection == FALSE,则操作系统模块应允许可信操作系统应用对进行读和写访问。⌋ ( )

[SWS_Os_00083] ⌈操作系统模块应允许非可信操作系统应用仅对其分配的外设进行写访问(包括具有写副作用的读操作)。⌋ ( )

内存访问违规
[SWS_Os_00044] ⌈若检测到内存访问违规,操作系统模块应调用保护钩子,并传入状态码 E_OS_PROTECTION_MEMORY。⌋ (SRS_Os_11013)

7.7.2 定时保护

7.7.2.1 背景与原理

在实时系统中,当任务或中断在运行时错过其截止时间(deadline),即发生定时故障。

AUTOSAR 操作系统不提供用于定时保护的截止时间监控。在 AUTOSAR 系统中,截止时间监控不足以正确识别导致定时故障的任务/ISR。当截止时间被违反时,可能是由于无关任务/ISR 的定时故障干扰/阻塞时间过长所致。此时,故障源于无关任务/ISR,但会在系统中传播,直至某个任务/ISR 错过其截止时间。因此,错过截止时间的任务/ISR 不一定是运行时出错的任务/ISR,而只是定时故障被检测到的最早点。

若基于通过截止时间监控识别的错过截止时间采取行动,可能会错误地终止正常的操作系统应用,而允许出错的操作系统应用继续运行。以下示例可很好地说明这一问题。考虑一个具有以下配置的系统:

任务ID优先级执行时间截止时间(=周期)
A15
B310
C515

假设所有任务在时间0准备运行,预期执行轨迹如下,所有任务均满足其各自的截止时间。

在这里插入图片描述

现在考虑任务A和B行为异常的情况。下图显示任务A和B的执行时间均超过规定值,且任务B比规定时间早2个ticks到达。两个任务A和B均满足其截止时间。然而,任务C行为正常,但由于任务A和B的错误执行而错过其截止时间。这就是故障传播——系统中无关部分的故障导致正常部分失效。

在这里插入图片描述

在 AUTOSAR 操作系统等固定优先级抢占式操作系统中,任务或 ISR 是否满足其截止时间取决于以下因素:

  • 系统中任务/ISR 的执行时间
  • 任务/ISR 因低优先级任务/ISR 锁定共享资源或禁用中断而遭受的阻塞时间
  • 系统中任务/ISR 的到达间隔率

为实现安全且准确的定时保护,操作系统必须在运行时控制这些因素,确保任务/ISR 能够满足其各自的截止时间。

AUTOSAR 操作系统通过以下方式防止源于上述因素的定时错误:

  1. 使用执行时间保护,为以下对象的执行时间提供静态配置的上限(称为“执行预算”):

    • 任务
    • 2类 ISR
  2. 使用锁定时间保护,为以下对象的时间提供静态配置的上限(称为“锁定预算”):

    • 任务/2类 ISR 持有资源的时间
    • 任务/2类 ISR 暂停操作系统中断的时间
    • 任务/2类 ISR 暂停/禁用所有中断的时间
  3. 使用到达间隔时间保护,为以下对象之间的时间提供静态配置的下限(称为“时间帧”):

    • 任务因以下原因转换到就绪状态的时间:
      • 激活(从挂起状态到就绪状态的转换)
      • 释放(从等待状态到就绪状态的转换)
    • 2类 ISR 的到达时间
      当2类 ISR 被操作系统识别时,即视为一次到达。

基本任务的到达间隔时间保护控制连续激活之间的时间,无论激活是否排队。在排队激活的情况下,激活处于就绪或运行状态的基本任务视为新激活,因为这代表任务新实例的激活。因此,到达间隔时间保护与排队激活交互,控制队列的填充速率。

扩展任务的到达间隔时间保护控制连续激活和释放之间的时间。当任务处于等待状态且通过一次 SetEvent() 调用设置多个事件时,视为一次释放。当任务等待一个或多个已设置的事件时,视为一次虚拟的等待/释放/启动转换,因此视为新释放。

下图展示了执行时间保护和到达间隔时间保护如何与 AUTOSAR 操作系统的任务状态转换模型交互:

在这里插入图片描述

注:

  1. 对2类 ISR 的到达间隔时间保护可用于保护 ECU 免受“喋喋不休”的中断源影响(例如,CAN 控制器每次从网络上的其他 ECU 接收帧时产生中断)。
  2. 定时保护仅适用于任务或2类 ISR。1类 ISR 无保护。若在1类 ISR 期间发生定时保护错误,无法保证操作系统模块的一致性。因此,不建议在包含1类中断的系统中使用定时保护。
  3. 定时保护在操作系统模块启动前不适用。
  4. 对于可信操作系统应用,所有定时信息必须准确,否则系统可能在运行时失效。对于非可信操作系统应用,定时保护可用于在可执行对象之间强制实施定时边界。
7.7.2.2 要求

[SWS_Os_00028] ⌈在非可信操作系统应用中,操作系统模块应对该非可信操作系统应用的每个任务/2类 ISR 应用定时保护。⌋ (SRS_Os_11008)

[SWS_Os_00089] ⌈在可信操作系统应用中,操作系统模块应能对该应用的任务/2类 ISR 应用定时保护。⌋ (SRS_Os_11008)

[SWS_Os_00397] ⌈若未配置操作系统应用,操作系统模块应能对任务/2类 ISR 应用定时保护。⌋ ( )

任务的定时保护
[SWS_Os_00064] ⌈若任务的 OsTaskExecutionBudget 耗尽,操作系统模块应调用保护钩子,并传入 E_OS_PROTECTION_TIME。⌋ (SRS_Os_11008, SRS_Os_11013)

[SWS_Os_00473] ⌈操作系统模块应在任务转换到挂起或等待状态时重置其 OsTaskExecutionBudget。⌋ (SRS_Os_11008)

[SWS_Os_00465] ⌈操作系统模块应将任务的到达间隔时间限制为每个 OsTaskTimeFrame 一次。⌋ (SRS_Os_11008)

[SWS_Os_00469] ⌈操作系统模块应在任务被成功激活时启动 OsTaskTimeFrame。⌋ (SRS_Os_11008)

[SWS_Os_00472] ⌈操作系统模块应在任务被成功释放时启动 OsTaskTimeFrame。⌋ (SRS_Os_11008)

[SWS_Os_00466] ⌈若在 OsTaskTimeFrame 结束前尝试激活任务,操作系统模块不应执行激活操作,且应调用保护钩子,并传入 E_OS_PROTECTION_ARRIVAL。⌋ ( )

[SWS_Os_00467] ⌈若在 OsTaskTimeFrame 结束前尝试释放任务,操作系统模块不应执行释放操作,且应调用保护钩子,并传入 E_OS_PROTECTION_ARRIVAL,同时事件应被设置。⌋ ( )

ISR 的定时保护
[SWS_Os_00210] ⌈若2类 ISR 的 OsIsrExecutionBudget 耗尽,操作系统模块应调用保护钩子,并传入 E_OS_PROTECTION_TIME。⌋ (SRS_Os_11013)

[SWS_Os_00474] ⌈操作系统模块应在 ISR 将控制权返回给操作系统或终止时重置其 OsIsrExecutionBudget。⌋ (SRS_Os_11008)

[SWS_Os_00470] ⌈操作系统模块应将2类 ISR 的到达间隔时间限制为每个 OsIsrTimeFrame 一次。⌋ (SRS_Os_11008)

[SWS_Os_00471] ⌈操作系统模块应从识别到中断的时刻(即在操作系统中断包装器中)开始测量 OsIsrTimeFrame。⌋ (SRS_Os_11008)

[SWS_Os_00048] ⌈若在 OsIsrTimeFrame 结束前发生2类中断,操作系统模块不应执行用户提供的 ISR,且应调用保护钩子,并传入 E_OS_PROTECTION_ARRIVAL。⌋ (SRS_Os_11008)

资源锁定和中断禁用的定时保护
[SWS_Os_00033] ⌈若任务/2类 ISR 持有 OSEK 资源且超过 Os[Task|Isr]ResourceLockBudget,操作系统模块应调用保护钩子,并传入 E_OS_PROTECTION_LOCKED。⌋ (SRS_Os_11008, SRS_Os_11013, SRS_Os_11014)

[SWS_Os_00037] ⌈若任务/2类 ISR 通过 Suspend/Disable|All/OS|Interrupts() 禁用中断且超过配置的 Os[Task|Isr][All|OS]InterruptLockBudget,操作系统模块应调用保护钩子,并传入 E_OS_PROTECTION_LOCKED。⌋ (SRS_Os_11008, SRS_Os_11013, SRS_Os_11014)

7.7.2.3 实现说明

执行时间强制需要硬件支持,例如定时强制中断。若使用中断实现时间强制,该中断的优先级必须足够高,能够“中断”被监控的任务或 ISR。

根据实际硬件支持,DisableAllInterruptsSuspendAllInterrupts 可能不会禁用所有中断(例如,除用于定时保护的中断外的所有中断),或者对1类 ISR(绕过操作系统及定时保护)的使用可能会受到某种限制。

实现必须记录此类特定于实现的行为(例如,使用定时保护时的限制)。

7.7.3 服务保护

背景与原理
由于操作系统应用可通过服务与操作系统模块交互,必须确保服务调用不会损坏操作系统模块本身。服务保护在运行时防止此类损坏。

需考虑以下几种情况:

  1. 操作系统应用进行 API 调用时:
    • 使用无效句柄或超出范围的值。
    • 在错误的上下文(如在 StartupHook() 中调用 ActivateTask())。
    • 未进行导致 OSEK 操作系统处于未定义状态的 API 调用(如未调用 ReleaseResource() 就终止)。
    • 影响系统中其他所有操作系统应用的行为(如 ShutdownOS())。
    • 操作属于其他操作系统应用的操作系统对象(且无必要权限)(如操作系统应用尝试对其不拥有的任务执行 ActivateTask())。

OSEK 操作系统已通过服务调用返回的状态码提供部分服务保护,这将作为服务保护的基础。这意味着服务保护仅适用于 OSEK 操作系统的扩展状态。

然而,OSEK 操作系统并未涵盖上述所有情况。以下部分除了强制扩展状态外,还描述了在每种情况下应应用的额外保护要求。

7.7.3.1 无效对象参数或超出范围的值

背景与原理
当前 OSEK 操作系统的服务调用已针对无效对象(即未在 OIL 文件中定义的对象)返回 E_OS_ID,针对超出范围的值(如设置警报周期小于 OsCounterMinCycle)返回 E_OS_VALUE

7.7.3.2 要求

[SWS_Os_00051] ⌈若向操作系统服务传递无效地址(该地址不可被此操作系统应用写入)作为输出参数,操作系统模块应返回状态码 E_OS_ILLEGAL_ADDRESS。⌋ (SRS_Os_11009, SRS_Os_11013)

7.7.3.3 错误上下文的服务调用

背景与原理
当前 OSEK 操作系统定义了服务调用的有效调用上下文(见 [15]),但仅针对一小部分无效调用提供保护,例如在2类 ISR 中调用 TerminateTask()

服务任务1类 ISR2类 ISR错误钩子任务前钩子任务后钩子启动钩子关机钩子警报回调保护钩子
ActivateTask
ActivateTaskAsyn
TerminateTaskC
ChainTaskC
ScheduleC
GetTaskID
GetTaskState
…(其余服务见表)

表中“C”表示仅在扩展状态下通过 E_OS_CALLEVEL 检查有效性。

7.7.3.4 要求

[SWS_Os_00088] ⌈若操作系统应用从错误的上下文进行服务调用,且当前不在1类 ISR 中,操作系统模块不应执行请求的操作(服务调用无效果),并返回 E_OS_CALLEVEL 或服务的“无效值”。⌋ (SRS_Os_11009, SRS_Os_11013)

7.7.3.5 具有未定义行为的服务

背景与原理
在扩展状态下,OSEK 操作系统存在一些未定义行为的情况。这在需要保护时是不可接受的,因为这会允许通过操作系统自身的服务调用损坏操作系统模块。因此,操作系统模块的服务保护实现必须描述并实现一种不会危害系统或任何未导致特定错误的操作系统应用完整性的行为。

7.7.3.6 要求

任务未调用 TerminateTask()ChainTask() 就结束
[SWS_Os_00052] ⌈若任务从其入口函数返回而未调用 TerminateTask()ChainTask(),操作系统模块应终止该任务(若配置,调用 PostTaskHook())。⌋ (SRS_Os_11009)

[SWS_Os_00069] ⌈若任务从其入口函数返回而未调用 TerminateTask()ChainTask(),且配置了错误钩子,操作系统模块应在任务离开运行状态前调用错误钩子,并传入状态 E_OS_MISSINGEND(无论任务是否导致其他错误,如 E_OS_RESOURCE)。⌋ (SRS_Os_11009)

[SWS_Os_00070] ⌈若任务从入口函数返回而未调用 TerminateTask()ChainTask(),且仍持有 OSEK 资源,操作系统模块应释放这些资源。⌋ (SRS_Os_11009, SRS_Os_11013)

[SWS_Os_00239] ⌈若任务从入口函数返回而未调用 TerminateTask()ChainTask(),且中断仍处于禁用状态,操作系统模块应启用中断。⌋ ( )

2类 ISR 结束时中断锁定或资源分配
[SWS_Os_00368] ⌈若2类 ISR 调用 DisableAllInterupts() / SuspendAllInterrupts() / SuspendOSInterrupts() 并在未调用相应的 EnableAllInterrupts() / ResumeAllInterrupts() / ResumeOSInterrupts() 的情况下结束(返回),操作系统模块应执行缺失的服务,并在配置了错误钩子时调用错误钩子,传入状态 E_OS_DISABLEDINT。⌋ ( )

[SWS_Os_00369] ⌈若2类 ISR 调用 GetResource() 并在未调用相应的 ReleaseResource() 的情况下结束(返回),操作系统模块应执行 ReleaseResource() 调用,并在配置了错误钩子时调用错误钩子,传入状态 E_OS_RESOURCE(见 [12],第13.1节)。⌋ ( )

ShutdownOS() 期间调用 PostTaskHook()
[SWS_Os_00071] ⌈若配置了 PostTaskHook(),操作系统模块在调用 ShutdownOS() 时不应调用该钩子。⌋ ( )

任务/ISR 在无相应禁用操作的情况下调用启用中断服务
[SWS_Os_00092] ⌈若调用 EnableAllInterrupts() / ResumeAllInterrupts() / ResumeOSInterrupts() 且之前未执行相应的 DisableAllInterupts() / SuspendAllInterrupts() / SuspendOSInterrupts(),操作系统模块不应执行该操作系统服务。⌋ (SRS_Os_11009)

任务/ISR 在禁用/暂停中断时调用操作系统服务
[SWS_Os_00093] ⌈若任务/ISR/钩子禁用/暂停了中断,且该任务/ISR/钩子调用了任何操作系统服务(中断服务除外),则操作系统模块应忽略该服务,若服务返回 StatusType 值,则返回 E_OS_DISABLEDINT。⌋ (SRS_Os_11009, SRS_Os_11013)

7.7.3.7 非可信操作系统应用的服务限制

背景与原理
可用的操作系统服务调用根据调用上下文受到限制(见7.7.3.2节)。在受保护系统中,需要对非可信操作系统应用执行的 API 调用施加额外约束,以防止其执行对系统有全局影响的调用。每个限制级别都是前一级别的真子集,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定义了两个完整性级别:

  1. 可信
  2. 非可信
    与可信和非可信操作系统应用完全对应。
7.7.3.8 要求

[SWS_Os_00054] ⌈操作系统模块应忽略非可信操作系统应用对 ShutdownOS() 的调用。⌋ ( )

7.7.3.9 不同操作系统应用中对象的服务调用

背景
7.7.3.1节指出,OSEK 操作系统服务调用在对象无效时返回 E_OS_ID。在保护方案下,服务调用可能因调用者对对象无有效权限而无效(这是多操作系统应用系统中的新含义)。

这与 OSEK 操作系统中对象不可访问的情况类似(例如,当任务尝试获取系统中存在但未配置为该任务使用的资源时)。

7.7.3.10 要求

[SWS_Os_00056] ⌈若操作系统对象标识符作为操作系统模块系统服务的参数,且在配置时未为调用任务/2类 ISR 分配对该操作系统对象的足够访问权限(参数 Os[...]AccessingApplication),则操作系统模块的系统服务应返回 E_OS_ACCESS。⌋ (SRS_Os_11001, SRS_Os_11010, SRS_Os_11013)

[SWS_Os_00449] ⌈CheckTaskMemoryAccessCheckIsrMemoryAccess 检查内存访问。所有操作系统应用均可进行内存访问检查,且无需授予权限。⌋ ( )
SWS_Os_00449SWS_Os_00056 的例外情况。

[SWS_Os_00450] ⌈CheckObjectAccess 检查操作系统对象的访问权限。所有操作系统应用均可进行对象访问检查,且无需授予权限。⌋ ( )
SWS_Os_00450SWS_Os_00056 的例外情况。

7.7.4 保护操作系统使用的硬件
7.7.4.1 背景与原理

在支持特权和非特权模式的处理器上,通常某些寄存器及修改这些寄存器的指令在非特权模式下不可访问。

在这类硬件上,让操作系统模块在特权模式下运行,任务/ISR 在非特权模式下运行,可保护对操作系统模块操作至关重要的寄存器免受非特权模式下执行的对象的无意损坏。操作系统模块的服务需要在特权模式下执行,因为它们需要修改在非特权模式下受保护的寄存器。

操作系统模块可使用 MPU 的控制寄存器、定时器单元、中断控制器等,因此必须保护这些寄存器免受非可信操作系统应用的访问。

7.7.4.2 要求

[SWS_Os_00058] ⌈若硬件支持,操作系统模块应在非特权模式下执行非可信操作系统应用。⌋ ( )

[SWS_Os_00096] ⌈在硬件支持的范围内,操作系统模块应禁止非可信操作系统应用访问由操作系统模块管理的控制寄存器。⌋ (SRS_Os_11011)

[SWS_Os_00245] ⌈若发生指令异常(如除零错误),操作系统模块应调用保护钩子,并传入 E_OS_PROTECTION_EXCEPTION。⌋ (SRS_Os_11011)

7.7.4.3 实现说明

当操作系统模块运行非可信操作系统应用时,必须仔细管理中断入口和钩子程序的处理。

中断处理:在 MCU 支持不同模式的情况下(如本节所述),ISR 需要操作系统模块在 ISR() 包装器中执行额外工作。ISR 通常在特权模式下进入。若处理程序属于非可信操作系统应用,则 ISR() 包装器必须确保在处理程序执行前切换到非特权模式。

7.7.5 提供“可信函数”
7.7.5.1 背景与原理

操作系统应用可调用由(另一个)可信操作系统应用提供的可信函数。这可能需要从非特权模式切换到特权模式。这通常通过以下操作实现:

每个可信操作系统应用可导出可被其他操作系统应用调用的服务。

在配置时,这些可信服务必须配置为可被非可信操作系统应用调用。

从非可信操作系统应用到可信服务的调用使用操作系统提供的机制(如陷阱/软件中断)。服务通过标识符传递,该标识符用于在可信环境中确定服务是否可被调用。

操作系统提供服务以检查某个内存区域是否可被操作系统应用读写/执行访问,还返回该内存区域是否为堆栈空间的信息。

操作系统软件规范不支持“非可信服务”。

7.7.5.2 要求

[SWS_Os_00451] ⌈操作系统模块应允许从可信操作系统应用导出服务。⌋ ( )

操作系统模块提供 CallTrustedFunction() 服务(见 SWS_Os_00097),用于从(可信或非可信)操作系统应用调用可信函数。

[SWS_Os_00100] ⌈若调用 CallTrustedFunction() 且被调用的可信函数未配置,操作系统模块应调用错误钩子,并传入 E_OS_SERVICEID。⌋ ( )

操作系统模块提供 CheckISRMemoryAccess()CheckTaskMemoryAccess() 服务(见 SWS_Os_00512 和 SWS_Os_00513),供操作系统应用检查某个内存区域是否可被任务/2类 ISR 读写/执行访问,并返回该内存区域是否为堆栈空间的信息。

7.8 保护错误处理

7.8.1 背景与原理

操作系统可基于操作系统应用组成部分在运行时可执行操作的静态配置信息检测保护错误(见7.7节)。

与监控不同,保护机制会在错误发生时捕获错误状态,从而使错误状态转换与故障检测之间的时间最短。术语表中描述了不同类型的保护错误。若在操作系统模块启动前发生保护错误,其行为未定义。若在关机期间(如在应用特定的关机钩子中)发生保护错误,可能在关机服务和保护钩子之间发生无限循环。

发生保护错误时,操作系统模块调用用户提供的保护钩子,以在运行时通知保护错误。保护钩子在操作系统模块的上下文中运行,因此必须是可信代码。

操作系统模块本身只需检测错误并提供行动能力。保护钩子可从操作系统模块提供的四个选项中选择一个,在从保护钩子返回后执行,具体取决于保护钩子的返回值。这些选项是:

  1. 不执行任何操作
  2. 强制终止出错的任务/2类 ISR
  3. 强制终止出错的操作系统应用中的所有任务和 ISR
    a. 不重启操作系统应用
    b. 重启操作系统应用
  4. 关闭操作系统模块。

要求 SWS_Os_00243SWS_Os_00244 定义了在找不到出错的任务/2类 ISR 或操作系统应用时的默认反应顺序,例如在系统特定的钩子程序中。此外,操作系统应用仅在可扩展性等级 3 和 4 中是必需的,因此在其他可扩展性等级中无需定义操作系统应用。

注:“强制终止中断”在“强制终止出错的 ISR”和“强制终止操作系统应用”中的处理方式不同。若强制终止出错的 ISR,则终止当前 ISR 调用,允许后续调用。若强制终止操作系统应用,则也禁用中断源,防止后续中断。

关于返回值 PRO_IGNORE 的说明
“不执行任何操作”(PRO_IGNORE)意味着忽略错误反应。PRO_IGNORE 仅在特定情况下(当前为:到达率错误)允许使用。在检测到错误后(如 SWS_Os_00466SWS_Os_00467 中指定),调用保护钩子。若钩子返回 PRO_IGNORE,操作系统将继续正常操作。若服务调用是违规的根源(如 ActivateTask()),且保护钩子返回 PRO_IGNORE,则服务调用应继续其操作(如激活任务)并返回 E_OK(若成功且可能)。

示例1:任务调用 ActivateTask(B) 导致到达率违规。不执行激活(SWS_Os_00466)并调用保护钩子。当返回 PRO_IGNORE 时,操作系统继续,ActivateTask() 服务激活 B 并返回 E_OK

示例2:任务 A 为正在等待事件的任务 B 调用 SetEvent()。操作系统检测到(SWS_Os_00467)到达率违规,并调用保护钩子。当调用返回 PRO_IGNORE 时,SetEvent() 服务继续并设置事件。任务 B 转换到就绪状态,可能发生重新调度。SetEvent() 服务调用将向任务 A 返回 E_OK

7.8.2 要求

[SWS_Os_00211] ⌈操作系统模块应使用与操作系统模块相同的权限执行 ProtectionHook()。⌋ ( )

[SWS_Os_00107] ⌈若未配置 ProtectionHook() 且发生保护错误,操作系统模块应调用 ShutdownOS()。⌋ (SRS_Os_11014)

[SWS_Os_00106] ⌈若 ProtectionHook() 返回 PRO_IGNORE 且调用时传入 E_OS_PROTECTION_ARRIVAL,操作系统模块应将控制权返回给用户应用。⌋ (SRS_Os_11014)

[SWS_Os_00553] ⌈若 ProtectionHook() 返回 PRO_TERMINATETASKISR,操作系统模块应强制终止出错的任务/2类 ISR。⌋ ( )

[SWS_Os_00554] ⌈若 ProtectionHook() 返回 PRO_TERMINATEAPPL,操作系统模块应强制终止出错的操作系统应用。⌋ ( )

[SWS_Os_00555] ⌈若 ProtectionHook() 返回 PRO_TERMINATEAPPL_RESTART,操作系统模块应强制终止出错的操作系统应用,随后重启该操作系统应用。⌋ ( )

[SWS_Os_00556] ⌈若 ProtectionHook() 返回 PRO_SHUTDOWN,操作系统模块应调用 ShutdownOS()。⌋ ( )

[SWS_Os_00506] ⌈若 ProtectionHook() 被传入 E_OS_PROTECTION_ARRIVAL 调用,唯一有效的返回值是 PRO_IGNOREPRO_SHUTDOWN。返回其他值将导致调用 ShutdownOS()。⌋ ( )

[SWS_Os_00475] ⌈若 ProtectionHook() 返回 PRO_IGNORE 且调用时未传入 E_OS_PROTECTION_ARRIVAL,操作系统模块应调用 ShutdownOS()。⌋ ( )

[SWS_Os_00243] ⌈若 ProtectionHook() 返回 PRO_TERMINATETASKISR 且找不到与错误相关联的任务或 ISR,操作系统模块将强制终止运行中的操作系统应用。若甚至无法分配操作系统应用,则调用 ShutdownOS()。⌋ (SRS_Os_11014)

[SWS_Os_00244] ⌈若 ProtectionHook() 返回 PRO_TERMINATEAPPLPRO_TERMINATEAPPL_RESTART 且无法分配操作系统应用,则调用 ShutdownOS()。⌋ (SRS_Os_11014)

[SWS_Os_00557] ⌈若 ProtectionHook() 返回 PRO_TERMINATEAPPL_RESTART 且为出错的操作系统应用未配置 OsRestartTask,则调用 ShutdownOS()。⌋ ( )

[SWS_Os_00108] ⌈若操作系统模块强制终止任务,它将终止该任务,释放所有分配的 OSEK 资源,若任务之前调用了 DisableAllInterrupts() / SuspendOSInterrupts() / SuspendAllInterrupts() 而未调用相应的 EnableAllInterrupts() / ResumeOSInterrupts() / ResumeAllInterrupts(),则调用这些函数。⌋ (SRS_Os_11014)

[SWS_Os_00109] ⌈若操作系统模块强制终止中断服务程序,它将清除中断请求,中止中断服务程序(中断源保持当前状态),释放中断服务程序已分配的所有 OSEK 资源,若中断之前调用了 DisableAllInterrupts() / SuspendOSInterrupts() / SuspendAllInterrupts() 而未调用相应的 EnableAllInterrupts() / ResumeOSInterrupts() / ResumeAllInterrupts(),则调用这些函数。⌋ (SRS_Os_11014)

[SWS_Os_00110] ⌈若操作系统模块需强制终止操作系统应用,它必须:

  • 强制终止该操作系统应用的所有任务/ISR
  • 取消该操作系统应用的所有警报
  • 停止该操作系统应用的所有调度表
  • 禁用属于该操作系统应用的2类 ISR 的中断源⌋ (SRS_Os_11014)

[SWS_Os_00111] ⌈当操作系统模块重启操作系统应用时,它应激活配置的 OsRestartTask。⌋ ( )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值