It is possible to use NuttX as library, then you don’t need to compile the source code all the time, just modify your application and link it against the NuttX library.
Here I will explain step-by-step how to do that.
I will consider that you just entered on nuttx/tools and executed the ./configure.sh to select your board and your application profile (here my application is called “hello” and CONFIG_USER_ENTRYPOINT=”hello_main”). Then now instead of executing “make” to compile the source code you should to execute:
make export
If everything worked as expected you will get the file “nuttx-export.zip”. Extract this file and create your application inside it. Here I create a hello.c file with it:
#include int hello_main(void) { printf("Hello World!\n"); return 0; }
Now I compiled it this way:
$ arm-none-eabi-gcc -c -fno-builtin -Wall -Wstrict-prototypes -Wshadow -Wundef -g -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -I. -isystem ./include -pipe -I "./include" hello.c -o hello.o
We just need to link again libnuttx.a to generate our nuttx ELF:
$ arm-none-eabi-ld --entry=__start -nostartfiles -nodefaultlibs -T./build/spificonfig.ld -L./libs hello.o -o nuttx.elf --start-group -lnuttx "/usr/lib/gcc/arm-none-eabi/6.2.1/thumb/v7e-m/libgcc.a" --end-group
And to generate the finaly binary from the ELF:
$ arm-none-eabi-objcopy -S -O binary nuttx.elf nuttx.bin
It is also a good idea to generate the map of symbols with the physical address of each function:
$ arm-none-eabi-nm nuttx.elf | \ grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | \ sort > System.map
Well done, now just flash it using OpenOCD and STLink-V2 :
$ sudo openocd -f interface/stlink-v2.cfg -f target/lpc4330.cfg -c init -c "reset halt" -c "flash write_image erase nuttx.bin 0x14000000" Open On-Chip Debugger 0.10.0 (2017-02-12-09:48) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '. adapter speed: 500 kHz Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD Info : Unable to match requested speed 500 kHz, using 480 kHz Info : Unable to match requested speed 500 kHz, using 480 kHz Info : clock speed 480 kHz Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748 Info : using stlink api v2 Info : Target voltage: 3.273164 Info : lpc4350.m4: hardware has 6 breakpoints, 4 watchpoints target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x10402c40 msp: 0x10087ff0 auto erase enabled Info : Found flash device 'win w25q64cv' (ID 0x001740ef) Warn : no flash bank found for address 28000000 Warn : no flash bank found for address 280074c4 wrote 0 bytes from file nuttx.bin in 0.087209s (0.000 KiB/s)