「冰羚」— 撑起自动驾驶未来的“中间件”

2023-05-16

当谈到自动驾驶的软件开发,人们首先想到的,是深不可测的人工智能算法,是各种感知融合,是各类路径规划...但是,就算是再智能再高深的算法,如果没有底层操作系统的支持,一切都将是纸上谈兵。

而即便拥有了一套优秀的操作系统也还远远不够,我们还需要一条重要的“纽带”来承上启下,使上层应用与底层操作系统可以紧密的”连接“起来!

而这条重要的“纽带”,就是我在本文中将为大家详细介绍的一种全新的,或许能够支撑起自动驾驶未来整体软件架构的“主心骨” - iceoryx「冰羚」

IceOryx冰羚系统的结构

冰羚的组成如下:

  • 一个RouDi守护进程
  • 多个加载了"Posh Runtime"运行时的进程

RouDi守护进程

RouDi 的名称由来是’‘Rou’‘ting 和’‘Di’'scovery,其是冰羚系统的核心,并且负责如下功能:

  • Service discovery(服务发现):
    RouDi是Publisher(发布者)和Subscriber(订阅者)的中心节点
  • Shared memory management(共享内存管理):
    RouDi初始化冰羚系统所使用的共享内存以及内存分配
  • System introspection(系统性能监查):
    RouDi掌握冰羚系统当前已经存在的端口的所有信息,包括端口自的连接以及其内存的使用情况,并且RouDi提供工具给应用方来查询这些信息。

RouDi可以被认为是冰羚系统的管理服务,任何运行的冰羚系统中都有一个运行的RouDi实例,RouDi使用Posh运行库中的模组来完成其管理的功能。

Posh Runtime运行时

Posh Runtime运行时是一个拥有独立内存地址空间的运行实体,并且其参与了冰羚系统的运行。
在一个POSIX系统中,一个Posh runtime运行时和一个Posix进程是等价的。
Posh runtime运行时可以向冰羚系统发布服务,或者发现别的Posh runtime运行时发布的服务。
通过Posh runtime运行时发布的服务之间通过event(事件)进行通信,并且事件流是使用了合理的发布-订阅语法。
发布的服务必须显式地向RouDi进行注册以进行通信(和RouDi以及其他Posh runtime)。

共享内存管理

基础

当一个POSIX进程启动后,其就拥有了自己独立的虚拟地址空间。虚拟地址空间的范围对于每一个进程都是相同的,但是对于特定地址上的数据来说,该地址上的数据对于每一个进程来说,其数据内容都是不同的。

一个应用使用指针访问其进程运行后所拥有的虚拟地址空间。在进程的虚拟地址空间中,有不少内存区域(memory areas)的数据是被加载或者映射(mapped)的。对于进程的地址空间来说,这些内存区域是不连续的。下面是可能出现在这些内存区域中的一些内容:

  • 程序的运行指令(例如可执行文件中的.text段)
  • 静态变量的申明(例如执行文件中的.data段)
  • 加载的共享库中的执行指令(例如so中的.text段)
  • 进程的栈
  • 进程的堆
  • 共享内存段

共享内存段依赖进程外部的物理存储(例如RAM上的一些区域或者文件系统),这些外部的物理存储是通过map映射的方式映射到自己的地址空间中,这样进程就可以访问这些存储。
一个存储段可以被映射到多个进程中,但是在每个进程中,其被映射的基地址很可能是不同的。
在这里插入图片描述

The POSIX API provides the utilities for working with
shared memory segements.

组织

冰羚系统使用一个“management”段来管理服务间时间通信所使用的任意数量的“user”段。
这些“user”段是被逻辑分区到"mempools“(内存池)中,Mempools中包含一定数量的大小相同的“memory chunks”(存储块)

在冰羚系统中,Memory chunks(存储块)是访问共享内存的基础单元。
在这里插入图片描述
冰羚所使用内存段(segments)的数量是定义在其RouDi守护进程启动运行的时候跟随的配置文件中的[mempools]项目下的,配置文件中[mempools]下面包含一个或者多个segments的配置,其中定义了每一个segment中包含的chunk的数量和segment中每一个chunk的大小。
对于这个配置文件的使用,详细的可以查看 usage guide

通信机制

