目录
9.8 AUTOSAR Persistent Data Update and Removal API
9.8.1 RegisterApplicationDataCallback
9 Persistency
9.1 What is Persistency?
持久性是自适应平台体系结构中的一个功能集群。
持久性功能集群提供了对底层文件系统的自适应应用程序的访问,这有两个原因。
首先,持久性功能集群使平台能够对存储实施访问控制和资源管理。
其次,AUTOSAR支持的PSE51子集不允许直接访问文件系统。自适应应用程序可以使用持久性功能集群跨多个行驶循环存储状态。
作为一个功能集群,持久性将C++ API应用于实现持久存储数据的应用程序,这些数据既可以是平面文件,也可以是关键值数据库。C++ API在AutoSar标准命名空间ara::per中实现。持久性API通常与AUTOSAR标准一致。
因此,作为RTA-VRTE库的一部分提供的功能集群代码必须链接到任何使用持久性的应用程序中
9.2 Responsibilities
持久性功能集群负责管理对底层文件系统的自适应应用程序访问。集群使自适应平台能够控制对存储的访问,从而强制执行访问和资源管理。
从当前版本开始,AUTOSAR没有为持久性定义访问控制或资源管理。
持久性为访问文件系统提供了两种抽象:
•直接文件访问–通过端口原型对文件进行读/写访问(RTA-VRTE支持直接访问)。
•键值数据库–支持成对键和相关值的内存平面数据库。
9.3 Configuration
应用程序通过可执行文件的自适应软件组件中声明的PortPrototype访问持久性管理的文件和键值数据库。
提供的和必需的端口在自适应软件组件中用于访问通信和访问持久数据;
在后一种情况下,提供的端口指定写访问,必需的端口指定读访问。
RTA-VRTE包括HADL领域特定语言(DSL),它支持创建所有必需的ARXML清单元素。例如,要声明一个ARXML包,其中包含一个具有两个端口的自适应软件组件:
package RootPackageName {
component MyComponent {
provide PPort for Interface1
require RPort for Interface2
}
}
双向端口指定读/写访问
自适应软件组件中的每个PortPrototype都由一个接口进行分类。HADL DSL接口<type>定义支持AUTOSAR接口的定义,用于“文件”或“键值”数据库访问。
在定义中,类型定义持久性接口类型:PerFileProxy或PerKeyValueDatabase。
名称空间<ns>用于确保具有相似名称的接口是可区分的。
package RootPackageName {
interface namespace {
...
}
}
持久性的应用程序接口围绕自适应软件组件的端口定位。应用程序设计器知道端口的简称。shortName用于创建要传递给持久性API的InstanceSpecifier,例如OpenFileStorage或OpenKeyValueStorage。例如:
#include <ara/per/file_storage>
auto myFile = ara::core::InstanceSpecifier( "portName" );
auto fsres = OpenFileStorage( myFile );
有关Adaptive Studio应用程序设计编辑器和HADLDSL的更多详细信息,请参见第13.2节。有关文件访问API的详细信息,请参阅第9.6节;有关键值数据库API的详细信息,请参阅第9.7节。
9.4 Direct File Access
持久性的RTA-VRTE实现支持直接文件访问。
自适应应用程序使用FileStorage类的实例来创建读/写/读写访问器类,然后这些类可以用来访问文件。访问类如图9.1所示
FileStorage对象工厂的实例是实例化ReadAccessor和ReadWriteAccessor类的唯一受支持的方法。
FileStorage对象工厂不能直接实例化,而是通过OpenFileStorage函数创建的。此函数返回对象工厂的实例,然后可以使用该实例创建一个或多个文件访问器对象。OpenFileStorage函数的参数是一个InstanceSpecifier,它引用一个部署,该部署反过来定义一个文件夹的路径,在该文件夹中创建和管理文件及其冗余副本。
#include <ara/per/file_storage.h>
// Create file access object factory instance
auto fsres = OpenFileStorage( ara::core::InstanceSpecifier( FactoryShortname ) );;
然后,可以使用文件代理访问器对象工厂实例创建文件访问器类的实例,例如ReadAccessor,然后可以读取/写入文件,例如:
9.5 Key-Value Database
持久性功能集群支持键值数据库,可用于对文件中的信息施加结构。
键值数据库存储多个数据项,其中每个数据项是一对键和一个值。持久性API提供了对数据库中的对进行操作的机制,包括使用已知键定位值、查找数据库中存在的所有键,以及最后更新与值关联的值。
OpenKeyValueStorage对象工厂函数是创建KeyValueStorage类实例的唯一受支持的机制;它不能直接实例化。
OpenKeyValueStorage返回的值是Result<T>的一个实例。值方法可用于对数据库进行操作。
9.5.1 Primitive Data
对于原始数据,例如整数,可以使用KeyValueStorage类的方法直接访问键值对,例如:
database.Value()->SetValue( "key", 1ul );
KeyValueStorage类支持每个标准AUTOSAR数据类型的重载方法。
9.5.2 Complex Data
持久性还支持表单或记录和数组中的复杂数据。
通过在返回C++容器的KEYValuestOrror类中附加的重载GETValk和StValValk方法来支持复杂数据。
9.6 AUTOSAR File Access API
RTA-VRTE支持ara::per命名空间中的AUTOSAR文件访问API
9.6.1 OpenFileStorage
自适应应用程序使用此函数创建对象工厂,以生成ReadAccessor和ReadWriteAccessor类的实例。FileStorage对象的方法是创建文件访问对象的唯一方法,因为这些类不能直接实例化。
fs参数是由PersistencyFileProxyInterface键入的PortPrototype的短名称路径。
返回值是一个Result<T>,包含一个SharedHandle<T>,或PerErrc中为持久性定义的一个错误。
9.6.2 RecoverAllFiles
恢复整个文件存储,包括所有文件。此方法允许在冗余检查失败时恢复文件存储。
返回值是一个结果<void>,为空或包含PerErrc中为持久性定义的错误之一。特别是,当文件存储当前打开时,返回将包含一个kResourceBusyError错误(可以使用结果的错误进行访问)。
此方法对所有文件进行“尽力而为”的恢复。恢复后,文件可能会显示过期或初始内容,或者可能会丢失。
fs参数是由PersistencyFileProxyInterface键入的PortPrototype的短名称路径。
9.6.3 ResetAllFiles
重置整个文件存储,包括所有文件。此方法允许将文件存储重置为初始状态,仅包含从清单部署的文件及其初始内容。
fs参数是由PersistencyFileProxyInterface键入的PortPrototype的短名称路径。
9.6.5.2 OpenFileReadWrite
9.6.5.2 OpenFileReadWrite
9.8 AUTOSAR Persistent Data Update and Removal API
持久性功能集群允许更新、删除或重置所有FileStorage和KeyValueStorage实例。应用程序还可以注册和回调函数,这些函数将在更新FileStorage或KeyValueStorage的任何实例后调用。
9.8.1 RegisterApplicationDataCallback
Name ara::per::RegisterApplicationDataCallback
Entity Type Function Header ara/per/update.h
Arguments std::function <void(InstanceSpecifier , String)> appDataUpdateCallback
Return Type void
Description:用持久性注册应用程序数据更新回调。如果可能需要更新存储的应用程序数据,则持久性将调用提供的回调函数。此决定基于可执行版本。最后一次访问持久性的版本作为回调的参数提供,以及引用更新的键值存储或文件存储的InstanceSpecifier。
提供的函数将从UpdatePersistency、OpenKeyValueStorage或OpenFileStorage的上下文中调用。
参数appDataUpdateCallback是持久数据更新后持久性调用的回调函数。将使用更新的KeyValueStorage或FileStorage的短名称路径以及上次访问持久性的可执行版本来调用该函数。