This is the second release of NuttX as Apache NuttX (Incubating).
Note that release consists of two tarballs: apache-nuttx-9.1.0-incubating.tar.gz and apache-nuttx-apps-9.1.0-incubating.tar.gz. These are available from:
https://www.apache.org/dyn/closer.lua/incubator/nuttx/9.1.0/
Both may be needed (see the top-level nuttx/README.txt file for build information). SHA512 checksums:
39011fcecca399f497da9a17eb71d3da97341808f0527314e5ccdb3c4813d8a971f999f1c56d1adc530e57d48270cceeb0543b3bd0a6ef15dcb7ea1abf2a6988 apache-nuttx-9.1.0-incubating.tar.gz
6a3fa9f0a13b85a6bf56070389d0d4737f8e976efd4238daff4a2c1cf131c7e084dea6e315333f2584a8b170daca605ea59b084fc909e50d11d37d1df9546c30 apache-nuttx-apps-9.1.0-incubating.tar.gz
PR-965 PR-980 PR-984 ioctl is now always in the variadic form. Syscalls in KERNEL builds are also more efficient with this as well now. Previously the ioctl prototype was normally defined as:
int ioctl(int fd, int cmd, unsigned long arg);
unless the CONFIG_LIBC_IOCTL_VARIADIC was enabled in which case it was
int ioctl(int fd, int cmd, …); This form is now the form defined by opengroup and is also inline with Linux. Prior to this change there were issues with making ioctl calls on 64-bit arch since the implementation assumed that (void *) would be of size long. There is more discussion of this issue in the GitHub issue ticket here:
https://github.com/apache/nuttx/issues/959
PR-962 PR-964 Add new interface sched_get_stackinfo that simplifies interfaces for things like TLS There are some security imposed rules for using this interface Any thread may query its own stack, A kernel thread may query the stack of any other thread Application threads, however, may query only the stacks of threads within the same task group, i.e., the main thread and any of the child pthreads created with the main thread as a parent or grandparent or great-grandparent.
PR-1141 Handle custom stack allocations sched_releasetcb() will normally free the stack allocated for a task. However, a task with a custom, user-managed stack may be created using nxtask_init() followed by nxtask_activate(). If such a custom stack is used then it must not be freed in this manner or a crash will most likely result.
This change adds a flag call TCB_FLAG_CUSTOM_STACK that may be passed in the the pre-allocated TCB to nxtask_init(). This flag is not used internally anywhere in the OS except that if set, it will prevent sched_releasetcb() from attempting to free that custom stack.
Many private architecture interfaces were using ‘up_’ instead of the arch name ‘arm_’ This fix is carried over many PRs such as PR-924. Many files also carried this same error in naming convention and were converted as well.
Major Changes to the Build System:
Parts of the build system have been refactored to reduce duplication and simplify Makefile and Make.defs files across many directories. These changes are particularly beneficial for boards.
Please note that if you develop your own custom boards, you may need to make some modifications to keep your board’s build scripts up-to-date with the rest of NuttX and avoid a broken or defective build. For details, see Compatibility Concerns, Changes to Build System, in these release notes.
PR-894 openamp and libmetal can now be downloaded and configured by build system - PR-941 Remove ‘u’ prefix from userspace library in FLAT Build so it is the same for all build types - PR-1044 ARM: Remove support for old redundant gcc toolchains
This removes support for the Codesourcery, Atollic, DevKitArm, Raisonance, and CodeRed toolchains. Not only are these tools old and no longer used but they are all equivalent to the standard ARM EABI toolchains. Retaining specific support was not meaningful (and they are still supported, but now just as generic EABI toolchains).
PR-1148 PR-1149 Improve build time especially on non-Linux platforms by providing a C version of incdir.sh
Bug Fixes: Many small changes to resolve dependency resolution issues that would sometimes appear during parallel builds. Parallel builds should be much more reliable now and bugs filed against any issues found.
PR-879 ARMv8-M support - PR-1051 STM32G474 support
Initial architectural support for the STM32G474 family of microcontrollers. In terms of peripherals, currently there is basic support for the RCC and UART, allowing NuttX to boot to a functional NSH prompt on this family. Other peripherals on the SoC are not yet supported and/or not tested yet. Contributions to enable other peripherals are welcome. This adds support for these variants:
STM32G474C STM32G474M STM32G474R STM32G474Q STM32G474V
PR-745 The full line of STM32H7 chips are now defined This adds support for these variants:
STM32H743AG STM32H743AI STM32H743BG STM32H743BI STM32H743IG
STM32H743II STM32H743VG STM32H743VI STM32H743XG STM32H743XI
STM32H743ZG STM32H753AI STM32H753BI STM32H753VI STM32H753XI
STM32H753ZI
PR-811 i486: Fix corruption of esp register on full context restore This resolves a long standing issue with running the x86 port under QEMU where it would crash shortly after boot.
PR-1041 STM32H7: Improve IDMA transfer and cache handling This resolves an issue where the sdmmc driver crashes at boot when using writeback cache.
This also simplifies the sdmmc driver when the IDMA is in use. There is no need to mix IDMA and interrupt based transfers; instead, when making unaligned data tranfers, just make IDMA into an internal aligned buffer and then copy the data. This method also enables multiblock transfers, and transfers from/to data buffers which are not aligned on cache boundary.
PR-1110 STM32H7: Use FDCANSEL to determin FDCAN clock source if possible - PR-1165 STM32H7: SPI transaction appears to be completed before the data has actually been flushed TX DMA completes before the data has been actually sent out from the SPI fifo. This is expected, but the exchange should actually wait for spi tx to finish instead of dma to the fifo to finish. This replaces the dma completion event with the SPI TXC event for detecting end of transmission.
Significant Improvements:
PR-1200 The boards_button_initialize and boards_userled_initialize functions now return the number of buttons and leds, thus their prototypes have changed from: void board_button_initialize(void) void board_userled_initialize(void)
to
uint32_t board_button_initialize(void) uint32_t board_userled_initialize(void).
PR-185 PR-828 nshlib Add the source command. Avoid use of sh where it is not needed since it pollutes the parent environment including the working directory and variables.
Compatibility Concerns – Changes to Build System:
If you are building NuttX for a custom board, you may need to make some of the following changes in build-related files for your board:
Rename EXTRADEFINES to EXTRAFLAGS
In your custom board’s scripts/Make.defs file, rename EXTRADEFINES to EXTRAFLAGS.
For example, these lines:
CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
...
CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
...
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
would change as follows:
CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
...
CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
...
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
See git commit 459ad9937377a42785692098ff0d73baaa9551e6 in the main NuttX repository.
If you forget to do this, memory allocations on the heap probably won’t work and your user tasks won’t start.
To see why, tools/Config.mk assigns a value to KDEFINE such that the preprocessor symbol KERNEL will be defined when certain source files are compiled. KDEFINE is passed to nested invocations of ‘make’ as EXTRAFLAGS. If your board’s scripts/Make.defs still attempts to use EXTRADEFINES, the preprocessor symbol KERNEL will not be defined in some of the places that it should be. Suppose you’re building a FLAT build. In this case, include/nuttx/mm/mm.h will not define MM_KERNEL_USRHEAP_INIT like it should, which will cause nx_start.c not to call up_allocate_heap() at startup. Therefore, any attempt to allocate memory on the heap will fail.
Rename src/Makefile to src/Make.defs and Modify
This item pertains only to custom boards that are developed in- tree, meaning under the NuttX boards/ subdirectory. Out-of-tree boards are not affected.
If your custom board directory is in-tree and in a board family that uses a ‘boards/ARCH/FAMILY/common’ directory (such as boards/arm/stm32/common, boards/arm/cxd56xx/common, etc), then you’ll need to make two minor changes to your custom board’s src/Makefile:
(1) Rename it from src/Makefile to src/Make.defs, and
(2) Near the end of that file, replace this line, which usually appears at the end:
include $(TOPDIR)/boards/Board.mk
with these three lines:
DEPPATH += --dep-path board
VPATH += :board
CFLAGS += $(shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
See git commit 6ca46520df38854bf660f9be54957cceede39ded in the main NuttX repository.
If you forget to do this, ‘make’ will report an error, “no rule to make libboard.a,” and the build will fail.
Rename WINTOOL to CONFIG_CYGWIN_WINTOOL
In your custom board’s scripts/Make.defs file, rename any instances of WINTOOL to CONFIG_CYGWIN_WINTOOL.
For example, change this line:
ifeq ($(WINTOOL),y)
to this:
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
See git commit bd656888f26c92e8832f0e76b395a5ece7704530 in the main NuttX repository.
Remove INCDIROPT
In your custom board’s src/Make.defs file, remove INCDIROPT from CFLAGS.
For example, change this line:
CFLAGS += $(shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
to this:
CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
This option, which resolves to -w when CONFIG_CYGWIN_WINTOOL is configured, is now appended to INCDIR in tools/Config.mk.
See git commit 5eae32577e5d5226e5d3027c169eeb369f83f77d in the main NuttX repository.
Remove Unnecessary Variables
In your custom board’s scripts/Make.defs file, It is no longer necessary to define the following variables unless your build requires that you assign special values to them:
These variables have been refactored into tools/Config.mk.
See these git commits in the main NuttX repository: 9ec9431706fd0eb7c4c4410d84dafff68ff31366 (DIRLINK and DIRUNLINK), 8b42ee421a41214093c0238e479d73a1099b0e82 (MKDEP), and 567962bd6263bf8809fb63c739f6ec668c69c416 (ASMEXT, OBJEXT, LIBEXT, EXEEXT)
Change ${TOPDIR} to $(TOPDIR)
In your custom board’s scripts/Make.defs file, it is recommended to change ${TOPDIR} to $(TOPDIR) for consistency (change curly braces to parenthesis).
See git commit faf3c0254bb63af89f9eb59beefacb4cba26dd9 in the main NuttX repository.
Remove Workaround For Missing $(TOPDIR)/Make.defs
In src/Make.defs or src/Makefile for your custom board or custom apps,
the workaround for missing $(TOPDIR)/.config and/or
$(TOPDIR)/Make.defs is no longer needed. To remove the workaround,
delete the minus sign in front of include .config. This is now handled
in the main Makefile and, if those files are missing, will print an
error message with hint to run tools/configure.sh
Change this line, located near the top of the file:
-include $(TOPDIR)/Make.defs
to this:
include $(TOPDIR)/Make.defs
See git commit 1a95cce1a3c3ed8b04d1d86b7bd744352cca45a2 in the main NuttX repository, and git commit ead498a7883a654b1d542da94a5fab3ce163361e in the apps repository.
Simplify ARCHINCLUDES and ARCHXXINCLUDES
In your custom board’s scripts/Make.defs, ARCHINCLUDES and ARCHXXINCLUDES can be defined without maintaining two different versions conditioned upon CONFIG_CYGWIN_WINTOOL (renamed from WINTOOL). Replace syntax similar to the following:
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
# Windows-native toolchains
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)$(DELIM)include}"
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)$(DELIM)include}" -isystem "${shell cygpath -w $(TOPDIR)$(DELIM)include$(DELIM)cxx}"
else
# Linux/Cygwin-native toolchain
ARCHINCLUDES = -I. -isystem $(TOPDIR)$(DELIM)include
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)$(DELIM)include -isystem $(TOPDIR)$(DELIM)include$(DELIM)cxx
endif
with syntax similar to:
ARCHINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include}
ARCHXXINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include}
ARCHXXINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include$(DELIM)cxx}
INCDIR is defined in tools/Config.mk and resolves to a shell script or batch file that constructs the appropriate command line argument string to specify include directories for your compiler.
See git commit 7e5b0f81e93c7e879ce8434d57e8bf4e2319c1c0 in the main NuttX repository.
Simplify Board Directory Handling With BOARD_DIR
In your custom board’s Make.defs or Makefile, when setting up build variables containing paths inside your board directory, a new variable BOARD_DIR has been introduced that simplifies the syntax:
Replace syntax like this:
$(TOPDIR)$(DELIM)boards$(DELIM)$(CONFIG_ARCH)$(DELIM)$(CONFIG_ARCH_CHIP)$(DELIM)$(CONFIG_ARCH_BOARD)
with this variable:
$(BOARD_DIR)
For example, change this:
ARCHSCRIPT = -T$(TOPDIR)$(DELIM)boards$(DELIM)$(CONFIG_ARCH)$(DELIM)$(CONFIG_ARCH_CHIP)$(DELIM)$(CONFIG_ARCH_BOARD)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
to this much simpler syntax:
ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
You may find the old syntax being used for variables like ARCHSCRIPT, LDELFFLAGS, LINKCMDTEMPLATE, SCRIPTDIR, USER_LDSCRIPT, or others.
BOARD_DIR is defined in tools/Config.mk.
See git commit e83c1400b65c65cbdf59c5abcf2ae368f540faef in the main NuttX repository.