AUTOSAR_EXP_ARAComAPI.pdf的第4章笔记

4 Fundamentals

为了理解AUTOSAR_EXP_ARAComAPI.pdf的第4章内容,生搬硬套的翻译了一把,准备先囫囵吞枣,再仔细理解。因为这些内容的理解也不是一时半会儿的。所以先放上来。

AUTOSAR_EXP_ARAComAPI.pdf的概述

因此,ara::com不提供任何类型的组件模型或框架,这些模型或框架将负责组件生命周期、程序流管理或根据相应应用程序的正式组件描述简单地设置ara::com API对象。所有这些都可以很容易地构建在基本的ara::com API之上,并且不需要标准化来支持典型的协作模型。 在API的设计阶段,我们不断质疑我们草案的每一部分,它是否允许来自AP供应商的高效IPC实现,因为我们知道,您可以很容易地在API抽象级别上破坏它,这使得很难或几乎不可能实现性能良好的绑定。 中心设计点之一是——如导言中所述——同样支持轮询和事件驱动编程范例。 因此,您将在后面的章节中看到,应用程序开发人员在使用ara::com时,可以自由选择最适合其应用程序设计的方法,而与他是实现通信关系的服务消费者还是服务提供者无关。 这允许支持严格实时调度的应用程序,其中应用程序需要完全控制在何时何地做什么(量),不必要的上下文切换是最关键的。 另一方面,也完全支持更宽松的基于事件的应用程序,只要通信层有数据可用,这些应用程序就会收到通知。 AUTOSAR决定真正支持C++11/C++14 for AP非常适合ara::com API设计。 为了增强可用性、舒适性和优雅,ara::com API利用了C++的一些特性,如智能指针、模板函数和类、异步操作的成熟概念以及合理的操作符重载。

4.1 Proxy/Skeleton Architecture

如果你曾经从程序员的角度接触过中间件技术,那么Proxy/Skeleton架构的方法可能对你来说很熟悉。看看使用Proxy/Skeleton(有时甚至称为存根/框架)范例的中间件技术的数量,称之为“经典方法”是合理的。所以对于ara::com,我们也决定使用经典的 Proxy/Skeleton 架构。

该模式的基本思想是,从正式的服务定义中生成两个代码工件:

  • 服务代理:从远程服务的服务消费者的角度来看,该代码是在代码级别上表示该服务的门面。在面向对象的语言绑定中,这通常是一个生成类的实例,它为服务提供的所有功能提供方法。因此,服务消费者端应用程序代码与这个本地facade进行交互,本地facade知道如何将这些调用传播到远程服务实现并返回。

  • 服务框架:从根据服务定义提供功能的服务实现的角度来看,该代码是允许将服务实现连接到通信管理传输层的代码,以便分布式服务消费者可以联系服务实现。 在面向对象的语言绑定中,这通常是生成的类的实例。通常,应用程序开发人员的服务实现通过子类关系与这个生成的类相连接。

因此,服务端应用程序通过实现生成的类的抽象方法调用生成的类的方法与AutoSar CM中间件进行交互。

4.2 Means of Communication

现在,我们已经讨论了Proxy/Skeleton体系结构,让我们继续讨论如何在Proxy/Skeleton之间进行通信。ara::com定义了四种不同的机制来在服务器和客户端之间进行通信

  • Methods

  • Events

  • Fields

  • Triggers

在使用这些机制之前,必须实例化服务,并且服务器必须向系统提供自己(OfferService())。然后,客户端需要使用代理( FindService()StartFindService())找到并连接到服务实例

4.3 ara::com Event and Trigger based communication

Client Application连接到服务器时,它可以订阅(subscribe())服务器提供的服务中的事件,如图4.2所示。

Figure4.2:ara::com eventbased communication

当事件数据可用时, Sever Application将事件数据发送( send())到CM中间件,通知所有订阅的Client Application。然后,订阅者可以使用 GetNewSamples()直接或通过由通知触发回调(由 SetReceiveHandler()定义)获取事件样本。特定条件下,服务器使用Trigger来通知用户何时获取事件样本。它不传输任何数据。它使用与事件相同的订阅-通知机制.

