summaryrefslogtreecommitdiff
path: root/cc3200/mpthreadport.c
diff options
context:
space:
mode:
authorTony DiCola <tony@tonydicola.com>2016-10-20 23:01:13 +0000
committerTony DiCola <tony@tonydicola.com>2016-10-20 23:01:13 +0000
commit00a44fa36cd1e35a438c4b89b5cef0bc82787c7a (patch)
tree4800a6984902e043e3fc437adcdfcd665f83e220 /cc3200/mpthreadport.c
parent1f13f870b8f6554d9cd5570de221a6886e065b64 (diff)
parent3967ca7390ff8257728ef6237b93977b63bde41d (diff)
Merge remote-tracking branch 'micropython/master'
Conflicts: README.md - Kept Adafruit README.md intact. py/emitglue.c - Added xtensa architecture as an OR of the define. zephyr/README.md - Fixed spelling mistake.
Diffstat (limited to 'cc3200/mpthreadport.c')
-rw-r--r--cc3200/mpthreadport.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/cc3200/mpthreadport.c b/cc3200/mpthreadport.c
index 064aa6ba1..e77ac4ae5 100644
--- a/cc3200/mpthreadport.c
+++ b/cc3200/mpthreadport.c
@@ -28,10 +28,13 @@
#include "py/mpconfig.h"
#include "py/mpstate.h"
+#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
@@ -131,7 +134,7 @@ void mp_thread_create(void *(*entry)(void*), void *arg, size_t *stack_size) {
TaskHandle_t id = xTaskCreateStatic(freertos_entry, "Thread", *stack_size / sizeof(void*), arg, 2, stack, tcb);
if (id == NULL) {
mp_thread_mutex_unlock(&thread_mutex);
- nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "can't create thread"));
+ mp_raise_msg(&mp_type_OSError, "can't create thread");
}
// add thread to linked list of all threads
@@ -165,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