diff --git a/src/common/pico_sync/include/pico/mutex.h b/src/common/pico_sync/include/pico/mutex.h index e834dc513af60d2e9dd81f5d07b746692ee981ba..4f61ce28b53c75830a58fa135e857d75e1660a0f 100644 --- a/src/common/pico_sync/include/pico/mutex.h +++ b/src/common/pico_sync/include/pico/mutex.h @@ -289,7 +289,11 @@ static inline bool recursive_mutex_is_initialized(recursive_mutex_t *mtx) { * * But the initialization of the mutex is performed automatically during runtime initialization */ +#ifdef __cplusplus +#define auto_init_recursive_mutex(name) static __attribute__((section(".mutex_array"))) recursive_mutex_t name = { (spin_lock_t *)1 }; +#else #define auto_init_recursive_mutex(name) static __attribute__((section(".mutex_array"))) recursive_mutex_t name = { .core.spin_lock = (spin_lock_t *)1 /* marker for runtime_init */ } +#endif #ifdef __cplusplus } diff --git a/test/kitchen_sink/kitchen_sink.c b/test/kitchen_sink/kitchen_sink.c index f61ece363153672025adebb8d2bfd71b4d536cc4..e007ce9a8e4be294c6844af79963975b4ba70f8d 100644 --- a/test/kitchen_sink/kitchen_sink.c +++ b/test/kitchen_sink/kitchen_sink.c @@ -110,6 +110,9 @@ __force_inline int something_inlined(int x) { return x * 2; } +auto_init_mutex(mutex); +auto_init_recursive_mutex(recursive_mutex); + int main(void) { spiggle(); @@ -118,6 +121,12 @@ int main(void) { printf("HI %d\n", something_inlined((int)time_us_32())); puts("Hello Everything!"); puts("Hello Everything2!"); + + assert(mutex_try_enter(&mutex, NULL)); + assert(!mutex_try_enter(&mutex, NULL)); + assert(recursive_mutex_try_enter(&recursive_mutex, NULL)); + assert(recursive_mutex_try_enter(&recursive_mutex, NULL)); // this should compile as we are Cortex M0+ __asm volatile("SVC #3"); + }