4.4 ara::com Method based communication

使用基于Method的通信,Client Application调用远程服务器上的Method。该Method可能会向客户端返回值。如果提供了返回值,ara::core::Futureara::core::Promise模式用于为通信提供非阻塞行为。服务器可以针对方法调用的不同处理模式进行配置。这些选项包括:

  • 事件驱动,并发(kEvent): 传入的服务方法调用以基于事件的方式处理。

  • 事件驱动,顺序(kEventSingleThread):与单线程基础上的kEvent相同。

  • 轮询(KPoll):传入的服务方法调用需要通过调用ProcessNextMethodCall以轮询方式进行显式处理

4.5 ara::com Field based communication

通过基于Field的通信,服务器可以为一些数据(即:变量)提供,客户端可以随时访问更新这些值。Field的功能可以被视为事件和方法的组合:

  • 像事件一样,客户端可以订阅值的变化。将使用与事件相同的通知机制通知客户端(由SetReceiveHandler()定义)。

  • 使用方法,客户端可以通过调用get-operation (Get())来检索值,或者通过为代理中的字段调用Set-operation(Set())来更新值。

在服务器端,Field的处理在Skeleton实现中:

  • 定义回调:当客户端更新值时调用回调(由RegisterSetHandler()定义)。

  • 当需要向客户端发布新值时,调用更新方法(update())。

4.6 Data Type Abstractions

4.7 Error Handling

4.8 Service Connection Approach

4.8.1 Instance Identifiers and Instance Specifiers

ProxySkeleton端使用的Instance Identifiers是一个非常重要的概念,所以在接下来的章节中,在详细描述ara::comProxySkeleton之前,在这里给出它们的解释。

ara::com中,当在客户端/代理端需要搜索服务的特定实例时,或者在服务器/框架端创建服务的特定实例时,会使用Instance Identifiers

ara::com API级别,Instance Identifiers通常是特定于技术绑定的标识符。

因此,构成这种Instance Identifiers的具体内容/结构完全是技术特定的:

SOME/IP使用16位无符号整数标识符来区分同一服务类型的不同实例,而DDS (DDS-RPC)使用String< 256 >作为service_instance_name。

与绑定技术无关,任何具体Instance Identifiers抽象外观都应适用于ara::com命名空间中ara::com API级别的签名:

class InstanceIdentifier 
{
public:static ara::core::Result<InstanceIdentifier> Create(StringView serializedFormat) noexcept;explicit InstanceIdentifier(ara::core::StringView serializedFormat);ara::core::StringView ToString() const;bool operator==(const InstanceIdentifier& other) const;bool operator<(const InstanceIdentifier& other) const;InstanceIdentifier& operator=(const InstanceIdentifier& other);
};

正如您所看到的,实例标识符接口ara::com::InstanceIdentifier,提供了一个接收字符串的ctor(代表构造函数),这意味着它可以由字符串表示来构造。它还提供了一个ToString()方法,该方法允许获取与ara::com::InstanceIdentifier的字符串。

这对接收字符串表示的ctor写出字符串表示的可能性使得ara::com::InstanceIdentifier“可序列化”。这允许它被传输、保存、以后重用(稍后将详细介绍潜在的使用案例)。

对于ara::com的用户来说,反省这个字符串(试图解释内容)是没有意义的。如上所述:内容将高度特定于中间件产品/绑定!

由于基于ara::com的应用程序所使用的技术绑定是由集成商在部署期间定义/指定的,因此ara::com软件开发商对其内容/结构的任何期望通常都是无效的。然而,将它记录/跟踪到日志通道可能有助于调试分析。

那么,软件开发人员从哪里得到这样一个高度绑定的ara::com::InstanceIdentifier来用于ara::com API调用呢?

答案是:通过ara::com提供的功能,该功能将软件开发人员在其领域中通常使用的逻辑本地名称转换为特定于技术/绑定的ara::com::InstanceIdentifier。这种间接控制了两种挑战:

  • 使用ara::com的开发人员不需要了解任何关于绑定及其细节的知识

  • 集成商可以在部署中调整绑定

