From d35f1d97cdc095940c859af9c6ae995648f59bc2 Mon Sep 17 00:00:00 2001 From: Verkehrsrot Date: Wed, 24 Jul 2019 12:37:02 +0200 Subject: [PATCH] timesync i2c lock fixing --- include/globals.h | 2 +- src/main.cpp | 3 --- src/timesync.cpp | 13 +++++++------ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/include/globals.h b/include/globals.h index 55ee199e..9e8549e5 100644 --- a/include/globals.h +++ b/include/globals.h @@ -42,7 +42,7 @@ #define SCREEN_MODE (0x80) // I2C bus access control -#define I2C_MUTEX_LOCK() (xSemaphoreTake(I2Caccess, pdMS_TO_TICKS(2000)) == pdTRUE) +#define I2C_MUTEX_LOCK() (xSemaphoreTake(I2Caccess, pdMS_TO_TICKS(10)) == pdTRUE) #define I2C_MUTEX_UNLOCK() (xSemaphoreGive(I2Caccess)) // Struct holding devices's runtime configuration diff --git a/src/main.cpp b/src/main.cpp index f06eb6cd..3221a6f5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,9 +41,6 @@ IDLE 1 0 ESP32 arduino scheduler -> runs wifi channel rotator Low priority numbers denote low priority tasks. -Tasks using i2c bus all must have same priority, because using mutex semaphore -(irqhandler, bmeloop) - NOTE: Changing any timings will have impact on time accuracy of whole code. So don't do it if you do not own a digital oscilloscope. diff --git a/src/timesync.cpp b/src/timesync.cpp index b9656bcc..c3c78432 100644 --- a/src/timesync.cpp +++ b/src/timesync.cpp @@ -65,6 +65,7 @@ void process_timesync_req(void *taskparameter) { // wait until we are joined if we are not while (!LMIC.devaddr) { vTaskDelay(pdMS_TO_TICKS(3000)); + } // collect timestamp samples for (uint8_t i = 0; i < TIME_SYNC_SAMPLES; i++) { @@ -111,11 +112,11 @@ void process_timesync_req(void *taskparameter) { // lock I2C bus and application irq to ensure accurate timing mask_user_IRQ(); - if (!I2C_MUTEX_LOCK()) { - ESP_LOGW(TAG, "[%0.3f] Timesync handshake error: i2c bus locking failed", - millis() / 1000.0); - goto finish; // failure - } + //if (!I2C_MUTEX_LOCK()) { + // ESP_LOGW(TAG, "[%0.3f] Timesync handshake error: i2c bus locking failed", + // millis() / 1000.0); + // goto finish; // failure + //} // average time offset over all collected diffs time_offset_ms /= TIME_SYNC_SAMPLES; @@ -136,7 +137,7 @@ void process_timesync_req(void *taskparameter) { finish: // end of time critical section: release I2C bus and app irq - I2C_MUTEX_UNLOCK(); + //I2C_MUTEX_UNLOCK(); unmask_user_IRQ(); timeSyncPending = false;