6.1 State Management
状态管理功能集群负责车辆的状态管理器,负责收集用户应用程序的状态请求,包括保持通信或保持ECU活动; 监控来自Hypervisor的命令;监控网络管理的状态;它仲裁这些需求,控制总体的ECU到一个特定的状态,最后将最终状态反馈给EM模块,由EM模块来负责切换状态,控制应用程序的启动和停止。
状态管理中定义了Machine state和function group state 功能组状态的当前集合,并通过反馈状态改变的请求给执行管理它们来启动状态转换。
执行管理根据当前状态执行状态转换并控制实际运行的进程的状态。
状态管理收集新Machine state请求和function group state请求以及仲裁请求,协调来自不同来源的状态请求。仲裁时可能需要考虑其他数据和事件。 状态更改的请求的来源可能是:
平台健康管理PHM触发错误恢复,例如激活回退功能诊断,将系统切换到诊断状态更新和配置管理,将系统切换到可以更新软件或配置的状态。网络管理以协调所需功能和网络状态授权应用程序,例如可能位于不同机器或不同ECU上的车辆状态管理器的状态更改请求可以由其他功能集群通过ara::com服务接口发出。由于状态管理功能是关键的,因此必须保护来自其他功能集群或应用程序的访问,例如IAM(身份和访问管理)。
状态管理由平台健康管理监控。状态管理提供接口来请求有关当前状态的信息。此外,状态管理还提供以更细粒度的方式控制流程的功能,例如支持延迟的“唤醒”、执行特定于应用程序的重置操作或控制应用程序的通信行为。
所有这些都是在不需要从内存中删除进程的情况下完成的,并且使用不同的启动参数组重新加载/重新启动它们。
状态管理功能是高度特定于项目的,AUTOSAR决定暂时不指定类似于自适应平台的经典平台BswM这样的功能。
计划只指定一组基本服务接口,将实际仲裁逻辑封装成项目特定的代码(如库),可以插入状态管理框架,框架与仲裁逻辑之间有标准化接口,可以在不同的平台上重用。
仲裁逻辑代码可以根据标准化配置参数单独开发或(部分)生成。
在自适应平台中,状态决定了一组活动的自适应应用程序。特定的用户应用程序,状态管理器,决定何时请求状态更改,从而更改当前活动的应用程序集。
通常,状态管理器是特定于项目的应用程序,因为何时更改状态的语义不是AUTOSAR标准化的。
状态管理功能集群支持状态管理器,它通过api提供状态更改机制来请求状态更改、序列化功能组的状态更改请求以及管理实际的状态转换。
作为一个功能集群,状态管理向支持状态改变和状态完成通知的应用程序提供了一个C++ API。
例如,更新和配置管理功能集群可能需要更新状态以使应用程序能够原位更新。
在这种情况下,状态管理器应用程序将请求将状态更改为状态管理,然后根据需要执行停止和启动应用程序的转换。
在RTA-VRTE中,状态转换的控制是执行管理的一个组成部分。但是,一个单独的库提供状态客户机API,因此必须链接到任何使用状态管理的应用程序。
6.2 Responsibilities
在自适应平台中,状态管理功能集群在两个级别上支持状态更改,从而支持机器内活动自适应应用程序集的更改:
MachineState 机器状态
主要用于控制机器生命周期(启动/关闭/重启)、平台级进程和其他基础设施。
每个Machine上必须存在几个强制机器状态。其他特定于项目的machine state可以在machine manifest中定义。
AUTOSAR标准定义了许多预定义的MachineState状态,也可以根据需要定义其他状态。
Function Group State 功能组状态
主要用于单独启动和停止功能一致的用户级应用程序进程组,即用于控制(通常是功能上的)相关应用程序实例的执行。它们可以在机器清单中配置。
过程状态
流程状态用于应用程序生命周期管理,由执行管理内部状态机实现。
执行状态
执行状态表征应用程序可执行文件(即进程)的任何实例的内部生命周期。每个进程必须向执行管理报告执行状态更改。
自适应平台中还有第三级状态:实例的执行状态。此状态由应用程序实例本身在内部管理,例如使用ReportExecutionState API,因此不受状态管理功能集群的控制。
允许的execution state 由AUTOSAR定义,不能扩展。
每次功能组状态更改时,可将自适应平台配置为启动和/或停止一个或多个应用程序实例。
当应用程序实例被分配给一个或多个功能组状态时,实例和状态之间的关联在执行管理配置期间发生。
注意:MachineState是功能组的特例。在RTA-VRTE中,两个状态系统由公共API管理。对于本文档,术语功能组状态应理解为包括MachineState。
当State Manager 请求的功能组状态更改被功能组状态控制器接受并执行操作时(参见图7.2),将考虑每个状态中分配的应用程序实例:
分配给“旧”和“新”状态的实例仍在运行。停止未分配给“新”状态的实例。启动未分配到“旧”状态的实例。
请注意,不能将实例同时分配给“旧”和“新”状态,而是使用不同的命令行参数,因为根据定义,这些参数由不同的InstanceIf对象表示。
6.2.1 Management or Manager
状态管理在自适应平台体系结构中被描述为一个不同的功能集群。然而,状态改变的责任实际上是分开的:
•State Manager –负责决定何时更改功能组状态。
•State Management –负责处理功能组状态更改(例如,当State Manager请求时),并提供请求此类更改的接口。
在RTA-VRTE中,状态管理功能集群与责任划分相呼应。状态管理负责集成在执行管理中,例如功能组状态控制器(见图12),状态管理职责包含在RTA-VRTE API支持的用户应用程序中,以请求状态更改。
状态管理器应用程序决定何时更改功能组状态。存在哪些功能组和状态以及何时发生状态更改是特定于项目的,因此AUTOSAR没有对其进行标准化。RTA-VRTE早期访问程序包括包括简单示例状态机的示例应用程序。
6.2.2 State Machine
在经典平台中,ECU配置以ECU状态管理器和BSW模式管理器的形式包含了ECU内状态管理方式的完整描述。ECU配置描述是高度通用的,能够表达许多不同的状态和启动状态之间转换的条件。然而,通用性是有代价的;配置是复杂而脆弱的。
自适应平台采用了一种不同的方法;而不是一种通用但复杂的描述,平台决定何时在应用程序域中启动状态更改。因此,用户实现了状态管理器应用程序,该应用程序封装了一个状态机,该状态机决定必要条件何时到位,从而启动状态转换。但是,状态变化是如何发生的,由自适应平台本身通过状态管理提供的API进行管理。
6.2.3 Function Group Control
在RTA-VRTE中,功能组的创建和控制是执行管理的一个组成部分。
执行管理中的状态管理功能响应来自用户的状态管理器应用程序的状态更改请求。用户的状态管理器应用程序包含RTA-VRTE的StateClient类的实例,该类定义了客户端应用程序请求状态更改和读取函数组当前状态的接口。
注意:必须使用setRoleAsSM方法将用户的状态管理器应用程序实例标记为这样。这个调用建立了状态管理器和执行管理之间的链接。如果不这样做,那么状态更改请求将导致错误。
为了响应来自状态管理器的功能组状态更改请求,状态管理功能集群通过与执行管理中的流程控制的交互来启动或停止应用程序实例。状态更改完成后,将通过SetState API期间传递的处理程序通知用户的状态管理器应用程序–处理程序是从IStateClientNotificator类派生的类。
IStateClientNotificator是一个抽象基类,它定义了客户端应用程序接收函数组状态更改的异步通知的接口。状态管理器应用程序应使用公共继承派生一个子类,该子类随后实现IStateClientNotificator API,然后在发出状态更改请求时传递对此类实例的引用。
6.2.4 State Management APIs
RTA-VRTE早期访问计划的状态管理功能集群是执行管理的一个组成部分。
在执行管理配置期间,使用FunctionGroup_GetOrCreate和FunctionGroupState_ GetOrCreate API创建新的函数组和状态,并访问现有的组/状态。
一旦在执行管理配置期间创建和/或访问了功能组状态,就可以使用AddToFunctionGroupState方法将应用程序实例分配给该状态。
RTA-VRTE最多支持40个功能组。每个功能组最多可以有20个状态,每个状态最多可以分配40个实例。
MachineState只是函数组的一个特例,因此在RTA-VRTE中,两个状态系统由公共api管理。MachineState功能组由RTA-VRTE预定义,可以通过符号exm::FuncGroup::MachineState.访问。
6.2.5 Function Group Configuration
功能组,包括预定义的MachineState功能组,在执行管理配置期间进行配置。通常,以下配置由Adaptive Studio生成,但如果需要,也可以手动创建。
首先,使用FunctionGroup_GetOrCreate API访问函数组:
一旦访问,就可以在函数组中创建状态。这些状态可以来自结构FuncGroupState中的预定义状态,也可以由用户指定:
此外,在配置期间,必须将每个应用程序实例分配给一个或多个功能组,以确保由执行管理启动。
状态管理预定义函数组FuncGroup::MachineState。可以在执行管理配置期间访问此组,然后将每个应用程序实例分配给FuncGroupState结构定义的预定义机器状态之一,例如:
Instance* instance = getNewInstance();
instance->AddToFunctionGroupState( FuncGroup::MachineState, FuncGroupState::STARTUP );
注意:未能将应用程序实例分配给至少一个功能组(包括MachineState),将导致执行管理从未启动该应用程序。