构造ara::com::InstanceIdentifier本地名称基本上来自AUTOSAR元模型(描述软件组件模型)。对这个本地名称的要求——从现在开始我们称之为“instance specifier”——是它在可执行文件中是明确的。它的基本形式是:

 <context 0>/<context 1>/ ... / <context N> / <port name>

这种“instance specifier”的C++表示是ara::core::InstanceSpecifier类。从结构上看,它类似于ara::com::InstanceIdentifier:

class InstanceSpecifier final
{
public:
// ctor to build specifier from AUTOSAR short name identifier
// with ’/’ as separator between package names
static Result<InstanceSpecifier> Create(StringView metaModelIdentifier);
explicit InstanceSpecifier(StringView metaModelIdentifier);
InstanceSpecifier(const InstanceSpecifier& other);
InstanceSpecifier(InstanceSpecifier&& other) noexcept;InstanceSpecifier& operator=(const InstanceSpecifier& other);InstanceSpecifier& operator=(InstanceSpecifier&& other);~InstanceSpecifier() noexcept;StringView ToString() const noexcept;bool operator==(const InstanceSpecifier& other) const noexcept;bool operator==(StringView other) const noexcept;bool operator!=(const InstanceSpecifier& other) const noexcept;bool operator!=(StringView other) const noexcept;bool operator<(const InstanceSpecifier& other) const noexcept;};

如果确保了明确性,集成者/部署者可以通过“manifest file”将具有其特定实例id的专用技术绑定分配给那些“实例说明符”,该“manifest file”专门用于Executable的不同实例化/执行。这显式地允许N次启动同一个Executable,每次使用不同的“manifest file”,以不同的方式映射同一个ara::core::InstanceSpecifier。 关于ara::com与元模型的关系以及嵌套内容的性质的细节可以在后续章节中读到。API ara::com提供了以下函数,用于将ara::core::InstanceSpecifier(软件开发人员领域中的本地名称)转换为技术ara::com::InstanceIdentifier:

namespace ara {namespace com {namespace runtime {ara::core::Result<ara::com::InstanceIdentifierContainer> ResolveInstanceIDs(ara::core::InstanceSpecifier modelName);}}}

为什么这个API确实会返回一个ara::com::InstanceIdentifier container,它代表一个ara::com::InstanceIdentifier集合, 需要解释一下: AUTOSAR支持集成人员可以在一个软件组件开发者可见的抽象标识符后面配置多个技术绑定。这种特性称为多重绑定,在本文档的不同部分都有提及(在AUTOSAR_EXP_ARAComAPI.pdf 7.3节中有更详细的解释)。 在Skeleton/Server端使用多重绑定是一个常见的用例,因为它只是允许不同的客户机在联系服务器时使用它们的首选绑定。相反,在Proxy/Client使用多重绑定是一种非常奇特的方法。例如,它可以用于支持一些故障转移方法(如果绑定A不起作用,则求助于绑定B)。

因此,调用ResolveInstanceIDs()的可能结果是:

  • 空列表:集成器未能提供抽象标识符的映射。这很可能是配置错误。

  • 单元素列表:常见案例,映射到一个具体技术绑定的一个具体实例id。

  • 多元素的列表:映射到可能具有多个技术绑定的多个技术实例。

从技术上讲,ResolveInstanceIDs()中间件实现从捆绑在Process中的service instance manifest中查找ara::core::InstanceSpecifier。因此,ara::core::InstanceSpecifier在捆绑的service instance manifest中必须是明确的。

4.8.2 When to use InstanceIdentifier versus InstanceSpecifier