在这个章节中,我们会了解一下冰羚系统中的服务间通信的概念。

端口(Port)

端口代表的数据流的实体,冰羚中有不同类型的端口,他们在使用时,携带的信息的类型是有区别的。
目前存在的端口类型有以下几种:

  • SenderPort - 服务使用这种端口来输出任意数据
  • ReceiverPort - 服务使用这种端口从其他服务接收任意数据
  • InterfacePort - 本地冰羚系统和远程冰羚系统之间交互信息所使用的网关端口(下面会有更多关于网关的说明)

本地冰羚系统中,服务之间的数据流我们一般使用Sender Port和Receiver Port之间的连接(connections)来描述。
冰羚系统中,一个 Publisher(发布者)通过一个SenderPort发布数据,类似的,一个Subscriber(订阅者)通过一个 ReceiverPort接收数据。

服务发现(Service Discovery / 端口连接(Port Wiring)

在冰羚中,Publishers 和 Subscriber是通过其内在的SenderPorts 和 ReceiverPorts.之间的连接来进行匹配的。SenderPorts 和 ReceiverPorts.之间的连接是建立在服务描述(service description)上的。
服务描述(service description)有如下组成:

  • A service id - 服务ID,标识服务的类型
  • A service instance id - 服务实例的ID,标识具体的服务实例
  • An event id - 事件ID,标识当前服务的输出

所有的SenderPorts and ReceiverPorts创建时都需要提供service description服务描述,冰羚系统会根据端口创建时的服务描述来进行相互匹配并且自动连接不同的Port端口。

端口出现的顺序不是重要的因素(或者说不需要很关心端口出现的顺序),已经存在的ReceiverPorts会自动连接到后面创建的 SenderPorts,只要其服务描述能够匹配即可连接。

此外,冰羚系统中已经存在的 SenderPorts的信息是依赖于 InterfacePorts.的,这就允许一些实体(例如网关)使用这些Port端口,并且hook到本地冰羚系统的数据流以及创建一个和外部冰羚系统间的桥接。

零拷贝服务间通信(Zero-copy Interservice Communication)

已经互相连接的SenderPorts 和ReceiverPorts 通过共享内存可以进行通信,这个催生了零拷贝通信(zero-copy communication)

一个 SenderPort 被分配了共享内存用于写入数据,在一个POSIX系统中,这个操作被文件访问权限所约束,因为这个共享内存段实际上代表了虚拟文件。

为了输出数据,一个 SenderPort 在其分配的内存段中预定了一个内存块,冰羚系统会只能的选择符合输出数据结构的大小最小的那个内存块,注意,那整个内存块被预定急事数据结构的大小小于这个内存块实际占有的大小。

一个 SenderPort显式地选择何时写入数据到内存块中并且分发数据给到所有依附于他的ReceiverPorts (通过服务发现机制建立连接的那些Receiver Port),当发送数据后,指向内存块的一个指针会被放置到ReceiverPort. 的队列中,ReceiverPort. 因此可以方便的使用指针访问这个内存块的数据。

一个 ReceiverPort 必须显式的标识出何时他已经完成了对于接收到的指定内存块的处理,之后,当所有和该 SenderPort建立连接的 ReceiverPort 都标识出已经完成指定内存块的处理时,该内存块会被归还给内存池。

一个关于指针的备注(A Note on Pointers)

像之前已经讨论过的那样,在一个进程的虚拟地址空间中共享内存段可以被映射到不同的区域,为了处理这个特性,冰羚使用了特殊的指针类型: iox::RelativePointeriox::RelocatablePointer.
使用这些类型,不同地址的内存映射就不再会影响对于内存块的定位了。

更多关于上述指针类型的详细讨论可以参考here.
/iceoryx_utils/doc/relocatable_pointer/relocatable_pointer.md

冰羚系统间的通信(Internode Communication)

部署在不同主机上的冰羚系统间可以通过网桥(“Gateways”)进行网络连接。网桥负责同步不同冰羚系统中 SenderPorts之间发布的数据。

1 中间件

解释iceoryx「冰羚」之前,我们不妨先来简单地了解一个重要的概念- 「中间件」

「 中间件 」的主要任务,是负责各类应用软件模块之间的通信以及对系统资源的调度。

它的优点,是可以大大降低应用层软件的开发难度,使研发工程师可以完全把注意力集中到功能算法的开发上。而目前最为业内所熟知的「中间件」当属Classic AUTOSAR中的RTE(Runtime Environment)了。它不仅负责上层SWC(Sofware Component)之间的通讯,也同时负责对SWC进行调度以及对底层操作系统及通讯服务的调用。

总的来说,「中间件」是整个软件架构的核心组成部分。

如果你使用过Linux或QNX等操作系统,就一定会接触一种使用进程间通信的机制(IPC:inter-process communiction),来完成拥有不同虚拟地址空间(virtual address space)的系统应用(Application)之间的数据传输。

而本文的主角iceoryx「冰羚」就是由罗伯特·博世公司 (Robert Bosch GmbH) 自动驾驶部门的架构大牛Michael Pöhnl先生发明的

一种基于 「 零拷贝 」 (zero-copy)和 「 共享内存 」 (shared memory)技术来优化 「 进程间通信 」 (IPC)的 「中间件」(Middleware)

2 IPC的核心问题

所周知,在汽车,机器人和游戏等领域,各个软件系统的不同部分之间需要传输大量数据。

在过去的几十年中,由最初的发动机控制系统,发展到当下热门的辅助驾驶/自动驾驶等等,汽车电子技术有了革命性的发展。随之而来的,是电子控制单元(ECU)中不同执行线程(threads of execution)之间的数据传输单位从KB/s增加到了GB/s,而能够 完整地“支撑”自动驾驶功能的数据传输速度甚至将会达到10 GB/s(图 1)。

图 1:ECU内部数据交换的演变 [1]

其中最典型的一种支持IPC的「中间件」解决方案是在传递消息时通过「中间件」来回拷贝数据。由此而产生的后果是,系统将在「中间件」堆栈内部,产生多个数据副本,甚至在必要时对数据的有效负载(payload)进行序列化,这将在无形中极大的消耗系统的资源(图 2)。

2:典型IPC中间件解决方案的消息复制 [1]

换句话说,当传输速度达到GB/s级别时,在 「中间件」堆栈中所创建的每个消息副本都会使系统在运行时间(runtime)和延迟(latency)方面付出巨大的代价(图 3)。而 事实上我们本应将宝贵的系统 运行时间用于进行功能计算(上层应用),而不是浪费在“来回移动内存中的字节”上。

图 3:运行时间和延迟随着越来越高的传输速度剧增

3 真正的“零拷贝,共享内存”数据传输

它的工作原理是这样的:

1. 通过iceoryx API,“发布者”将信息直接写入到事先由 「中间件」预订好的内存块(memory chunk)中。

4. 「中间件」iceoryx在“幕后”则对内存块 进行引用计数(reference counting), 当其发现被引用的次数变为零时就会释放内存块(图4)。

图 4:真正的零拷贝通信 [1]

图 5:像货车车厢一样的内存池 [2]

整个过程, “货物”只被装了一次车,直到被“提货”前都再没有离开过车厢

= 数据仅仅只被"写入"了内存一次,但并没有被复制,故而 实现了真正的“零拷贝”!

接下来我们在列举一个例子:如下图6中所示,假设这个时候又有两条新的数据(0xFACE和0xCAFE)被写入,而之前在车厢0xBEEF里面的货物已经被提走(数据已经被读取)。

图 6:共享内存的自动回收 [2]

这个时候,之前提到的引用计数机制(reference counting)就可以派上用场了:当它意识到这个车厢0xBEEF内的货物已经被提空的时候(没有再次发生读取操作),就可以判定这个“车厢”可以被再次回收利用了!(内存块再次被释放,重新回到可以被预订的状态)。

这时,如果我们重新绘制图3,就会得到下面图7这样的一条水平线。

图 7:使用iceoryx实现了恒定时间内几乎无限的数据传输 [2]

它表明:在使用 “零拷贝,共享内存” 的 「中间件」 iceoryx之后,系统的运行时间和延迟已经跟传输的数据量没有关系了。换句话说,系统可以在一定时间内实现几乎无限的数据传输。

4 技术细节

由于在整个数据的传输过程中, 「中间件」iceoryx只是在来回的传递“指针”,因此它在数据传输的过程中实际并不需要实际传输数据。 换句话说,无论数据信息的大小如何,数据在传输过程中所消耗的时间都是恒定的。

除此之外,iceoryx API在支持轮询访问(polling)的同时,也支持 事件驱动回调(event-driven callback)。这个特性使其可以被 广泛适用于大量的不同应用场景,包括实时系统的应用程序。

而共享内存也可以分为具有不同访问权限和可配置内存池的段。

这里我们需要了解使用共享内存的两个限制:

  1. 一个是它只支持固定长度的消息,
  2. 另一个是不能使用virtual members以防止member function被派生类重新定义。

除此之外,被传输的数据消息中不能包含任何指向进程中内部虚拟内存空间的“指针”,此限制也适用于基于堆的数据结构(heap-based data structures)。即使无法满足上述条件,「中间件」iceoryx仍然可以与能够处理消息序列化与反序列化的上层软件进行合作,实现零拷贝的底层传输。

「中间件」iceoryx依赖 可移植操作系统接口(POSIX API)。目前,它支持Linux和QNX作为底层操作系统而运行。由于API间往往存在细微的差异,因此当我们需要将iceoryx移植到另一个基于POSIX的操作系统时,可能需要进行较小的配置改动。

iceoryx通过使用服务发现机制实现了动态调度(dynamic scheduling):它可以在实时状态下建立应用之间的连接,这个特性与基于SOA架构(service-oriented architecture)的adaptive AUTOSAR可谓完美契合。

同样,在大家都关心的功能安全领域,iceoryx的目标是达到ASIL-D安全等级,保证软件运行的确定性则是实现这个目标的钥匙。

为此我们需要遵守以下几点编码准则:

  • 禁止使用堆,只使用静态的内存
  • 只使用部分STL(C++ standard template library)
  • 禁止未定义的行为
  • 禁止使用exception

目前支持 「中间件」iceoryx的平台有:

  • Linux
  • QNX
  • macOS(未完全测试)
  • Windows 10(正在开发阶段)

由于iceoryx是一种与数据无关的基于共享内存的传输机制,因此它仅仅提供了相当底层的API。因此,Pöhnl先生及其研发团队不建议开发者直接使用该API,而是应该将其集成到一个更大的能够提供高级API和工具的框架中去,比如AUTOSAR Adaptive Platform和ROS(Robotic Operating System)

5 使用许可

了这么多和「中间件」iceoryx相关的内容,那么究竟谁最应该熟练掌握iceoryx的开发和应用呢?

答案是:自动驾驶系统开发人员,机器人系统开发人员和独立游戏系统开发者!

首先,iceoryx本身是开源的 [3],并且它使用了非常宽松的Apache-2.0许可证。也就是说,任何个人或者开发团队都可以把iceoryx用于商业用途而不必公开其衍生产品的源代码。

如果你想使你开发的 iceoryx达到较高的安全级别,则需要从博世的子公司ETAS GmbH购买相关的安全手册,其中内容包括符合各安全级别的编译器设置信息和VRTE等配套产品,如ara_on_iceoryx (AUTOSAR API)等等。

当然,如果你的开发团队有足够的实力,也可以尝试自己开发整套API并取得安全级别认证。

小结

着整车的EE架构越来越集中化,域控制器和中央计算平台的装车率越来越高,基于POSIX的操作系统也会在汽车上越来越频繁的出现,各种新的功能也将会以服务或者APP的形式被不断的添加到车载系统上。

如何实现高效的IPC,都是各APP间通信一个绕不过去的坎儿。因此,IPC的效率直接决定了整个系统的实时性能。

同冯诺依曼瓶颈有些相似的是,无论顶层应用算法多么优秀,一个低效 的 「中间件」都会在开发的过程中“演变”为一个巨大的瓶颈,进而会慢慢地拖垮整个系统的运行。

幸运的是,iceoryx的出现则完全解决了这个存在于IPC中的“顽固问题”,它通过“零拷贝,共享内存”的特性,实现了恒定时间内近乎无限的数据传输!

iceoryx的这个特性在实际应用中意义重大!

在大大提高中央域控制器自身实时性能的同时,它也允许整个系统任意增加传感器或者提高传感器的分辨率,而无需承受由于传输数据量的增加带来的系统性能方面的损失,可谓是给自动驾驶技术的发展(至少在数据传输方面)铺平了道路。

因此,我们有理由相信,作为软件架构的核心部件,中间件Iceoryx这根backbone将完全撑的起自动驾驶技术的未来。

注:文中大部分内容源自作者对参考文献的翻译与总结以及与Pöhnl先生及其开发团队核心成员Hoinkis先生的技术讨论。除个别图片来源于互联网,其他所有文中配图的使用均已得到Pöhnl先生的允许。

参考文献

[1] Michael Pöhnl - 博世

https://www.eclipse.org/community/eclipse_newsletter/2019/december/4.php

[2] Simon Hoinkis - 博世

https://fosdem.org/2020/schedule/event/ema_iceoryx/attachments/slides/3723/export/events/attachments/ema_iceoryx/slides/3723/introduction_to_iceoryx_fosdem_2020.pdf

[3] Iceoryx

https://github.com/eclipse/iceoryx

[4] ROS

https://github.com/ros2/rmw_iceoryx

[5] ETAS GmbH

https://www.etas.com/en/products/rta-vrte.php

[6] Eclipse

https://github.com/eclipse-cyclonedds/cyclonedds

[7] Continental

https://github.com/continental/ecal

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「冰羚」— 撑起自动驾驶未来的“中间件” 的相关文章

  • SENT信号介绍

    Vehicle攻城狮 The people who are crazy enough to think they can change the world are the ones who do SENT背景介绍 提到车载总线 xff0c
  • Linux 日志管理

    常用日志文件 系统日志是由一个名为syslog的服务管理的 xff0c 如以下日志文件都是由syslog日志服务驱动的 xff1a var log boot log xff1a 录了系统在引导过程中发生的事件 xff0c 就是Linux系统
  • SPI 通讯协议

    Cuitbasics 汽车ECU设计 2 2 当您将微控制器连接到传感器 xff0c 显示器或其他模块时 xff0c 您是否考虑过这两种设备是如何相互通信的 xff1f 他们到底在说什么 xff1f 事实上电子设备之间的通信就像人类之间的交
  • UART串口通讯

    UART代表通用异步接收器 发送器也称为串口通讯 xff0c 它不像SPI和I2C这样的通信协议 xff0c 而是微控制器中的物理电路或独立的IC UART的主要目的是发送和接收串行数据 xff0c 其最好的优点是它仅使用两条线在设备之间传
  • 一文搞懂AUTOSAR的DEM模块

    Dem全称为Diagnostic Event Manager xff0c 负责故障事件的处理 故障数据的存储和管理 简单说其功能是故障事件确认前的故障debounce xff0c 故障事件确认时的故障数据存储 xff0c 故障发生后的故障老
  • linux父子进程问题——孤儿进程与僵尸进程[总结]

    今天遇到一个linux进程启动时指定Max open files不对的问题 xff0c 导致程序建立socket异常 xff0c 进而导致fullgc问题 xff0c 影响正常服务 所以顺带又温习了下linux下的父子进程的特性 孤儿进程与
  • C++11/14/17一些好用新特性自己整理下

    1 override xff1a 子类继承父类的时候 xff0c 子类虚函数名字写错了或者参数列表不匹配会变成另外一个函数编译器无法判断对错 xff0c 和你写不写virtual也没关系 xff0c 这时候可以在虚函数结尾加上overrid
  • vector中emplace_back方法的用途

    在写代码的过程中 xff0c CLion提醒我把 span style background color ffd900 push back span 方法替换成 span style background color ffd900 empl
  • constexper+const+常量表达式

    常量表达式 xff08 const expression xff09 是指值不会改变并且在编译过程就能得到计算结果的表达式 显然 xff0c 字面值属于常量表达式 xff0c 用常量表达式初始化的 const 对象也是常量表达式 一个对象
  • 这篇 CPU Cache,估计也没人看

    无论你写什么样的代码都会交给 CPU 来执行 xff0c 所以 xff0c 如果你想写出性能比较高的代码 xff0c 这篇文章中提到的技术还是值得认真学习的 另外 xff0c 千万别觉得这些东西没用 xff0c 这些东西非常有用 xff0c
  • 每天一个 Linux 命令

    https blog csdn net k346k346 category 9267835 html uptime 命令 1 命令简介 uptime 用于显示系统总共运行了多长时间和系统的平均负载 无选项 uptime 命令会显示一行信息
  • Docker 安装Jenkins并配置Maven

    系统环境 系统版本 xff1a Centos7 9 docker安装参考此链接 xff1a https blog csdn net clover661 article details 122226083 下载docker时候如果报错参考 x
  • 一文详解自动驾驶的运行设计域(ODD)| 自动驾驶系列

    一文详解自动驾驶的运行设计域 xff08 ODD xff09 n 自动驾驶系列 2021年4月30日 xff0c SAE发布了第四版J3016 驾驶自动化分级 xff0c 这是即2014年1月16日 2016年9月30日 2018年6月15
  • QNX BSP分析

    QNX相关历史文章 xff1a QNX简介QNX Neutrino微内核QNX IPC机制QNX进程管理器QNX资源管理器QNX字符I OQNX之编写资源管理器 xff08 一 xff09 QNX之编写资源管理器 xff08 二 xff09
  • SOA面向服务的分布式架构详解

    导语 xff1a SOA作为一种面向服务的架构 xff0c 是一种软件架构设计的模型和方法论 从业务角度来看 xff0c 一切以最大化 服务 的价值为 出发点 xff0c SOA利用企业现有的各种软件体系 xff0c 重新整合并构建起一套新
  • 自动驾驶软件架构之:中间件与SOA(一)

    本文是将中间件作为一个专题 xff0c 专门展开进行详细的分析和讨论 中间件相关技术在计算机分布式系统中发展了很多年 xff0c 尤其在互联网服务 大型商业系统中得到广泛使用 随着智能网联汽车的发展 xff0c 现代汽车也逐步增加了以太网支
  • 嵌入式系统BSP基础知识

    嵌入式系统BSP基础知识 板级支持包 BSP 是定义如何支持特定硬件设备 设备组或硬件平台的信息集合 BSP 包括有关设备上存在的硬件功能的信息和内核配置信息以及所需的任何其他硬件驱动程序 除了用于基本和可选平台功能的通用 Linux 软件
  • constexpr

    constexpr 标志返回值或者其他表达式是常量 xff0c 在编译时就会被计算出来 这个关键字常被用来 C 43 43 const 和 constexpr 的区别 xff1f 知乎 include lt iostream gt usin
  • inline namespace

    include lt iostream gt using namespace std namespace ALL namespace V2014 void fun int num cout lt lt 34 int 34 lt lt 34

随机推荐

  • 进程与线程

    对于操作系统来说 xff0c 一个任务就是一个进程 xff08 Process xff09 xff0c 比如打开一个浏览器就是启动一个浏览器进程 xff0c 打开一个记事本就启动了一个记事本进程 xff0c 打开两个记事本就启动了两个记事本
  • 详解SOME/IP协议文档

    以下内容来源于AutoSar官网的AUTOSAR PRS SOMEIPProtocol文档 详解SOME IP协议文档 2 知乎 以下内容来源于AutoSar官网的AUTOSAR PRS SOMEIPProtocol文档 SOME IP P
  • AP AUTOSAR——Update and Configuration Management UCM

    15 Update and Configuration Management 15 1 What is Update and Configuration Management 更新和配置管理是Adaptive Platform Servic
  • 基于Docker安装Jenkins并实现CI/CD实战部署

    本实践介绍了利用Jenkins和docker技术 xff0c 如何实现CI CD的各环节的步骤 xff0c 包括环境准备 xff0c 代码提交 xff0c 编译程序 xff0c 构建镜像 xff0c 部署一套完整的安装部署流程 工具介绍 x
  • 左值引用与右值引用

    include lt iostream gt using namespace std void change int amp rnum 引用就是变量名的别名 rnum 61 111 c 43 43 中能用引用的地方 xff0c 就不要使用指
  • C++ 11的移动语义

    目录 可拷贝和可移动的概念 移动构造函数和移动赋值函数 小结移动构造和移动赋值std move 使用 std move 实现一个高效的 swap 函数Move and swap 技巧参考 可拷贝和可移动的概念 在面向对象中 xff0c 有的
  • UDS-统一诊断服务

    什么是诊断服务 xff1f 在还没有诊断服务的时候 xff0c 如果车辆故障 xff0c 需要有经验的师傅长时间的摸排查找 xff0c 费时费力 而车辆的ECU节点有了诊断模块后 xff0c 就具有了诊断功能 xff0c 这样车辆如果有了故
  • AP AUTOSAR——Network Management

    16 Network Management 16 1 What is Network Management 网络管理是Adaptive Platform Services中的一个功能集群 作为AP AUTOSAR平台的服务 xff0c 网络
  • AP AUTOSAR——Security Management

    11 Security Management 11 1 What is Security Management 安全管理是自适应平台体系结构中的一个功能集群 作为一个功能集群 xff0c 安全管理由多个模块组成 xff0c 这些模块向在Ad
  • 如何制作S32V234的Linux5.x版本BSP

    脚本是编译S32v Linux5 x版本bsp文件的流程 官方也有这个指导说明文档 xff0c 主要是第2 3章内容 xff0c 可以参考着执行 1 下面描述的所有步骤都已在Ubuntu 20 04LTS上 xff08 本机或通过虚拟机 x
  • C++经典面试题100例及答案

    1 面向对象的程序设计思想是什么 答 xff1a 把数据结构和对数据结构进行操作的方法封装形成一个个的对象 2 什么是类 答 xff1a 把一些具有共性的对象归类后形成一个集合 xff0c 也就是所谓的类 3 对象都具有的两方面特征是什么
  • C++面试100题,1——40

    C与c 43 43 有什么不同 xff1f 在c 43 43 中能使用引用就不要使用指针 xff0c 要改变一个一级指针就要用一个二级指针 要改变一个二级指针就要用一个三级指针 xff0c 会变得越来越复杂 A类中的func1是虚函数 xf
  • (TDA4 BSP )Texas Instruments Jacinto 7 J721E (DRA829/TDA4xM) BSP 如何制作?

    1 1 1 Download and Install the SDK Processor SDK Linux for J721e Documentation https software dl ti com jacinto7 esd pro
  • 解决Linux 环境 GLIBCXX_3.4.15‘ not found问题

    升级Centos系统之后 xff0c 运行filezilla时 xff0c 出现如下错误的提示信息 xff1a filezilla usr lib libstdc 43 43 so 6 version 96 GLIBCXX 3 4 15 3
  • 两台Linux服务器之间传输文件的四种方法(转载)

    在日常服务器租用中 xff0c 有时需要将文件从一台服务器传到另一台服务器 xff0c 下面给大家介绍四种linux服务器之间传输文件方式 scp 优点 简单方便 xff0c 安全可靠 xff1b 支持限速参数 缺点 不支持排除目录 用法
  • 任务间通信 | 邮箱、消息队列

    本文分享自中移OneOS公众号 任务间通信 上篇讲解了任务间同步 xff0c 在本篇中主要讲解任务间通信机制 xff0c 并对邮箱及消息队列进行详细介绍 通过对其概念 详细设计 接口设计等的讲解帮助开发者更好的理解其在操作系统中的应用 任务
  • c++ 条件变量的使用,实战

    include lt iostream gt include lt thread gt include lt mutex gt include lt condition variable gt using namespace std 线程通
  • SOA架构和微服务架构的区别

    1 SOA架构和微服务架构的区别 首先SOA和微服务架构一个层面的东西 xff0c 而对于ESB和微服务网关是一个层面的东西 xff0c 一个谈到是架构风格和方法 xff0c 一个谈的是实现工具或组件 1 SOA xff08 Service
  • 浅谈AP autosar 之 runtime 基础

    AP Autosar Architecture overview AP autosar在SOC 中的位置 xff0c 起到的作用 下面图可以看出 xff0c AP autosar封装了操作系统的接口 xff0c 封装了功能安全 xff0c
  • 「冰羚」— 撑起自动驾驶未来的“中间件”

    每当谈到自动驾驶的软件开发 xff0c 人们首先想到的 xff0c 是深不可测的人工智能算法 xff0c 是各种感知融合 xff0c 是各类路径规划 但是 xff0c 就算是再智能再高深的算法 xff0c 如果没有底层操作系统的支持 xff