Lets start by building and flashing plain old nuttx, without Px4

Plain Nuttx

Im using the STM32F746 Nucleo-144 board pinmap

Install deps (Mac OS):

brew install gperf stlink

Make a nuttx top level dir

mkdir ~/src/embedded/nuttx
cd ~/src/embedded/nuttx

Nuttx depends on kconfig-frontend, so lets build and install it

git clone https://bitbucket.org/nuttx/tools
pushd tools/kconfig-frontends
# https://github.com/PX4/NuttX/tree/master/misc/tools
# appy this diff: https://github.com/PX4/NuttX/blob/master/misc/tools/kconfig-macos.diff
./configure --disable-shared --enable-static --disable-gconf --disable-qconf --disable-nconf --disable-utils
sudo make
sudo make install
popd

Clone the nuttx example apps

git clone https://bitbucket.org/nuttx/apps.git

Clone nuttx and cd into the directory

git clone https://bitbucket.org/nuttx/nuttx.git
cd nuttx

Note that target documentation is in the target folder's readme.txt file

# clean any previous builds
make distclean
# pick a target board and app, then configure
# look in configs/ for board info
tools/configure.sh configs/nucleo-144/f746-nsh
# menuconfig, note run this in bash. zsh does not like it at all
# i'm using bash explicitly since it seems to break with by default zsh
bash -c 'make menuconfig'
# build it
make

Then flash it with an st-link

st-flash write nuttx.bin 0x8000000

Using the st-link's built in serial port, we can connect to nsh with:

screen /dev/tty.usbmodemFD133 115200 8N1

Reconfigure the UART config when using a jlink, to run nsh on a different uart. With JLinkExe:

make distclean
# pick a target board and app, then configure
# look in configs/ for board info
tools/configure.sh configs/nucleo-144/f746-nsh
# menuconfig, note run this in bash. zsh does not like it at all
# i'm using bash explicitly since it seems to break with by default zsh
bash -c 'make menuconfig'
# build it
make

Then flash it with JLinkExe

si 1
speed 4000
device STM32F746ZG
r
h
loadbin nuttx.bin, 0x8000000
exit

Or create a file like flash.jtag with the contents above and run:

JLinkExe flash.jtag

Configure with menuconfig

make menuconfig

Configure any settings specified in configs/stm32f429i-disco/README.txt for the example you're running.

Nuttx Apps

Here's a great guide on adding an app: https://acassis.wordpress.com/2013/06/09/how-to-put-your-application-to-be-called-from-nuttx-terminal/

Eclipse + Nuttx

Here's a great setup guide for compiling nuttx with Eclipse: http://paregov.net/17-manuals/nuttx/20-building-nuttx-in-eclipse-ubuntu

Just note the comment #2 by Galin Hristov:

In case some of the apps will be build (not only the OS) it is better to select the parent folder in step 3 (instead of “nuttx”). This way also apps code will be visible and indexed by Eclipse.

|- nuttx-code - Select this folder ...
| |-- nuttx - …. instead of this folder.
| |-- apps

Then in the project properties in "C/C++ Build" page for Build Location "${workspace_loc:/nuttx-code/nuttx}/" must be selected instead of "${workspace_loc:/nuttx-code}/"

And set the debug configuration application to nuttx/nuttx the nuttx file in the nuttx folder is an .elf file, even though it doesnt have the extension

Px4

Once you understand the basics of building nuttx, we can move onto the more complicated Px4 build.

Note that when checking out the project to a specific tag, be sure to reset submodules with:

git submodule foreach --recursive git reset --hard

Firmware

The Px4 firmware uses nuttx as a middleware

Show all build info with the VERBOSE=1 environment variable

When porting, make a new target with VERBOSE=1 make px4-omnibus-nxt_default

When making nuttx changes, rm -rf build/[target name] before making again to ensure the existing build config is updated

Install the Bootloader first, then build the new target with the upload command specified:

VERBOSE=1 make px4-omnibus-nxt_default upload

Eclipse Debugging

To debug with Eclipse, in the Firmware folder:

mv eclipse.cproject .cproject
mv eclipse.project .project

Then open Eclipse and right click on the project explorer, choose import -> existing -> [pick the px4/firmware directory] -> ok

Add a new build target by right clicking on the Build targets icon

Bootloader

The Px4 bootloader is based on libopencm3

All that is needed to port to a new board is: https://gist.github.com/nathantsoi/b24232791d3ec9390a51fab141c7a4bb

To build, run make omnibusnxt_bl

And to flash:

st-flash write build_omnibusnxt_bl/omnibusnxt_bl.bin 0x8000000

The status LED will flash once successfully uploaded to the flight controller

Further Reading

Nuttx

Main documentation page: http://nuttx.org/doku.php?id=documentation

Getting Started Guide (README.txt): https://bitbucket.org/nuttx/nuttx/src/master/README.txt

STM32F4 Discovery board info: http://nuttx.org/doku.php?id=wiki:getting-started:stm32f4discovery_unix

"Blue Pill"/Maple Mini/Stm32f1 Dev board info: https://acassis.wordpress.com/2016/06/12/running-nuttx-on-a-less-than-u2-00-board/

How to compile an external application out of tree: http://nuttx.org/doku.php?id=wiki:nshhowtos:external-applications

Porting guide has a good overview of the RTOS: http://www.nuttx.org/Documentation/NuttxPortingGuide.html

A great tutorial on compiling nuttx and writing a simple application: http://www.zilogic.com/blog/tutorial-nuttx-hello.html

Nuttx driver development: https://acassis.wordpress.com/2013/06/11/how-to-create-a-driver-for-nuttx/

A set of great tutorials for Nuttx development on the stm32 minimum board: https://www.youtube.com/channel/UC0QciIlcUnjJkL5yJJBmluw

Building nuttx from scratch: http://reclonelabs.com/building-nuttx-in-ubuntu-from-scratch/

Nuttx gitbook: https://phreakuencies.gitlab.io/nuttx_book/

Px4

Porting Guide: https://github.com/PX4/Devguide/blob/master/en/debug/porting-guide.md

App development: https://dev.px4.io/en/tutorials/tutorial_hello_sky.html

Driver using the I2C bus: https://dev.px4.io/en/sensor_bus/i2c.html

STM32 F4 discovery board development: https://pixhawk.org/modules/stm32f4discovery