根据前面的解释,可能会产生这样的印象:在使用需要InstanceIdentifier 信息的ara::com API之前,软件开发人员总是必须首先手动(通过调用ResolveInstanceIDs())将ara::core::InstanceSpecifier解析为ara::com::InstanceIdentifier。正如我们已经提到的,对于软件开发人员来说,AutoSar AP SWC的“典型”方法是使用来自软件组件模型领域的抽象“instance specifiers”,这确实有点尴尬。正如您将在接下来的章节中看到的,这些章节详细介绍了Proxy/Skeleton端的API,ara::com提供了典型的函数重载,这些重载要么采用ara::com::InstanceIdentifier,要么采用ara::core::InstanceSpecifier,从而使开发人员在最常见的用例中解放出来,只需使用ara::core::InstanceSpecifier就可以显式调用ResolveInstanceIDs() 。这意味着,ara::com::InstanceIdentifier的直接使用和ara::core::InstanceSpecifier的手动解析更适用于具有特定/特殊用例的高级用户。各章中将给出一些例子, 其中讨论了代理/框架端的相应ara::com API重载。这两种变体的根本区别是ara::com::InstanceIdentifier可以更容易地在AP应用程序/进程之间交换!

因为它们已经准确地包含了所有特定于技术的信息,并且不需要通过service instance manifest的内容进行任何进一步的解析,所以这种序列化的ara::com::InstanceIdentifier可以在不同的进程中重新构建,并且只要该进程能够访问ara::com::InstanceIdentifier所基于的相同绑定技术,就可以使用它。

4.8.2.1 Transfer of an InstanceIdentifier

如前所述,ara::com::InstanceIdentifier应该只用于“高级用户”,因为它的格式依赖于供应商,并且包含技术绑定信息。因此,ara::com::InstanceIdentifier的传输或存储可能非常危险。因为在传输或重新存储之后传输绑定可能不再存在,或者供应商A的ara::com::instance标识符可能被使用供应商B的应用程序解释.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408208.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2022 - 制作自己的C#类库dll,并输出Unity识别的pdb调试信息文件

然后编写库代码&#xff0c;设置dll生成目录 *** 输出unity可以识别的pdb调试信息文件 *** 右键项目-属性-生成-高级-调试信息&#xff1a;可移植(Portable PDB) 这是因为Unity只能识别MDB和Portable PDB文件 这样设置后&#xff0c;把dll和pdb文件放入到Unity中同文件夹下&…

002、架构_概览

GoldenDB 主要由管理节点、计算节点、数据节点、全局事务节点等模块组成&#xff0c;各个节点无需共享任何资源&#xff0c;均为独立自治的通用计算机节点&#xff0c;之间通过高速互联的 网络通讯&#xff0c;从而完成对应用数据请求的快速处理和响应。 管理节点在数据库中主要…

【JVM】剖析字符串与数组的底层实现(一)

剖析字符串与数组的底层实现 字符数组的存储方式 JVM有三种模型: 1.Oop模型:Java对象对应的C对象2.Klass模型:Java类在JVM对应的C对象3.handle模型 字符串常量池 即String Pool&#xff0c;但是JVM中对应的类是StringTable&#xff0c;底层实现是一个hashtable,如代码所示 …

三级_网络技术_42_综合题(命令)

一、 如图所示&#xff0c;某园区网用10Gbps的POS技术与intemet相连&#xff0c;POS接囗的帧格式是SDH。在R3上配置一个oopback接口&#xff0c;"P地址为10.2.15.1&#xff0c;路由协议的选择方案是&#xff0c;园区网内部采用OSPF动态路由协议&#xff0c;园区网与Inter…

如何使用ssm实现基于面向对象的学生事务处理系统分析与设计

TOC ssm138基于面向对象的学生事务处理系统分析与设计jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化…

go中 panicrecoverdefer机制

go的defer机制-CSDN博客 常见panic场景 数组或切片越界&#xff0c;例如 s : make([]int, 3); fmt.Println(s[5]) 会引发 panic: runtime error: index out of range空指针调用&#xff0c;例如 var p *Person; fmt.Println(p.Name) 会引发 panic: runtime error: invalid m…

AJAX(4)——XMLHttpRequest

XMLHttpRequest 定义&#xff1a;XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用于操作的情况下&#xff0c;更新页面的局部内容。XMLHttpRequest在AJAX编程中被大量使用 关系…

MATLAB 手动实现点云投影滤波器 (76)

