This post intends to gather all the information you need to start a project based on QNX Neutrino Real-Time Operating System. It will provide instructions to build your own BSP and/or application.
As Wikipedia says: QNX is a commercial Unix-like real-time operating system, aimed primarily at the embedded systems market.
As this RTOS is based on a micro-kernel architecture, it offers a very high stability and robustness which is why it is mainly used for critical applications in medical, defense or automotive industries.
Here is a quick video that shows our QNX6.6 BSP running on our Nitrogen6X platform:
Either for BSP or App debugging, QNX Momentics IDE must be installed on your host machine:
Then the BSP can be found on QNX website:
From there can be download either our QNX6.5 or QNX6.6 BSP:
- QNX6.5.0 BSP for Nitrogen6x
- QNX6.6.0 BSP for Nitrogen6x
- QNX6.6.0 BSP for Nitrogen6_SOM2
- QNX6.6.0 BSP for Nitrogen7
- QNX6.x.0 BSP for BD-SL-i.MX6
In order to build the BSP, you can either do it in command line:
~$ mkdir qnx-bsp && cd qnx-bsp ~/qnx-bsp$ unzip BSP_boundary-imx6q-nitrogen_br-660_be-660_786740.zip ~/qnx-bsp$ make
Or you can use the Momentics IDE:
- File > Import > QNX > QNX Source Package & BSP > Local archive
Once imported you can browse the source code:
The result of the build will be located under the
After either manual or IDE build, the output file will be
images/ifs-*.raw on older BSP).
At this point you simply need to copy this IFS image along with
images/bootscript/6x_bootscript to an SDCard or USB drive previously formatted in FAT32 or ext2/3/4.
~/qnx-bsp$ cp -v images/qnx-ifs images/bootscript/6x_bootscript <media_mount_point>
Application development is actually going to be pretty similar as it is based on the same tool:
- File > New > QNX C/C++ project
Once the application is set up, you can specify the target architecture which is ARMv7 in our case.
Then a sample C file will be created, from there you can start developing/debugging the application.
- Run > Debug As > QNX C/C++ application
On top of an excellent debugging capability, this IDE also offers many profiling features which allow to fine tune your system, making sure the process are running as expected.
First, an Eclipse perspective offers many information about every process memory consumption:
- Window > Open Perspective > QNX System Information perspective
- On the left panel: right click > New QNX Target (enter the IP of the board)
From that same perspective, you can start a profiling of several seconds on the target. This will record every interrupt occurring on the target, every task-switching, every instructions, allowing to discover is using the CPU too much or too often for instance.
- On the left panel: right click > Log With… > Kernel Event Trace
- Output log will be a .kev file that can be opened with the IDE
Tips & Tricks
This section will give a few tips for those coming from the Linux world, the equivalent of very famous/useful Unix tools.
If you are looking for
/var/log/syslog you will see that those do not exist. Instead every log is centralized in
# sloginfo Time Sev Major Minor Args Jan 01 00:00:00 2 19 1800 devb-sdmmc-mx6_generic 1.00A (Dec 2 2015 22:43:33) Jan 01 00:00:00 2 5 0 libcam.so (Feb 22 2014 18:44:02) bver 6060109 ...
Then your application must use the slogf function in order to have the log appear the standard way.
Unix systems usually rely on the
ps command in order to list the running processes, QNX has another tool called
# pidin pid tid name prio STATE Blocked 1 1 /procnto-smp-instr 0f READY 1 2 /procnto-smp-instr 0f RUNNING 1 3 /procnto-smp-instr 0f RUNNING 1 4 /procnto-smp-instr 0f RUNNING ...
Refer to the documentation to know about the different options of the tool.
Unix users are familiar with the
man command which displays the manual pages of a command, instead QNX has
# use dvfsmgr-imx6 dvfsmgr-imx6 - DVFS Manager dvfsmgr-imx6 [vwp:i:c:d:u:s] Options: -c cfg_file DVFS config file path (default: /etc/system/config/dvfs.conf) -o cfg_pwrtable DVFS config Power Table file path (default: /etc/system/config/dvfs_pwrtbl.conf) -v Increase verbosity ...