summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--cc3200/mpthreadport.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/cc3200/mpthreadport.c b/cc3200/mpthreadport.c
index dd02180982..e77ac4ae53 100644
--- a/cc3200/mpthreadport.c
+++ b/cc3200/mpthreadport.c
@@ -31,8 +31,10 @@
#include "py/runtime.h"
#include "py/gc.h"
#include "py/mpthread.h"
+#include "py/mphal.h"
#include "mptask.h"
#include "task.h"
+#include "irq.h"
#if MICROPY_PY_THREAD
@@ -166,14 +168,23 @@ void mp_thread_mutex_init(mp_thread_mutex_t *mutex) {
mutex->handle = xSemaphoreCreateMutexStatic(&mutex->buffer);
}
+// To allow hard interrupts to work with threading we only take/give the semaphore
+// if we are not within an interrupt context and interrupts are enabled.
+
int mp_thread_mutex_lock(mp_thread_mutex_t *mutex, int wait) {
- int ret = xSemaphoreTake(mutex->handle, wait ? portMAX_DELAY : 0);
- return ret == pdTRUE;
+ if ((HAL_NVIC_INT_CTRL_REG & HAL_VECTACTIVE_MASK) == 0 && query_irq() == IRQ_STATE_ENABLED) {
+ int ret = xSemaphoreTake(mutex->handle, wait ? portMAX_DELAY : 0);
+ return ret == pdTRUE;
+ } else {
+ return 1;
+ }
}
void mp_thread_mutex_unlock(mp_thread_mutex_t *mutex) {
- xSemaphoreGive(mutex->handle);
- // TODO check return value
+ if ((HAL_NVIC_INT_CTRL_REG & HAL_VECTACTIVE_MASK) == 0 && query_irq() == IRQ_STATE_ENABLED) {
+ xSemaphoreGive(mutex->handle);
+ // TODO check return value
+ }
}
#endif // MICROPY_PY_THREAD