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) #define SCREEN_MODE (0x80)
// I2C bus access control // 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)) #define I2C_MUTEX_UNLOCK() (xSemaphoreGive(I2Caccess))
// Struct holding devices's runtime configuration // 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. 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. 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. 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 // wait until we are joined if we are not
while (!LMIC.devaddr) { while (!LMIC.devaddr) {
vTaskDelay(pdMS_TO_TICKS(3000)); vTaskDelay(pdMS_TO_TICKS(3000));
}
// collect timestamp samples // collect timestamp samples
for (uint8_t i = 0; i < TIME_SYNC_SAMPLES; i++) { 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 // lock I2C bus and application irq to ensure accurate timing
mask_user_IRQ(); mask_user_IRQ();
if (!I2C_MUTEX_LOCK()) { //if (!I2C_MUTEX_LOCK()) {
ESP_LOGW(TAG, "[%0.3f] Timesync handshake error: i2c bus locking failed", // ESP_LOGW(TAG, "[%0.3f] Timesync handshake error: i2c bus locking failed",
millis() / 1000.0); // millis() / 1000.0);
goto finish; // failure // goto finish; // failure
} //}
// average time offset over all collected diffs // average time offset over all collected diffs
time_offset_ms /= TIME_SYNC_SAMPLES; time_offset_ms /= TIME_SYNC_SAMPLES;
@ -136,7 +137,7 @@ void process_timesync_req(void *taskparameter) {
finish: finish:
// end of time critical section: release I2C bus and app irq // end of time critical section: release I2C bus and app irq
I2C_MUTEX_UNLOCK(); //I2C_MUTEX_UNLOCK();
unmask_user_IRQ(); unmask_user_IRQ();
timeSyncPending = false; timeSyncPending = false;