30
30
#include "py/mpthread.h"
31
31
#include "pico/stdlib.h"
32
32
#include "pico/multicore.h"
33
+ #include "mutex_extra.h"
33
34
34
35
#if MICROPY_PY_THREAD
35
36
@@ -45,34 +46,31 @@ STATIC uint32_t *core1_stack = NULL;
45
46
STATIC size_t core1_stack_num_words = 0 ;
46
47
47
48
// Thread mutex.
48
- STATIC recursive_mutex_t atomic_mutex ;
49
- STATIC unsignedint atomic_taken ;
49
+ STATIC mutex_t atomic_mutex ;
50
50
51
51
uint32_t mp_thread_begin_atomic_section (void ) {
52
52
if (core1_entry ) {
53
53
// When both cores are executing, we also need to provide
54
54
// full mutual exclusion.
55
- recursive_mutex_enter_blocking (& atomic_mutex );
56
- ++ atomic_taken ;
55
+ return mutex_enter_blocking_and_disable_interrupts (& atomic_mutex );
56
+ }else {
57
+ return save_and_disable_interrupts ();
57
58
}
58
-
59
- return save_and_disable_interrupts ();
60
59
}
61
60
62
61
void mp_thread_end_atomic_section (uint32_t state ) {
63
- restore_interrupts (state );
64
-
65
- if (atomic_taken ) {
66
- -- atomic_taken ;
67
- recursive_mutex_exit (& atomic_mutex );
62
+ if (atomic_mutex .owner != LOCK_INVALID_OWNER_ID ) {
63
+ mutex_exit_and_restore_interrupts (& atomic_mutex ,state );
64
+ }else {
65
+ restore_interrupts (state );
68
66
}
69
67
}
70
68
71
69
// Initialise threading support.
72
70
void mp_thread_init (void ) {
73
71
assert (get_core_num ()== 0 );
74
72
75
- recursive_mutex_init (& atomic_mutex );
73
+ mutex_init (& atomic_mutex );
76
74
77
75
// Allow MICROPY_BEGIN_ATOMIC_SECTION to be invoked from core1.
78
76
multicore_lockout_victim_init ();