[翻译] 定制和配置Iceoryx平台

定制Iceoryx平台

本节翻译自 advanced/custom-iceoryx-platform.md
iceoryx_platform代表了Iceoryx中最低的层次。其任务是在所有支持的平台上建立低级系统调用的统一行为。如果需要为另一个平台添加支持,可以使用CMake参数-DIOX_PLATFORM_PATH来提供自定义平台实现的路径。
这可能是为了支持特定平台的未支持编译器、调整系统调用以符合POSIX标准或添加新的操作系统。

使用自定义Iceoryx平台构建

假设您的平台存储在绝对路径/home/user/newIceoryxPlatform中,可以使用以下命令配置CMake:

cd iceoryx
cmake -Bbuild -Hiceoryx_meta -DIOX_PLATFORM_PATH=/home/user/newIceoryxPlatform

然后像往常一样构建Iceoryx。

自定义Iceoryx平台的结构

  • newIceoryxPlatform - 根文件夹
    • include/iceoryx_platform/ - 必须存储所有头文件的目录
      • 必须包含在iceoryx_platform/linux/include/iceoryx_platform中找到的所有头文件
      • 头文件必须声明相同的函数
      • 每个头文件必须提供一个 - 不一定有效 - 的所有声明函数的实现。如果某些功能未实现,可以通过执行hoofs和posh模块及集成测试来识别损坏的功能
    • source/ - 必须存储实现的目录
    • cmake/IceoryxPlatformDeployment.cmake - 包含平台编译时选项的文件
      • IOX_PLATFORM_TEMP_DIR - 临时目录的路径
      • IOX_PLATFORM_LOCK_FILE_PATH_PREFIX - 将填充锁文件的目录路径
      • IOX_PLATFORM_UDS_SOCKET_PATH_PREFIX - 将填充UDS套接字文件的目录路径
    • cmake/platform_settings.hpp.in - 用作生成platform_settings.hpp模板的文件
      • 包含在cmake/IceoryxPlatformDeployment.cmake中定义的值
      • 包含未公开为编译时选项的附加常量
    • cmake/IceoryxPlatformSettings.cmake - 包含平台编译配置的文件
      • ICEORYX_CXX_STANDARD - 必须至少为17
      • ICEORYX_PLATFORM_STRING - 平台的名称
      • ICEORYX_C_WARNINGS - [可选] 启用C编译器警告的标志列表
      • ICEORYX_CXX_WARNINGS - [可选] 启用C++编译器警告的标志列表
      • 该文件还可以包含平台限制,例如在选择平台不支持的编译器时失败

配置指南

本节翻译自 advanced/configuration-guide.md

配置iceoryx_hoofs和iceoryx_posh构建的CMake开关

当构建iceoryx_hoofs和iceoryx_posh时,默认设置了几个配置选项。这些选项调整编译到二进制文件中的最小日志级别和资源(如Publisher和Subscriber端口)的全局最大数量,这些选项会对Iceoryx的内存占用产生重大影响,因为它们定义了RouDi启动时共享内存段iceoryx_mgmt中管理结构的大小。

开关描述
IOX_MIN_LOG_LEVEL编译到二进制文件中的最小日志级别。较低的日志级别将在编译过程中被优化掉
IOX_MAX_PUBLISHERS一个iceoryx系统中的最大发布者数量
IOX_MAX_SUBSCRIBERS_PER_PUBLISHER一个发布者端口可以处理的最大连接数
IOX_MAX_PUBLISHER_HISTORY发布者历史记录的最大大小
IOX_MAX_CHUNKS_ALLOCATED_PER_PUBLISHER_SIMULTANEOUSLY一个发布者可以并行分配的最大块数
IOX_MAX_SUBSCRIBERS一个iceoryx系统中的最大订阅者数量
IOX_MAX_CHUNKS_HELD_PER_SUBSCRIBER_SIMULTANEOUSLY一个订阅者可以并行持有的最大块数
IOX_MAX_INTERFACE_NUMBER网关使用的最大接口端口数
IOX_MAX_REQUESTS_PROCESSED_SIMULTANEOUSLY服务器可以并行处理的最大请求数

请参阅IceoryxHoofsDeployment.cmakeIceoryxPoshDeployment.cmake以获取常量的默认值。

!!! 提示
设置默认值时,iceoryx_mgmt的大小约为64.5 MB。您可以通过CMake选项减小表中的值来减少大小。当前值在构建Iceoryx时的CMake阶段打印出来。

示例:

cmake -Bbuild -Hiceoryx_meta -DIOX_MAX_CHUNKS_HELD_PER_SUBSCRIBER_SIMULTANEOUSLY=64

