QNX Neutrino 6.6 on the Beaglebone Black

Some background

I'm currently attending college - Embedded systems engineering. We (a group of 4 students) primarily work on ~ 6 month projects, were we'll have to develop a project according to some specification. This time arround, we are building a swarm of boats, communicating through a wireless network. Additional requirement: use an RTOS.

Due to time constraints, we'll be using an existing hardware platform, not start from scratch with a custom PCB.

After some research, we settled on a combination of the Beaglebone Black and the QNX Neutrino RTOS. Documentation on Neutrino seems expansive, and an aceemic licensing model is available, so we where good to go.

QNX provides BSP's - Board Support Packages - to make it easy to get started with the OS. These packages contain drivers and startup code for a ton of devices and platforms. The package for the Beaglebone Black was recently updated to the latest Neutrino 6.6.

Getting started

The user guide that comes with the BSP is fairly comprehensive, and getting it up and running on the BeagleBone black was relatively straightforward. We took the recommendation of using the Momentics IDE, developed on top of Eclipse and provided by QNX. Suprisingly simple, the BSP can be imported straight from the .zip file. Just follow the instructions to get the basics working.

Radio silence...

No, really. This is were the documentation lets you go. There are some 'hello world' examples, which are easily understood, but from there on it focusses on specific API's and modules, not on gradual progress. Some extensive Googling yielded almost no helpful results, which is why I figured the details might help someone.

The build

With the project open in the IDE, there is one file you'll need to modify to get the OS to your liking.

src\hardware\startup\boards\ti-am335x\beaglebone\build

There are several more *.build files, you do not want those. The prebuilt folder also has a build file, which we started with. This file is the one that is originally used, but you cannot change the BSP source and use the prebuilt files. More details in a bit.

Changing the source

As you may know, the BeagleBone has several uses for the headers, and you'll need to configure them to get the functionality you want. On Linux platforms, you'd be using device tree files, but the process is slightly different in Neutrino.

Pinmuxing, as the process of configuring the pins is called, can be done in the following file:

src\hardware\startup\boards\ti-am335x\beaglebone\init_pinmux.c

Go ahead, change the file. Won't help. It took us several days to figure out why.

Building \src changes

It took us a while to figure this out, but the files in the install folder will be overwritten by the build process. From the QNX documentation:

install
	Invokes the prebuilt target, and then performs the 
	following in the src directory:
		make hinstall to copy all public 
		  headers from src into the install directory.
		make install to build all binaries
		  in src and copy the results into the install directory.
		  This target also copies the buildfile 
		  from src/hardware/startup/boards/board/build and
		  renames it board.build.
QNX Software systems - Building source from the command line

If you go through the results in the Momentics build console, you'll find several mentions of the hinstall command. Thus, to get the build process to use the actual code from the \src folder, we needed to change the Makefile to use the install directive in the build, not hinstall. Browse to:

\Makefile

And find the install directive:

install: $(if $(wildcard prebuilt/*),prebuilt)
	$(MAKE) -Csrc hinstall
	$(MAKE) -Csrc

Change $(MAKE) -Csrc hinstall to $(MAKE) -Csrc install (removing just the one 'h'). 'Clean' your project and build it again: it will now use the code from the \src folder.


Eric Steendijk contributed to the research in this article.