Chapter 7 QNX Platforms
7.1 Summary of QNX Platforms and Supported Features
The following table shows the supported products/features for each architecture. A ● means supported in this release, an empty cell means unsupported in this release.
Table 7.1 QNX Systems - Supported Features
|
RTI Architecture [1] |
Supported Features |
||||||
|---|---|---|---|---|---|---|---|
|
Languages |
|||||||
|
|
Java [2] |
Python [3] |
.NET (C#) [4] |
C/C++ [5] |
Modern C++ [6], [7] |
Protocol Buffers Extension [8] |
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 [15] x64QNX8.0qcc_cxx12.2.0 [16] |
|
|
|
● |
● |
● |
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 [15] armv8QNX8.0qcc_cxx12.2.0 [16] |
|
|
|
● |
● |
● |
|
|
Transports |
|||||||
|
|
UDP/IPv4 |
UDP/IPv6 |
Multicast |
TCP/IPv4 |
Shared Memory (w/ zero copy) [9] |
|
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
● |
● [10] |
● |
● |
● |
|
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
● |
● [10] |
● |
● |
● |
|
|
|
Infrastructure Services |
|||||||
|
|
Persistence Service |
Routing Service |
Recording and Replay Services |
Web Integration Service |
|
|
|
|
QNX Neutrino 8.0, 8.0.2 , 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
|
● |
|
|
|
|
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
|
● |
|
|
|
|
|
|
Connext Professional Libraries |
|||||||
|
|
Request/Reply |
Monitoring Library |
Distributed Logger |
LBED [11] |
Monitoring Library 2.0 |
|
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
● |
● |
● |
● |
See "Observability Framework" rows below |
|
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
● |
● |
● |
● |
|
||
|
Core Library Features |
|||||||
|
|
Monotonic Clock |
CPU Core Affinity |
Durable writer history & reader state |
RTI DDS thread name |
Backtrace |
Cmake Find Package |
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
● |
● |
|
● |
|
● |
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
● |
● |
|
● |
|
● |
|
|
Tools |
|||||||
|
|
Shapes Demo |
Launcher |
Monitor |
Admin Console |
System Designer |
rtiddsgen server |
Utilities (rtiddsping, rtiddsspy) |
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
|
|
|
|
|
|
● |
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
|
|
|
|
|
|
● |
|
Observability Framework |
|||||||
|
Observability Collector Service |
Monitoring Library 2.0 |
||||||
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
|
● |
|||||
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
|
● |
|||||
|
Security Extensions |
|||||||
|
|
Security Plugins (for OpenSSL) [12] |
Security Plugins (for wolfSSL) [13] |
TLS Support [12] |
Security Plugins SDK [14] |
|
||
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
● |
|
● |
|
|
||
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
● |
● |
● |
● |
|
||
|
Add-ons |
|||||||
|
|
Cloud Discovery Service |
Real-Time WAN Transport |
Ada Language Support |
Limited Bandwidth Plugins |
Queuing Service (Experimental) |
|
|
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 x64QNX8.0qcc_cxx12.2.0 |
|
● |
|
||||
|
QNX Neutrino 8.0, 8.0.2, 8.0.3 armv8QNX8.0qcc_cxx12.2.0 |
|
● |
|
||||
Footnotes for the above table:
|
1 |
Supports DDS 1.4, RTPS 2.5, and DDS X-Types 1.4. |
|
2 |
Built with Eclipse Temurin OpenJDK 21.0.7, compatible with Java 8 and above. Also tested with AdoptOpenJDK 17.0.6 and 25.0.1. |
|
3 |
Supported on Python 3.10-3.14. Free-threaded (no-GIL) builds of CPython 3.13+ are not currently supported. |
|
4 |
The C# API is provided as multi-targeted .NET Standard 2.0 and 2.1 libraries, built using the .NET 10 SDK. This allows consumption from the following runtimes, per Microsoft compatibility guidance: .NET 5 and newer, .NET Core 2.1 and newer, and .NET Framework 4.8.1 and newer. Unity projects can consume the libraries on either .NET Standard 2.0 or 2.1 profiles depending on the Unity version and API Compatibility Level settings. Unity versions 2021.2 and later include support for .NET Standard 2.1, while earlier versions target .NET Standard 2.0. |
|
5 |
Supports C++98 compilers or newer. |
|
6 |
Tested with C++11 unless stated otherwise. |
|
7 |
Supporting Modern C++ means supporting the RPC feature unless otherwise stated. |
|
8 |
Only provides mapping for Modern C++. The IDL converted from a .proto file can be used with the standard mapping in the rest of the languages. |
|
9 |
Zero-copy transfer over shared memory is NOT supported for Java, Ada, .NET and Python programming languages. It is only supported for C, Traditional C++, and Modern C++ programming languages. |
|
10 |
No Traffic Class support. |
|
11 |
Supports dynamic linking only. |
|
12 |
Tested with OpenSSL 3.5.5 unless stated otherwise. |
|
13 |
Tested with WolfSSL 5.8.2. |
|
14 |
Tested with both OpenSSL 3.5.5 and WolfSSL 5.8.2. |
|
15 |
The earliest versions of the com.qnx.qnx800.target.microkernel.core (“QNX® SDP 8.0 Kernel and libc”) component are not supported. Please update this component in your QNX 8.0 SDP installation to version 2.0.2.00388T202406131303L or higher (“Stable (GA8.0.1) July 09, 2024”) before generating the QNX system image. |
|
16 |
LLVM C++ library |
7.1.1 Monotonic Clock Support
See Configuring the Clock per DomainParticipant, in the RTI Connext Core Libraries User's Manual for information on the monotonic clock.
7.1.2 Support for 'Find Package' CMake Script
For information on using the 'Find Package' CMake script, see 2.5 Building with CMake.
7.1.3 Notes about Transports
- Shared Memory
The following expression can detect the two different kinds of SHMEM mutexes that RTI supports on QNX systems: posix semaphores for older QNX versions, and shared pthread mutexes for newer QNX versions, as well other shared memory resources used by Connext such as plain shared memory segments:
ls /dev/shmem/RTIOsapiSharedMemory*
To clean up the shared memory resources (both segments and mutexes), remove the relevant files listed in /dev/shmem/ and /dev/sem/. The shared resource names used by Connext begin with 'RTIOsapiSharedMemory'.
The permissions for the semaphores created by Connext are modified by the process' umask value. If you want to have shared memory support between different users, run the command "umask 000" to change the default umask value to 0 before running your Connext application.
- UDPv6: Supported. The transport is not enabled by default; the peers list must be modified to support IPv6. No Traffic Class support.
To use the UDPv6 transport, the network stack must provide IPv6 capability. Enabling UDPv6 may involve switching the network stack server and setting up IPv6 route entries.
7.2 Building Applications for QNX Platforms
The libraries on Arm v7 CPUs require a hardware FPU in the processor and are compatible with systems that have hard-float libc. See Table 7.10 Library-Creation Details for QNX Architectures for compiler flag details.
Table 7.2 Building Instructions for QNX Architectures lists the libraries you will need to link into your application.
Depending on which Connext features you want to use, you may need additional libraries; see 7.2.2 Additional Libraries for Other Features.
Make sure you are consistent in your use of static, dynamic, debug and release versions of the libraries. Do not link both static and dynamic libraries. Similarly, do not mix release and debug libraries.
Release and Debug Terminology:
Both release and debug versions of the libraries are provided. For Connext, debug libraries are created with debug symbols to facilitate debugging with gdb, for example. Release libraries do not contain debug information.
The Connext debug libraries are intended solely for development and debugging purposes. These libraries are not optimized for performance or resource consumption and may include additional diagnostic information that can affect runtime behavior. They are not intended for use in production environments. Please ensure that only the release libraries are used in production deployments. Debug libraries can be identified by the suffix "d" in their names.
Additional Documentation:
You should also review the QNX chapter of the RTI Connext Core Libraries Getting Started Guide Addendum for Embedded Systems.
Verified Compiler Flags:
Compiler flags outside those documented in Table 7.2 Building Instructions for QNX Architectures have not been verified by RTI and can cause undefined behavior.
|
API |
Library Format |
Required |
Required |
|
|
C++ (Traditional and Modern APIs) |
Static Release |
libnddscorez.a libnddscz.a libnddscppz.a (or libnddscpp2z.a) librticonnextmsgcppz.a (or librticonnextmsgcpp2z.a) |
-lm -lsocket |
-DRTI_QNX |
|
Static Debug |
libnddscorezd.a libnddsczd.a libnddscppzd.a (or libnddscpp2zd.a) librticonnextmsgcppzd.a (or librticonnextmsgcpp2zd.a) |
|||
|
Dynamic Release |
libnddscore.so libnddsc.so libnddscpp.so (or libnddscpp2.so) librticonnextmsgcpp.so (or librticonnextmsgcpp2.so) |
|||
|
Dynamic Debug |
libnddscored.so libnddscd.so libnddscppd.so (or libnddscpp2d.so) librticonnextmsgcppd.so (or librticonnextmsgcpp2d.so) |
|||
|
C |
Static Release |
libnddscorez.a |
-lm -lsocket |
For 64-bit architectures: -DRTI_64BIT For all architectures: -DRTI_QNX |
|
Static Debug |
libnddscorezd.a |
|||
|
Dynamic Release |
libnddscore.so |
|||
|
Dynamic Debug |
libnddscored.so |
7.2.1 Required Change for Building with C++ Libraries
The C++ libraries for QNX platforms are built without the -frtti flag and with the -fexceptions flag. You must build your C++ applications without -fno-exceptions in order to link with the RTI libraries. In summary:
- Do not use -fno-exceptions when building a C++ application or the build will fail.
- It is not necessary to use -fexceptions, but doing so will not cause a problem.
- It is not necessary to use -frtti, but doing so will not cause a problem.
7.2.2 Additional Libraries for Other Features
This section discusses libraries for features that are not supported for every platform. Refer to Table 7.1 QNX Systems - Supported Features to see if these libraries are supported on your platform.
If you plan to use the additional RTI libraries described in this section, they must be linked before the required RTI libraries (see Table 7.2 Building Instructions for QNX Architectures) in your included libraries for linking.
Make sure you are consistent in your use of static, dynamic, debug and release versions of the libraries. For example, if your Connext application is linked with the static release version of the Connext libraries, you will need to also use the static release version of the library. Do not link both static and dynamic libraries. Similarly, do not mix release and debug libraries.
7.2.2.1 Libraries Required for Distributed Logger
Table 7.3 Additional Libraries for using RTI Distributed Logger lists the additional libraries you will need in order to use Distributed Logger.
7.2.2.2 Libraries Required for Monitoring
If you are statically linking your application with DDS libraries and you want to add monitoring to your application, you will also need to statically link the monitoring library. The library cannot be loaded dynamically strictly through the QoS profile because it also depends on DDS to publish its data. Therefore, it depends on DDS; the DDS functionality would cause duplicate symbols to be found, resulting in the termination of the process.
To use dynamic libraries: make sure the permissions on the .so library files are readable by everyone.
|
Library Format |
Monitoring Libraries3 |
|
Dynamic Release |
librtimonitoring.so |
|
Dynamic Debug |
librtimonitoringd.so |
|
Static Release |
librtimonitoringz.a |
|
Static Debug |
librtimonitoringzd.a |
|
Library Format |
Monitoring Libraries 2.0 4 |
|
Dynamic Release |
librtimonitoring2.so |
|
Dynamic Debug |
librtimonitoringd2.so |
|
Static Release |
librtimonitoringz2.a |
|
Static Debug |
librtimonitoringzd2.a |
7.2.2.3 Libraries Required for Real-Time WAN Transport
If you choose to use RTI Real-Time WAN Transport, you must download and install a separate package that contains the transport libraries.
Using Real-Time WAN Transport requires one of the libraries in Table 7.6 Additional Libraries for Using RTI Real-Time WAN Transport APIs. Select the file appropriate for your chosen library format.
|
Library Format |
Real-Time WAN Transport Libraries5 |
|
Dynamic Release |
libnddsrwt.so |
|
Dynamic Debug |
libnddsrwtd.so |
|
Static Release |
libnddsrwtz.a |
|
Static Debug |
libnddsrwtzd.a |
7.2.2.4 Libraries Required for TCP Transport APIs and TLS Support
To use the TCP Transport APIs, link against the additional libraries in Table 7.7 Additional Libraries for using RTI TCP Transport APIs .
Note: Not all platforms support the TCP Transport - see Chapter 7 QNX Platforms.
|
Library Format |
RTI TCP Transport Libraries6 |
|
Dynamic Release |
libnddstransporttcp.so |
|
Dynamic Debug |
libnddstransporttcpd.so |
|
Static Release |
libnddstransporttcpz.a |
|
Static Debug |
libnddstransporttcpzd.a |
If you are using RTI TLS Support, also see Table 7.8 Additional Libraries for using RTI TCP Transport APIs with TLS Enabled. (Select the files appropriate for your chosen library format.) See the RTI TLS Support Release Notes for a list of supported platforms.
|
Library Format |
RTI TLS Libraries7 |
OpenSSL Libraries8 |
|---|---|---|
|
Dynamic Release |
libnddstls.so |
libssl.so libcrypto.so |
|
Dynamic Debug |
libnddstlsd.so |
|
|
Static Release |
libnddstlsz.a |
|
|
Static Debug |
libnddstlszd.a |
7.2.2.5 Libraries Required for Zero Copy Transfer Over Shared Memory
To use the Zero Copy Transfer Over Shared Memory feature, link against the additional library in Table 7.9 Additional Libraries for Zero Copy Transfer Over Shared Memory.
|
Library Format |
Zero Copy Transfer Over Shared Memory Libraries9 |
|
Dynamic Release |
libnddsmetp.so |
|
Dynamic Debug |
libnddsmetpd.so |
|
Static Release |
libnddsmetpz.a |
|
Static Debug |
libnddsmetpzd.a |
7.2.3 How the Connext Libraries were Built
Table 7.10 Library-Creation Details for QNX Architectures shows the compiler flags that RTI used to build the Connext libraries. This is provided strictly for informational purposes; you do not need to use these parameters to compile your application. You may find this information useful if you are involved in any in-depth debugging.
The details for building user applications are in Chapter 2 Building Applications—Notes for All Platforms.
|
RTI Architecture |
Library Format |
Compiler Flags Used by RTI |
|
x64QNX8.0qcc_cxx12.2.0 |
Static Release |
-Vgcc/12.2.0,gcc_ntox86_64 -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIC -fvisibility=hidden |
|
Static Debug |
-Vgcc/12.2.0,gcc_ntox86_64 -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O0 -g -fPIC |
|
|
Dynamic Release |
-Vgcc/12.2.0,gcc_ntox86_64 -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -flto=auto -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIE -fvisibility=hidden |
|
|
Dynamic Debug |
-Vgcc/12.2.0,gcc_ntox86_64 -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -g -fPIC |
|
|
armv8QNX8.0qcc_cxx12.2.0 |
Static Release |
-Vgcc/12.2.0,gcc_ntoaarch64le -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIC -fvisibility=hidden |
|
Static Debug |
-Vgcc/12.2.0,gcc_ntoaarch64le -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-strict-aliasing -fno-semantic-interposition -g -fPIC |
|
|
Dynamic Release |
-Vgcc/12.2.0,gcc_ntoaarch64le -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -flto=auto -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIC -fvisibility=hidden |
|
|
Dynamic Debug |
-Vgcc/12.2.0,gcc_ntoaarch64le -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O0 -g -fPIC |
7.3 Running Your Application
Table 7.11 Running Instructions for QNX Architectures provides details on the environment variables that must be set at run time for a QNX architecture.
Starting with Connext 6.0.1, you need the dirname tool to run the scripts in the bin directory.
|
RTI Architecture |
Library Format |
Environment Variables |
|
All supported QNX architectures |
Static |
None required |
|
Dynamic |
LD_LIBRARY_PATH= ${NDDSHOME}/lib/<architecture>: ${LD_LIBRARY_PATH}10 |
7.4 Thread Configuration
7.4.1 Thread Settings and Thread-Priority Definitions
See Table 7.12 Thread Settings for QNX Platforms and Table 7.13 Thread-Priority Definitions for QNX Platforms.
|
Applicable Thread |
DDS_ThreadSettings_t |
Platform-Specific Setting |
|
Asynchronous Publisher, |
mask |
OS default thread type |
|
priority |
10 |
|
|
stack_size |
64 * 1024 |
|
|
cpu_list |
Empty CPU list (Supported on QNX platforms) |
|
|
cpu_rotation |
DDS_THREAD_SETTINGS_CPU_NO_ROTATION |
|
|
Database thread |
mask |
DDS_THREAD_SETTINGS_STDIO |
|
priority |
8 |
|
|
stack_size |
64 * 1024 |
|
|
cpu_list |
Empty CPU list (Supported on QNX platforms) |
|
|
cpu_rotation |
DDS_THREAD_SETTINGS_CPU_NO_ROTATION |
|
|
Event thread |
mask |
DDS_THREAD_SETTINGS_STDIO | DDS_THREAD_SETTINGS_FLOATING_POINT |
|
priority |
8 |
|
|
stack_size |
4 * 64 * 1024 |
|
|
cpu_list |
Empty CPU list (Supported on QNX platforms) |
|
|
cpu_rotation |
DDS_THREAD_SETTINGS_CPU_NO_ROTATION |
|
|
ReceiverPool threads |
mask |
DDS_THREAD_SETTINGS_STDIO | DDS_THREAD_SETTINGS_FLOATING_POINT |
|
priority |
12 |
|
|
stack_size |
4 * 64 * 1024 |
|
|
cpu_list |
Empty CPU list (Supported on QNX platforms) |
|
|
cpu_rotation |
DDS_THREAD_SETTINGS_CPU_NO_ROTATION |
|
Thread-Priority Definition |
Operating-System Priority |
|
THREAD_PRIORITY_DEFAULT |
10 |
|
THREAD_PRIORITY_HIGH |
14 |
|
THREAD_PRIORITY_ABOVE_NORMAL |
12 |
|
THREAD_PRIORITY_NORMAL |
10 |
|
THREAD_PRIORITY_BELOW_NORMAL |
8 |
|
THREAD_PRIORITY_LOW |
6 |
7.4.2 Support for Controlling CPU Core Affinity for RTI Threads
Support for controlling CPU core affinity (described in "Controlling CPU Core Affinity" in the RTI Connext Core Libraries User's Manual) is available on all supported QNX platforms.
7.4.3 Automatic Thread-Specific Storage Cleanup
QNX systems support automatic thread-specific storage cleanup. Use of the DomainParticipantFactory::unregister_thread API is therefore not required to clean up thread-specific storage in user threads (although it is safe to do so).
7.5 Socket Buffer Size Configuration
See Table 7.14 UDP send_socket_buffer_size and Table 7.15 UDP receive_socket_buffer_size. For more information on the send_socket_buffer_size and receive_socket_buffer_size properties, see Setting Builtin Transport Properties with the PropertyQosPolicy, in the RTI Connext Core Libraries User's Manual.
|
Property |
Behavior |
|---|---|
|
NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_DEFAULT |
Uses default send socket buffer size net.inet.udp.sendspace |
|
NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_MAX |
Uses maximum send socket buffer size kern.ipc.maxsockbuf |
|
NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_DEFAULT |
Uses default send socket buffer size net.inet.udp.sendspace |
|
NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_MAX |
Uses maximum send socket buffer size kern.ipc.maxsockbuf |
|
Property |
Behavior |
|---|---|
|
NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_DEFAULT |
Uses default receive socket buffer size net.inet.udp.recvspace |
|
NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_MAX |
Uses maximum send socket buffer size kern.ipc.maxsockbuf |
|
NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_DEFAULT |
Uses default receive socket buffer size net.inet.udp.recvspace |
|
NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_MAX |
Uses maximum send socket buffer size kern.ipc.maxsockbuf |
7.6 Restarting Applications on QNX Systems
Due to a limitation in the POSIX API, the allocation and the initialization of a shared memory mutex need to be done in separate steps.
The first (and only the first) Connext application that runs in the system using the shared-memory transport on a given domain will create a shared-memory mutex, in separate steps as described above, and subsequent Connext applications will attach to—but not create—this mutex, which is necessary to protect access to the shared-memory area across multiple processes.
It is possible under some extreme circumstances that the Connext application that creates the mutex crashes—or terminates ungracefully—having only partially created the mutex. If this occurs, other Connext applications will consider the mutex is still being created and will not be able to continue their execution, reporting a timeout error and indicating the mutex name.
If this situation occurs, you must manually delete the shared-memory mutex and its segment before re-launching any application in the same DDS domain. The files to delete are:
- /dev/sem/RTIOsapiSharedMemoryMutex-<identifier>
- /dev/shmem/RTIOsapiSharedMemorySegment-<identifier>