timesync i2c lock fixing

This commit is contained in:
Verkehrsrot 2019-07-24 12:37:02 +02:00
parent 1982959314
commit d35f1d97cd
3 changed files with 8 additions and 10 deletions

View File

@ -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

View File

@ -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.

View File

@ -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;