[Buildroot] Buildroot for STM32F4 with Nuttx kernel

Cjw X cjwfirmware at vxmdesign.com
Fri Jul 10 18:58:28 UTC 2015


Hi!

So, there seems to be some confusion with the filesystem. I suspect
this will answer a few questions. I modified Nuttx so you can add a
romfs image when you build the kernel. This romfs image will
automatically get mounted when nuttx starts. (It isn't mounted as root
yet, but one problem at a time). This is why I have genromfs, this is
why I have the extra step after generating the filesystem, and why
there is the tiny skeleton. It is designed so that a package could be
installed into the filesystem, and then Nuttx could run it.

Also, sorry, there are still some random fragments in there debugging
when I was trying to get everything to work. Deadlines...

> Hello,
>
> On Thu, 9 Jul 2015 17:40:10 -0400, Cjw X wrote:
>
> > I modified buildroot to create a distribution for the STM32F4 processor.
> > (It should be fairly portable to different Cortex-M processors though, the
> > STM32F4 is the only one I've tested so far).
> >
> > So far it:
> > Builds the toolchain
> > Builds a modified Nuttx RTOS
> > Builds the icsp tools for programming and debugging (openocd/gdb)
> > It also integrates the filesystem buildroot generates into the Nuttx kernel
> > so it shows up in Nuttx's filesystem.
> >
> > It still has a ways to go, but right now it builds everything and works on
> > my hardware.
> > So far I've tested it on hardware I built, and on the STM32F407 discovery
> > board with the attached baseboard.
> >
> > You can find instructions here http://www.vxmdesign.com/STM32.html
> > The git repo is https://github.com/vxmdesign/prjpluto.git and
> > vdsc_defconfig is the config for the discovery board.
>
> Thanks for posting this! I had a look at the github repository, and I'm
> actually nicely surprised to see that the changes are not that big to
> make things work. Of course, there are some crude things here and there
> that would need to be addressed, but overall it doesn't seem
> completely crazy.
>
> I think the biggest question for me is whether it makes sense to have
> all this in Buildroot. On the one hand, I do understand the benefit of
> using Buildroot: all the toolchain logic is there, the logic to build
> packages is there, the menuconfig infrastructure makes things easy, etc.
>
> On the other hand, the biggest value of Buildroot is really in the
> "Target packages", and here none of them are usable because they are
> all Linux-specific.
>
> Do you think it would be possible to re-organize your patches into
> cleaner patches, at least having one patch for each "topic" rather than
> seeing all the history of your attempts/fixes, etc? It would make the
> review easier.
>
> A few comments/questions:

>
>  * I'm not a big fan of the BR2_ROOTFS_SKELETON_TINY thing, at least in
>    the way it's implemented with a separate $(BUILD_DIR)/.tiny target.
This is related to the filesystem thing

>
>  * Adding TARGETS to the os-release file seems a bit
>    unnecessary/unrelated to the change.
With was for debugging, it is unnecessary

>
>  * Can you explain why you need this new TARGETS_POST thing? Is it
>    something that needs to be called *after* the images have been
>    generated? Can you explain a bit what is happening in the nuttx
>    package at this stage?
This is part of the filesystem thing

>
>  * If there is a filesystem, is there a way of building certain
>    third-party applications? If so, which ones?
Yes, you can install third party application. Nuttx is pretty close to
being posix complient from what I can tell. There is still work to be
done, but I had this in mind when I was designing it.

>
>  * The pluto_defconfig should be re-generated using savedefconfig, to
>    make the patch smaller.
Fixed already

>
>  * In fs/common.mk, any reason to not call makedevs? You could for
>    example use an empty device table, that would probably be more
>    logical.
/dev is similar in Nuttx, it contains the system devices. However,
Nuttx's psuedofilesystem doesn't handle it the same way as linux. This
is a big part of the problem with mounting romfs as root right now.

>
>  * I like how Linux and NuttX are seen as two distinct operating
>    systems.
Thanks!

>
>  * Make sure to remove trailing whitespace everywhere.
>
>  * Add the usual comment header in nuttx.mk.
>
>  * Don't put host-gcc-final in NUTTX_DEPENDENCIES, this is not needed.
>    nuttx is a target package, so it automatically depends on the
>    'toolchain' package, which depends on 'toolchain-buildroot', which
>    depends on 'host-gcc-final'.
>
>  * Remove unneeded empty lines.
>
>  * Use $(INSTALL) -D -m 0644 to install the nuttx image.
>
>  * Put the nuttx image installation in NUTTX_INSTALL_IMAGES_CMDS and
>    not NUTTX_INSTALL_TARGET_CMDS. You will have to set
>    NUTTX_INSTALL_IMAGES = YES to make this work.
>
I can take care of all those easily enough.

>  * The nuttx_install_image thing in TARGETS_POST is a bit annoying. I
>    think we need to understand this a bit better to see how to
>    implement this nicely.
>
I completely agree. I spent some time looking into this, but I
eventually had to use a less than ideal solution because of time
constraints for the project.

>  * Why do you need genromfs in menuconfig?
>
For the filesystem.

>  * In package/Makefile.in, I don't think you need to have a special
>    GNU_TARGET_NAME = $(ARCH)-$(TARGET_OS)-$(ABI) for newlib.
>    $(ARCH)-$(TARGET_VENDOR)-$(TARGET_OS)-$(LIBC)$(ABI) should would
>    work fine, as long as LIBC is empty, no?
>
>  * In binutils.mk, removing the --disable-sim and --disable-gdb options
>    will require some other solution. Why are you doing this in the
>    first place?
>
>  * Enabling --enable-interwork when newlib is enabled does not make
>    sense, it needs to be related to some other option. Also, isn't
>    interwork only to make ARM and Thumb code cohabit? So on ARMv7 which
>    uses Thumb-2, this should be unnecessary. Why are you using this?
>
>  * In gcc-final.mk, according the -mthumb -march=armv7-m flags
>    definitely won't work in a generic way.
>
>  * Why do you need --disable-libstdcxx-pch ? This also needs to be made
>    conditional on something.
>
>  * Ditto gcc.mk: some explanation about the different changes are
>    needed, and they need to be reworked to be generic (i.e continue to
>    work with something else than your use case).
>
Getting gcc to build correctly took a very long time. There were a lot
of modifications, (and I'm sure there are a few things that are
unnecessary), and unfortunately, I don't remember the answers to all
of those questions. I'd be happy to look into if there is interest.
This sections alone probably requires its own very long email.

>  * newlib.mk should be using autotools-package instead of
>    generic-package.
>
>  * NEWLIB_APPLY_PATCHES is unneeded, applying patches is done
>    automatically by Buildroot. See
>    http://buildroot.org/downloads/manual/manual.html#patch-policy.
>
>  * Remove commented code in newlib.mk.
>
>  * The newlib patches should be named 0001-....patch and 0002-...patch,
>    carry a description and Signed-off-by.
I'll look into it.

>
>  * The OpenOCD bump to 0.8.0 has been merged in Buildroot, so if you
>    rebase your patch on top of the latest Buildroot, you won't have to
>    carry these changes.
Awesome!

>
>  * How is uClibc++ used compared to libstdc++ from gcc? Does it simply
>    overwrites the libstdc++ library installed by gcc? Is it only usable
>    with newlib?
uClibc++ is designed as an alternative to libstdc++ for a smaller
footprint. (The STM32F4 has 1MB-2MB of flash depending on device) I'd
be surprised if it was only usable with newlib, I'd guess you could
use it with uclibc as well, though I haven't looked into it. Debugging
this was not fun. Even the default Nuttx doesn't handle this
correctly.

>
>  * We should make sure that the user cannot enable Linux-only packages
>    when NuttX is selected.
>
I agree

> All in all, I think if we want to start merging that we should start by
> merging the support for building a newlib based toolchain, that's quite
> certainly the first step.
I would also agree.

>
> Are you interested in pushing this up to the point where it becomes
> clean enough to be merged in the official Buildroot?
Yes! I know there are plenty of hacks in what I have now that need to
get ironed out. (My Nuttx build has plenty more). I've used Buildroot
for years to create many embedded Linux systems. (I have another
all-in-one build for the Zynq Microzed on my github too). I created
this mod for some STM32F4 hardware I built because I wanted it to meet
my standards for quality embedded development.

>
> Best regards,
>
> Thomas
> --
> Thomas Petazzoni, CTO, Free Electrons
> Embedded Linux, Kernel and Android engineering
> http://free-electrons.com

Happy programming!
-Chris



More information about the buildroot mailing list