diff --git a/epicardium/modules/mutex.c b/epicardium/modules/mutex.c
index 9d58eec080977d93f69f275350a5101a15d4a64b..4fa3eacf93e42a4ba1da5aaada9f660fb0f33b9c 100644
--- a/epicardium/modules/mutex.c
+++ b/epicardium/modules/mutex.c
@@ -23,6 +23,9 @@ void _mutex_create(struct mutex *m, const char *name)
 
 void mutex_lock(struct mutex *m)
 {
+	if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) {
+		return;
+	}
 	int ret = xSemaphoreTake(m->_rtos_mutex, portMAX_DELAY);
 
 	/* Ensure locking was actually successful */
@@ -31,12 +34,18 @@ void mutex_lock(struct mutex *m)
 
 bool mutex_trylock(struct mutex *m)
 {
+	if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) {
+		return true;
+	}
 	int ret = xSemaphoreTake(m->_rtos_mutex, 0);
 	return ret == pdTRUE;
 }
 
 void mutex_unlock(struct mutex *m)
 {
+	if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) {
+		return;
+	}
 	/* Ensure that only the owner can unlock a mutex */
 	assert(mutex_get_owner(m) == xTaskGetCurrentTaskHandle());