点云投影到邻近的精确拟合平面,减少噪声点,此为投影滤波器 MATLAB 手动实现点云投影滤波器(76) 一、投影滤波器简介二、实现步骤二、算法实现1.代码2.效果这里用到的投影方法和平面拟合方法以及生成平面方法都在以往文章有所实现,有兴趣可参考: MATLAB点云处理总目录 一…

C++动态规划及九种背包问题

目录 目录 一&#xff0c;动态规划 一&#xff09;&#xff0c;动态规划的定义 二&#xff09;&#xff0c;动态规划其他的相关概念&#xff08;也是使用条件&#xff09; 1&#xff0c;重叠子问题 2&#xff0c; 最优子结构 3&#xff0c;无后效性 三&#xff09;&…

dompdf导出pdf中文乱码显示问号?、换行问题、设置图片大小

环境&#xff1a;PHP 8.0 框架&#xff1a;ThinkPHP 8 软件包&#xff1a;phpoffice/phpword 、dompdf/dompdf 看了很多教程&#xff08;包括GitHub的issue、stackoverflow&#xff09;都没有解决、最终找到解决问题的根本&#xff01; 背景&#xff1a;用Word模板做转PDF…

【JavaEE初阶】IP协议

目录 &#x1f4d5;引言 &#x1f334;IP协议的概念 &#x1f333;IP数据报 &#x1f6a9;IPv4协议头格式 &#x1f6a9;IPv6的诞生 &#x1f3c0;拓展 &#x1f384;IP地址 &#x1f6a9;IP地址的格式&#xff1a; &#x1f6a9;IP地址的分类 &#x1f3c0;网段划分…

【第57课】SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

Unity动画模块 之 Animator中一些常见参数

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 我发现我忘了写Animator了&#xff0c;正好有些不常用的参数还没怎么认识,笔记来源于唐老狮 1.状态窗口参数 2.连线参数…

如何使用ssm实现学生公寓管理系统的设计与实现

TOC ssm106学生公寓管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

Qt第十八章 XML和Json格式解析

文章目录 JSON格式解析Json生成案例 XML简介与HTML的区别格式XML解析流的方式DOM XML生成 JSON与XML的区别比较 JSON 格式 JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名 六个构造字符 开始和结束数组&#xff1a;[ ]开始和结束对象&#x…

简易STL实现 | Vector的实现

1、内存管理 1、std::vector 维护了两个重要的状态信息&#xff1a;容量&#xff08;capacity&#xff1a;当前 vector 分配的内存空间大小&#xff09;和大小&#xff08;size&#xff1a; vector 当前包含的元素数量&#xff09; 2、当容量不足以容纳新元素时&#xff0c;s…

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

一 问题起因 在公司,使用ssh登录远程服务器。有一天,mac终端提示:`kex_exchange_identification: Connection closed by remote host Connection closed by UNKNOWN port 65535`。 不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。…

巴恩斯利蕨数学公式及源码实现——JavaScript版

为什么要写这篇文章 本篇接《张侦毅&#xff1a;巴恩斯利蕨数学公式及源码实现》。之前文章中源码的编程语言用的是Java&#xff0c;JDK的版本为8&#xff0c;现在我的JDK版本已经升级到22了&#xff0c;在新版本JDK中&#xff0c;原来的JApplet方法已经被废弃&#xff0c;不能…

鸿蒙实现在图片上进行标注

一.实现思路 现在需求是&#xff1a;后端会返回在这张图片上的相对位置&#xff0c;然后前端这边需要在图片上进行标注&#xff0c;就是画个框框圈起来&#xff0c;返回的数据里包括当前框的x,y坐标和图片大小&#xff0c;大体思路就是使用canvas绘制&#xff0c;使用鸿蒙的st…

vue-element-admin解决三级目录的KeepAlive缓存问题(详情版)

vue-element-admin解决三级目录的KeepAlive缓存问题&#xff08;详情版&#xff09; 本文章将从问题出现的角度看看KeepAlive的缓存问题&#xff0c;然后提出两种解决方法。本文章比较详细&#xff0c;如果只是看怎么解决&#xff0c;代码怎么改&#xff0c;请前往配置版。 一…