文章目录
定制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.cmake和IceoryxPoshDeployment.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();
}
可以在这里找到静态配置的工作示例。