summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/circuitpy_mpconfig.h4
-rw-r--r--supervisor/shared/tick.c12
-rw-r--r--supervisor/shared/tick.h1
3 files changed, 15 insertions, 2 deletions
diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h
index 7853e4de9..3e83d0c51 100644
--- a/py/circuitpy_mpconfig.h
+++ b/py/circuitpy_mpconfig.h
@@ -653,8 +653,8 @@ extern const struct _mp_obj_module_t ustack_module;
FLASH_ROOT_POINTERS \
NETWORK_ROOT_POINTERS \
-void run_background_tasks(void);
-#define RUN_BACKGROUND_TASKS (run_background_tasks())
+void supervisor_run_background_tasks_if_tick(void);
+#define RUN_BACKGROUND_TASKS (supervisor_run_background_tasks_if_tick())
// TODO: Used in wiznet5k driver, but may not be needed in the long run.
#define MICROPY_THREAD_YIELD()
diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c
index d4a6ac5d7..7dc5a52d3 100644
--- a/supervisor/shared/tick.c
+++ b/supervisor/shared/tick.c
@@ -24,10 +24,13 @@
* THE SOFTWARE.
*/
+#include <stdatomic.h>
+
#include "supervisor/shared/tick.h"
#include "supervisor/filesystem.h"
#include "supervisor/shared/autoreload.h"
+static atomic_bool tick_up;
static volatile uint64_t ticks_ms;
#if CIRCUITPY_GAMEPAD
@@ -44,6 +47,7 @@ void supervisor_tick(void) {
ticks_ms ++;
+ atomic_store(&tick_up, true);
#if CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS > 0
filesystem_tick();
@@ -74,3 +78,11 @@ uint64_t supervisor_ticks_ms64() {
uint32_t supervisor_ticks_ms32() {
return ticks_ms;
}
+
+extern void run_background_tasks(void);
+
+void supervisor_run_background_tasks_if_tick() {
+ if (atomic_exchange(&tick_up, false)) {
+ run_background_tasks();
+ }
+}
diff --git a/supervisor/shared/tick.h b/supervisor/shared/tick.h
index 3defeb108..b66273449 100644
--- a/supervisor/shared/tick.h
+++ b/supervisor/shared/tick.h
@@ -33,5 +33,6 @@
extern void supervisor_tick(void);
extern uint32_t supervisor_ticks_ms32(void);
extern uint64_t supervisor_ticks_ms64(void);
+extern void supervisor_run_background_if_tick(void);
#endif