通过此更改,管理段的占用减少到约52.7 MB。对于较大的用例,您可以增加该值,以避免在订阅者端丢失样本(另见#615)。

配置RouDi的内存池

RouDi支持多个具有不同访问权限的共享内存段,以限制不同应用程序之间的读写访问。内存池管理这些段,并组织用于通信的用户负载数据。

!!! 注意
实际上只配置块负载大小,ChunkHeader的大小将添加到配置的大小中。如果使用了大于8的用户头或用户负载对齐,则用户负载的可用大小将小于配置的块负载大小,因为其他功能需要一些空间。请参阅chunk_header.md设计文档,以了解如何使用用户头和扩展用户负载对齐来确定所需的块负载大小的公式。

为了构建RouDi,Iceoryx提供了一个名为iceoryx_posh_roudi的库。此库为您提供了编译自己的RouDi应用程序的API,并且是iceoryx_posh的一部分。

!!! 注意
内存池的块大小必须符合以下限制:

1. 块大小需要大于对齐
2. 块大小需要是对齐的倍数

对齐的值设置为8。

动态配置

一种方法是在RouDi启动期间动态读取配置。使用TOML配置在RouDi中配置段和内存池不是强制性的,但是一种方便的替代方案。

CMake选项-DTOML_CONFIG默认启用TOML配置。Iceoryx提供的iox-roudi应用程序是编译了TOML支持的,可以开箱即用。

如果您创建自己的RouDi应用程序,您需要链接到iceoryx_posh_config

target_link_libraries(custom-roudi
    PRIVATE
    iceoryx_posh::iceoryx_posh_roudi
    iceoryx_posh::iceoryx_posh_config
)

可以使用-c命令行选项将TOML配置文件传递给RouDi。

./iox-roudi -c /absolute/path/to/config/file.toml

以下是一个格式版本为1的示例配置文件:

[general]
version = 1

[[segment]]

[[segment.mempool]]
size = 32
count = 10000

[[segment.mempool]]
size = 128
count = 10000

[[segment.mempool]]
size = 1024
count = 1000

通过此配置,将创建一个负载段。默认情况下,访问权限设置为RouDi组ID。在此段内有三个内存池:一个包含10000个32字节负载大小的块,一个包含10000个128字节的块,一个包含1000个1024字节的块。

要限制访问,可以设置读写组:

[general]
version = 1

[[segment]]
reader = "foo"
writer = "bar"

[[segment.mempool]]
size = 32
count = 10000

[[segment.mempool]]
size = 128
count = 10000

[[segment.mempool]]
size = 1024
count = 1000

通过此配置,只有bar组的应用程序具有写访问权限,可以分配块。foo组的应用程序只有读访问权限。

这是一个具有多个段的示例:

[general]
version = 1

[[segment]]
reader = "foo"
writer = "bar"

[[segment.mempool]]
size = 32
count = 10000

[[segment]]
reader = "alice"
writer = "eve"

[[segment.mempool]]
size = 1024
count = 100

如果未指定配置文件,将使用类似于默认配置的硬编码版本。

静态配置

另一种方法是将静态配置编译到RouDi应用程序中。因此,如果要更改配置,则必须重新编译RouDi应用程序(而不是iceoryx_posh_roudi库)。您可以在main()函数中创建自定义配置,然后将其作为构造函数参数传递给RouDi实例。在自定义RouDi可执行文件的CMake文件条目中,您需要确保它链接到iceoryx_posh_config,以确保使用静态配置。

int main(int argc, char* argv[])
{
    iox::IceoryxConfig config;

    // 创建内存池
    iox::mepoo::MePooConfig mepooConfig;
    mepooConfig.addMemPool({128, 10000}); // 负载大小(字节),块数
    mepooConfig.addMemPool({265, 10000});

    auto currentGroup = iox::PosixGroup::getGroupOfCurrentProcess();
    config.m_sharedMemorySegments.push_back({currentGroup.getName(), currentGroup.getName(), mepooConfig});

    // 配置内省的块数;每个内省主题获取这个块数
    config.introspectionChunkCount = 10;

    // 配置服务发现的块数
    config.discoveryChunkCount = 10;

    // 创建一个RouDi实例
    iox::config::CmdLineParserConfigFileOption cmdLineParser;
    IceOryxRouDiApp roudi(cmdLineParser.parse(argc, argv).expect("Valid CLI parameter"), config);

    // 运行RouDi
    return roudi.run();
}

可以在这里找到静态配置的工作示例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个iceoryx发布订阅的C代码示例,其中一个发布者发布一个消息,而两个订阅者订阅这个消息: ```c #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include "iceoryx_posh/popo/subscriber.hpp" #include "iceoryx_posh/popo/publisher.hpp" #include "iceoryx_posh/runtime/posh_runtime.hpp" #include "iceoryx_posh/roudi/introspection_types.hpp" int main() { // 初始化iceoryx runtime iox::runtime::PoshRuntime::initRuntime("publisher"); // 创建发布者和订阅者 iox::popo::Publisher publisher({"Radar", "FrontLeft", "Object"}); iox::popo::Subscriber subscriber1({"Radar", "FrontLeft", "Object"}); iox::popo::Subscriber subscriber2({"Radar", "FrontLeft", "Object"}); // 订阅者1等待消息 subscriber1.subscribe(); printf("Subscriber 1 waiting for messages...\n"); // 订阅者2等待消息 subscriber2.subscribe(); printf("Subscriber 2 waiting for messages...\n"); // 发布者发布消息 printf("Publisher publishing message...\n"); publisher.publish("Hello, world!"); // 等待订阅者接收消息 while (true) { if (subscriber1.hasData()) { printf("Subscriber 1 received message: %s\n", subscriber1.getChunk()->userPayload()); break; } if (subscriber2.hasData()) { printf("Subscriber 2 received message: %s\n", subscriber2.getChunk()->userPayload()); break; } } // 清理资源并退出 iox::runtime::PoshRuntime::shutdownRuntime(); return 0; } ``` 需要注意的是,这个示例代码需要使用iceoryx库,需要将iceoryx库链接到您的项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值