From b4f76e5c8e8666cd9b6c5e75ba59840956ea74ab Mon Sep 17 00:00:00 2001 From: Terraneo Federico <fede.tft@miosix.org> Date: Sun, 25 Jun 2023 20:23:06 +0200 Subject: [PATCH] Fix Cortex M0 atomic ops missing memory barrier, that caused the testsuite to fail --- miosix/_tools/testsuite/testsuite.cpp | 5 +++++ miosix/arch/common/core/atomic_ops_impl_cortexM0.h | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/miosix/_tools/testsuite/testsuite.cpp b/miosix/_tools/testsuite/testsuite.cpp index eae23111..9cfeb7fa 100644 --- a/miosix/_tools/testsuite/testsuite.cpp +++ b/miosix/_tools/testsuite/testsuite.cpp @@ -3401,7 +3401,12 @@ static void test_22() bool error=false; Thread *t2=Thread::create(t22_t2,STACK_MIN,0,0,Thread::JOINABLE); { + #if __CORTEX_M != 0x00 FastInterruptDisableLock dLock; + #else + //Cortex M0 does not have atomic ops, they are emulated by disabling IRQ + InterruptDisableLock dLock; + #endif t22_v5=false; int x=10; diff --git a/miosix/arch/common/core/atomic_ops_impl_cortexM0.h b/miosix/arch/common/core/atomic_ops_impl_cortexM0.h index 3890aca4..8210b695 100644 --- a/miosix/arch/common/core/atomic_ops_impl_cortexM0.h +++ b/miosix/arch/common/core/atomic_ops_impl_cortexM0.h @@ -51,7 +51,7 @@ inline int atomicSwap(volatile int *p, int v) int result = *p; *p = v; enableInterrupts(); - + asm volatile("":::"memory"); return result; } @@ -60,6 +60,7 @@ inline void atomicAdd(volatile int *p, int incr) disableInterrupts(); *p += incr; enableInterrupts(); + asm volatile("":::"memory"); } inline int atomicAddExchange(volatile int *p, int incr) @@ -68,7 +69,7 @@ inline int atomicAddExchange(volatile int *p, int incr) int result = *p; *p += incr; enableInterrupts(); - + asm volatile("":::"memory"); return result; } @@ -78,7 +79,7 @@ inline int atomicCompareAndSwap(volatile int *p, int prev, int next) int result = *p; if(*p == prev) *p = next; enableInterrupts(); - + asm volatile("":::"memory"); return result; } @@ -95,6 +96,7 @@ inline void *atomicFetchAndIncrement(void * const volatile * p, int offset, volatile uint32_t *pt = reinterpret_cast<uint32_t*>(result) + offset; *pt += incr; enableInterrupts(); + asm volatile("":::"memory"); return result; } -- GitLab