From 5ff4bdde657f7c7f2cac74c8b45680bdbe1ed2a6 Mon Sep 17 00:00:00 2001 From: zhangyu117 Date: Thu, 13 Aug 2026 22:32:10 +0800 Subject: [PATCH] nuttx/libc: refine the atomic related Kconfig Refine the atomic Kconfig to support multiple backends: LIBC_ATOMIC_TOOLCHAIN (compiler builtins), LIBC_ATOMIC_ARCH (arch instructions), and LIBC_ATOMIC_IRQ (interrupt disable). Rename arch_atomic.c to arch_atomic_irq.c since it supports the IRQ backend. Signed-off-by: zhangyu117 --- arch/arm/Kconfig | 4 +--- arch/renesas/Kconfig | 1 + arch/risc-v/Kconfig | 1 + arch/xtensa/src/esp32/Kconfig | 2 +- .../arm/am67/t3-gem-o1/configs/nsh/defconfig | 1 - include/nuttx/atomic.h | 2 +- libs/libc/machine/CMakeLists.txt | 2 +- libs/libc/machine/Kconfig | 21 ++++++++++++++----- libs/libc/machine/Make.defs | 2 +- .../{arch_atomic.c => arch_atomic_irq.c} | 4 ++-- libs/libc/machine/tricore/CMakeLists.txt | 5 ++++- libs/libc/machine/tricore/Make.defs | 3 +++ 12 files changed, 32 insertions(+), 16 deletions(-) rename libs/libc/machine/{arch_atomic.c => arch_atomic_irq.c} (99%) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 56389fb1c8a..43997be8249 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -856,7 +856,6 @@ config ARCH_CHIP_CXD56XX select ARCH_HAVE_MATH_H select ARCH_HAVE_I2CRESET select ARCH_HAVE_CUSTOM_TESTSET - select LIBC_ARCH_ATOMIC if SMP ---help--- Sony CXD56XX (ARM Cortex-M4) architectures @@ -948,7 +947,7 @@ config ARCH_CHIP_CXD32XX bool "Sony CXD32xx" select ARCH_CORTEXM4 select ARCH_HAVE_FPU - select LIBC_ARCH_ATOMIC + select LIBC_ATOMIC_IRQ ---help--- Sony CXD32XX (ARM Cortex-M4) architectures @@ -956,7 +955,6 @@ config ARCH_CHIP_HT32F491X3 bool "Holtek HT32F491x3" select ARCH_CORTEXM4 select ARCH_HAVE_FPU - select LIBC_ARCH_ATOMIC ---help--- Holtek HT32F491x3 (ARM Cortex-M4) architectures diff --git a/arch/renesas/Kconfig b/arch/renesas/Kconfig index d89cc1ead7a..543c084494f 100644 --- a/arch/renesas/Kconfig +++ b/arch/renesas/Kconfig @@ -62,6 +62,7 @@ config ARCH_RENESAS_RX default n select ARCH_HAVE_SETJMP select CYGWIN_WINTOOL if WINDOWS_CYGWIN + select LIBC_ATOMIC_IRQ config ARCH_RX65N bool diff --git a/arch/risc-v/Kconfig b/arch/risc-v/Kconfig index f134be00edb..4b8367a8321 100644 --- a/arch/risc-v/Kconfig +++ b/arch/risc-v/Kconfig @@ -82,6 +82,7 @@ config ARCH_CHIP_BL602 select ONESHOT_COUNT select ONESHOT_FAST_DIVISION select ALARM_ARCH + select LIBC_ATOMIC_IRQ ---help--- BouffaloLab BL602(rv32imfc) diff --git a/arch/xtensa/src/esp32/Kconfig b/arch/xtensa/src/esp32/Kconfig index 3836f0ac6bb..4084d7e346b 100644 --- a/arch/xtensa/src/esp32/Kconfig +++ b/arch/xtensa/src/esp32/Kconfig @@ -893,7 +893,7 @@ config ESP32_RTC_HEAP config ESP32_IRAM_HEAP bool "Use the rest of IRAM as a separate heap" select ARCH_HAVE_EXTRA_HEAPS - select LIBC_ARCH_ATOMIC + select LIBC_ATOMIC_IRQ select ARCH_USE_TEXT_HEAP default n diff --git a/boards/arm/am67/t3-gem-o1/configs/nsh/defconfig b/boards/arm/am67/t3-gem-o1/configs/nsh/defconfig index afe0185a0e0..3bf01e87314 100644 --- a/boards/arm/am67/t3-gem-o1/configs/nsh/defconfig +++ b/boards/arm/am67/t3-gem-o1/configs/nsh/defconfig @@ -30,7 +30,6 @@ CONFIG_FS_PROCFS=y CONFIG_HAVE_CXX=y CONFIG_HAVE_CXXINITIALIZE=y CONFIG_INIT_ENTRYPOINT="nsh_main" -CONFIG_LIBC_ARCH_ATOMIC=y CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_READLINE=y diff --git a/include/nuttx/atomic.h b/include/nuttx/atomic.h index 02fb266a428..d2ea13d9e44 100644 --- a/include/nuttx/atomic.h +++ b/include/nuttx/atomic.h @@ -36,7 +36,7 @@ # endif #endif -#if !defined(CONFIG_LIBC_ARCH_ATOMIC) +#if defined(CONFIG_LIBC_ATOMIC_TOOLCHAIN) # if __has_include() && defined(__cplusplus) extern "C++" { diff --git a/libs/libc/machine/CMakeLists.txt b/libs/libc/machine/CMakeLists.txt index 5f4869dc7d6..c31234ee048 100644 --- a/libs/libc/machine/CMakeLists.txt +++ b/libs/libc/machine/CMakeLists.txt @@ -22,7 +22,7 @@ add_subdirectory(${CONFIG_ARCH}) -target_sources(c PRIVATE arch_atomic.c) +target_sources(c PRIVATE arch_atomic_irq.c) if(CONFIG_MM_KASAN) target_sources(c PRIVATE arch_libc.c) diff --git a/libs/libc/machine/Kconfig b/libs/libc/machine/Kconfig index f89a42159f9..e07b9790c3b 100644 --- a/libs/libc/machine/Kconfig +++ b/libs/libc/machine/Kconfig @@ -9,13 +9,24 @@ menu "Architecture-Specific Support" -config LIBC_ARCH_ATOMIC - bool "arch_atomic" +config LIBC_ATOMIC_IRQ + bool default n ---help--- - If this configuration is selected and is - included, arch_atomic.c will be linked instead of built-in - atomic function. + atomic function by irq disable/enable + +config LIBC_ATOMIC_ARCH + bool + default n + ---help--- + arch_atomic by arch instruction + +config LIBC_ATOMIC_TOOLCHAIN + bool + default y if !LIBC_ATOMIC_IRQ && !LIBC_ATOMIC_ARCH + default n + ---help--- + atomic function from toolchain config ARCH_LOWPUTC bool "Low-level console output" diff --git a/libs/libc/machine/Make.defs b/libs/libc/machine/Make.defs index 73e34fecccb..149df32df17 100644 --- a/libs/libc/machine/Make.defs +++ b/libs/libc/machine/Make.defs @@ -20,7 +20,7 @@ # ############################################################################ -CSRCS += arch_atomic.c +CSRCS += arch_atomic_irq.c ifeq ($(CONFIG_MM_KASAN),y) CSRCS += arch_libc.c diff --git a/libs/libc/machine/arch_atomic.c b/libs/libc/machine/arch_atomic_irq.c similarity index 99% rename from libs/libc/machine/arch_atomic.c rename to libs/libc/machine/arch_atomic_irq.c index 12ff71f4b46..98c0aae5a1c 100644 --- a/libs/libc/machine/arch_atomic.c +++ b/libs/libc/machine/arch_atomic_irq.c @@ -1,5 +1,5 @@ /**************************************************************************** - * libs/libc/machine/arch_atomic.c + * libs/libc/machine/arch_atomic_irq.c * * SPDX-License-Identifier: Apache-2.0 * @@ -78,7 +78,7 @@ #define CMP_EXCHANGE(fn, n, type) \ \ bool weak_function CONCATENATE(fn, n)(FAR volatile void *mem, \ - FAR void *expect, \ + FAR volatile void *expect, \ type desired, bool weak, \ int success, int failure) \ { \ diff --git a/libs/libc/machine/tricore/CMakeLists.txt b/libs/libc/machine/tricore/CMakeLists.txt index b8d393cde8e..689da31505c 100644 --- a/libs/libc/machine/tricore/CMakeLists.txt +++ b/libs/libc/machine/tricore/CMakeLists.txt @@ -22,7 +22,10 @@ set(SRCS) -list(APPEND SRCS arch_atomic.c) +if(CONFIG_LIBC_ATOMIC_ARCH) + list(APPEND SRCS arch_atomic.c) +endif() + if(CONFIG_ARCH_SETJMP_H) list(APPEND SRCS arch_setjmp.c) endif() diff --git a/libs/libc/machine/tricore/Make.defs b/libs/libc/machine/tricore/Make.defs index c0dc5542ce0..b39fa5ac414 100644 --- a/libs/libc/machine/tricore/Make.defs +++ b/libs/libc/machine/tricore/Make.defs @@ -20,7 +20,10 @@ # ############################################################################ +ifeq ($(CONFIG_LIBC_ATOMIC_ARCH),y) CSRCS += arch_atomic.c +endif + ifeq ($(CONFIG_ARCH_SETJMP_H),y) CSRCS += arch_setjmp.c endif