incubator-nuttx/Documentation/ReleaseNotes/NuttX-9.1.0

602 lines
24 KiB
Plaintext

NuttX-9.1.0
-----------
* Major Changes to Core OS:
* New Features:
- PR-977 PR-987 PR-998 PR-995 PR-997 PR-1007 Thread Local Storage (TLS)
is now a required feature and used by all architectures
There is detailed information on the implementation and how this
impacts errno specifically in the Wiki article: Userspace errno and
TLS
- PR-957 PR-947 PR-963 PR-969 Provide nx_ versions of many functions
that are used internally to avoid disrupting errno in userspace
- 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-1104 Internal function fs_fsopen() no longer affects errno -
- PR-1123 Move task_init() and task_activate() to be internal functions -
- PR-1140 Add nxtask_uninit() interface
This function will undo all operations on a TCB performed by
task_init() and release the TCB by calling kmm_free(). This is
intended primarily to support error recovery operations after a
successful call to task_init() such was when a subsequent call to
task_activate fails.
- PR-1134 Add typedef for max_align_t
- 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.
* Bug Fixes:
- 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.
- PR-1018 PR-1017 PR-1021 PR-1022 PR-1057 PR-1060 PR-1194 Clean up
internal APIs that were not using the properly naming conventions -
- PR-857 Wrong value for it_interval field in timespec returned by
timer_gettime - PR-902 SMP: On task creation do not clone
uninitialized descriptors
In SMP mode, there is a possibility that a pthread executing one CPU
may create a new task while a pthread on another CPU has allocated
the socket but not yet initialized it. This commit updates the
socket clone test to assure that the socket is both allocated and
initialized before it is cloned.
- PR-911 Use OS signal functions internally to not reset errno that
applications are using
- PR-925 sys/stat.h Change the xtime fields to align with POSIX
standard. Starting from Issue 7 of the POSIX standard the fields
st_atime, st_mtime and st_ctime have a type of strcut timespec instead
of time_t.
- PR-939 openamp: Update to 2020.04.0 - PR-953 lib_vsprintf: Fix issue
where stack would become corrupt on x86_64
This function requires traversing the VA_LIST twice. For some
architectures like x86 and x86_64 this needs to be cloned first.
* 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.
* New Features:
- 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-1000 Fix broken support of ZDS-II Toolchain with MSYS
* Architectural Support:
* New Architecture Support:
- 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
* Architectures With Significant Improvements:
- 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-837 rx65n: Add crashdump support using standby RAM - PR-862
STM32L4: Expose LPTIM timers - PR-868 STM32L4: Extend clock options and
power regulation for based on clock settings
Interface to select the core regulator voltage according to clock
frequency range Usage of this interface during clock configuration
according to chosen clock frequency Option to choose a different
system clock than the main PLL (there is HSI, MSI, HSE and LSE
available to use) Option to not enable the main PLL which allows for
reduced power usage when setting one of the above options as system
clock, to do this you should define STM32L4_BOARD_NOPLL on your
board header.
- PR-960 STM32: Add support for ADC features EXTSEL and JEXTSEL
- 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-1042 STM32H7: Resolve multiple limitations and bugs with progmem
especailly for partial memory writes
- PR-1045 STM32H7: This gives possibility to send arbitrary number of
bytes from memory to peripheral using DMA also when using write-back
cache
It was not possible to DMA to/from AXI sram if
CONFIG_STM32H7_DMACAPABLE=y When doing TX DMA (e.g. in SPI driver in
simplex-tx mode), it should not be necessary to align the data
buffers to the cache line.
- PR-1103 STM32H7: Resolve clocking and pin configurations bugs that
could cause SDMMC and ETH to fail in some configurations
- PR-1104 STM32H7: Use UUID for Ethernet MAC. This is inline with the
behaviour of STM32F7
- 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.
- PR-1203 PR-1204 STM32H7: Enable support for BDMA and enable it for
SPI6
- PR-905 x86_64: Resolve linking issue when building with gcc 7 and 9.
- PR-904 x86_64: Resolve compiler aliasing warnings and RNG
pointer cast bug - PR-944 x86_64: Change entrypoint to standard
location 1M
- PR-971 x86_64: Fix bug in rng implementation using intrinsics
- PR-973 x86_64: Fix crash on boot when XSAVE and SSE/AVX is enabled
- PR-974 x86_64: Add support booting NuttX as a Jailhouse Cell
- PR-919 sim: Add host mmap and perror to allow use of LIBC_MODLIB
and BINFMT_LOADABLE
- PR-1198 sim: Use correct errno sign with hostfs interface
- PR-932 z16: Updated toolchain to ZDS-II 5.2.2
- PR-970 K210: Add PLL support
- PR-988 K210: Resolve occasional lock in early boot caused by waiting
forserial driver to initialize
- PR-1205 K210: Add basic GPIOHS support - PR-1112 tiva: Add up_idle
support - PR-1116 NRF52832: Work around chip eratta for SPI Master 1
Byte transfer anomaly - PR-1130 imxrt: Resolve WFI issue by setting
the low power mode to remain in run mode
- PR-1197 cxd56: Fix locking issue in Spresense audio driver causes by
using semaphore in DMA buffer handling code
- PR-1221 Add INTx_C macro defintion
* Driver Support:
* Bug Fixes:
- PR-1206 PR-1207 PR-1210 ioctl function should retun ENOTTY when the
command is not recognized.
* New Driver Support:
- PR-795 PR-1001 Initial NuttX audio driver supporting the Spresense
CXD56
- PR-975 Support for HDC1008 temperature and humidity sensor
- PR-1201 Support for the CS4344 stereo audio DAC
- PR-1145 Support for the FTDI FT232R USB to Serial converter
- PR-1052 gs2200m: Add max payload size to prevent crashing when
sending large packets
- PR-1090 gs2200m: Fix possible packet queue count overflow seen during
streaming - PR-1127 gs2200m: Resolve possible buffer overrun in packet
parsing - PR-1167 pty: Return correct number of bytes when
CONFIG_SERIAL_TERMIOS and OPOST|ONLCR are enabled
* Drivers With Significant Improvements:
- PR-887 PR-888 rptun: Add control for independent control of rx and tx
buffer size
- PR-917 gs2200m: Receive performance improvement for TCP/UDP
- PR-1032 gs2200m: Add SPI-DMA support to spresense
- PR-1046 gs2200m: Add getsockname() support
- PR-1094 PR-1163 gs2200m: Add flow control support to prevent memory
starvation in changing network environments
- PR-1101 gs2200m: Add WPA2-PSK AP mode support, this is now the default
instead of WEP
- PR-1115 SPI slave: Improve interface
Enable enqueue and receive full buffers of data with single call, to
avoid call overhead when sending / receiving large amounts of data.
Enable the slave device to leave received data in the controller
receive buffers and retrieve it from there by polling
- PR-1196 Audio: Add support for using ap_buffer_info without
CONFIG_AUDIO_DRIVER_SPECIFIC_BUFFERS and return ENOTTY if provided ioctl
is not supported
- PR-1222 audio/cxd56: Add audio buffering feature.
* Board Support:
* 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).
* New Board Support:
- PR-1051 ST Micro B-G474E-DPOW1 Discovery Kit
Initial support for the ST Micro B-G474E-DPOW1 Discovery Kit with
STM32G474RE MCU. Currently there is basic support for booting NuttX to
a functional NSH prompt. Other peripherals on the board are not yet
supported or not tested yet. Contributions to enable other peripherals
are welcome. The NSH prompt can be accessed from a host computer via a
Virtual COM Port over the same Micro-USB Type B connection used for
programming/debugging.
- PR-1211 STM32F411-Minimum board (a.k.a. BlackPill)
Initial support for the BlackPill board which is a low cost STM32F411
board. The current support boots NuttX to a functional NSH prompt.
* Boards With Significant Improvements:
- PR-949 qemu-intel64: Add nsh configuration for testing QEMU
virtualization
- PR-966 qemu-i486: Fix issue where console would not accept input
because of wrong IRQ number
- PR-993 stm32h747i-disco: Add support for FMC SDRAM - PR-1029 maix-bit:
Add knsh configuration for testing Kernel mode under QEMU virtualization
- PR-1056 stm32h747i-disco: Add support for FAT and SD Card via SDMMC
- PR-1070 PR-1086 spresense: Add ftpd/ftpc and nxplayer to wifi and rndis
configurations
- PR-1084 imxrt1060-evk: Add dns client and renew command to netnsh
configuration
- PR-1113 lm3s6965ek: Use proper sysclock for QEMU
configuration
- PR-1229 Add support for the inboard joystick
- PR-1232 Architectural re-organization to the initialization of the
video stream driver to comply with other NuttX drivers
* File System:
* Bug Fixes:
- PR-918 tmpfs: Calling statfs could cause files to be removed
recursively - PR-1142 NFS: Use of uint64_t causes issues with gaps in
data since it must be on a 8 byte boundary
- PR-1143 Report correct stats for proxied block and MTD drivers
* Significant Improvements:
- PR-793 Allow use of genromfs to geneate ROMFS
- PR-851 Upgrade littlefs to v2.2.1
- PR-1154 FATFS: Do not rewrite the root directory if it has not been
changed.
- PR-1120 PR-1118 Fill in file size for mtd and block inode
* Networking:
- PR-807 Netlink: Broadcast link status changes to userspace via
RTNLGRP_LINK
- PR-892 Netdb: Multiple DNS Servers
Adds capability to add multiple nameservers on run-time even when not
using resolv.conf and reset the list of nameservers back to default
setting (no nameserver at all or single predefined nameserver in Kconfig).
This is useful for applications that change their cellular network
frequently.
- PR-1015 tcp/conn: Request ARP before 3-way handshake
* Applications:
* Improvements:
- 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.
- PR-236 littlevgl: Add additional config mappings to the library
- PR-264 nxplayer: Add max host and filename for http url
- PR-260 nshlib: Add wget buffer size control with
CONFIG_NSH_WGET_BUFF_SIZE
- PR-243 dhcpd: Add ability for daemon to be cancelled
- PR-238 Remove use the set_errno this is now properly handled by the
libc and OS
- PR-233 hdc1008: Add example application for this driver
* Bug Fixes:
- PR-282 netlib: Fix pathlen computation for netlib_parseurl and
netlib_parsehttpurl
- PR-281 webclient: Check return value of netlib_parseurl correctly
- PR-278 webclient: Handle http/https redirection correctly
- PR-277 webclient: Limit the number of http redirects
- PR-198 webclient: Use getaddrinfo() to get IPv4 address on
dual stack systems
- PR-268 ftpd: Fix EPSV mode for IPv4
- PR-258 nsh: Always try FILE_APPS even if the command is builtin,
this is a regression introduced in 9.0.0
- PR-257 gs2200m: Handle packets over 1500 Bytes, previously would
overflow buffer
- PR-221 gs2200m: Server sockets were not properly being released by
the daemon when close was called
- PR-248 dhcpd: Correct option header check length
- PR-176 cu: Handle NULL character correctly
- PR-287 PR-290 examples: Update nxflat and thttpd Makefile's to fix
a build breakage.
* 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:
- DIRLINK
- DIRUNLINK
- MKDEP
- ASMEXT
- OBJEXT
- LIBEXT
- EXEEXT
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 <target>.
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.