/* * Copyright (c) 2024 Raspberry Pi (Trading) Ltd. * Copyright (c) 2024 Stephen Street (stephen@redrocketcomputing.com). * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef __STDATOMIC_H #define __STDATOMIC_H #ifdef __cplusplus extern "C" { #endif /** \file stdatomic.h * \defgroup pico_atomic pico_atomic * * \brief Helper implementations for C11 atomics * * \if rp2040_specific * On RP2040 a spin lock is used as protection for all atomic operations, since there is no C library support. * \endif * * \if rp2350_specific * On RP2350 the C-library provides implementations for all 1-byte, 2-byte and 4-byte atomics using processor * exclusive operations. This library provides a spin-lock protected version for arbitrary-sized atomics (including 64-bit). * \endif */ #include #include_next // needed for PICO_C_COMPILER_IS_GNU #include "pico.h" #if PICO_RP2040 && PICO_C_COMPILER_IS_GNU // on GNU without exclusive instructions these don't get routed thru _1 functions for some reason #undef atomic_flag_test_and_set #undef atomic_flag_test_and_set_explicit extern _Bool __atomic_test_and_set_c(volatile void *mem, int model); #define atomic_flag_test_and_set(PTR) __atomic_test_and_set_c((PTR), __ATOMIC_SEQ_CST) #define atomic_flag_test_and_set_explicit(PTR, MO) __atomic_test_and_set_c((PTR), (MO)) #endif #ifdef __cplusplus } #endif #endif