diff --git a/src/drivers/imu/invensense/icm20602/ICM20602.cpp b/src/drivers/imu/invensense/icm20602/ICM20602.cpp index 49d91d8c9d..ca559cd503 100644 --- a/src/drivers/imu/invensense/icm20602/ICM20602.cpp +++ b/src/drivers/imu/invensense/icm20602/ICM20602.cpp @@ -277,12 +277,19 @@ void ICM20602::RunImpl() timestamp_sample -= extra_samples * static_cast(FIFO_SAMPLE_DT); samples = _fifo_gyro_samples; - ScheduleOnInterval(_fifo_empty_interval_us, - _fifo_empty_interval_us - (extra_samples * FIFO_SAMPLE_DT)); + if (_fifo_gyro_samples > extra_samples) { + // reschedule to run when a total of _fifo_gyro_samples should be available in the FIFO + const uint32_t reschedule_delay_us = (_fifo_gyro_samples - extra_samples) * static_cast(FIFO_SAMPLE_DT); + ScheduleOnInterval(_fifo_empty_interval_us, reschedule_delay_us); + + } else { + // otherwise reschedule to run immediately + ScheduleOnInterval(_fifo_empty_interval_us); + } } else if (samples < _fifo_gyro_samples) { // reschedule next cycle to catch the desired number of samples - ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * FIFO_SAMPLE_DT); + ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * static_cast(FIFO_SAMPLE_DT)); } } } diff --git a/src/drivers/imu/invensense/icm20649/ICM20649.cpp b/src/drivers/imu/invensense/icm20649/ICM20649.cpp index 5c56abfee9..434c5e7e8b 100644 --- a/src/drivers/imu/invensense/icm20649/ICM20649.cpp +++ b/src/drivers/imu/invensense/icm20649/ICM20649.cpp @@ -232,12 +232,19 @@ void ICM20649::RunImpl() timestamp_sample -= extra_samples * static_cast(FIFO_SAMPLE_DT); samples = _fifo_gyro_samples; - ScheduleOnInterval(_fifo_empty_interval_us, - _fifo_empty_interval_us - (extra_samples * FIFO_SAMPLE_DT)); + if (_fifo_gyro_samples > extra_samples) { + // reschedule to run when a total of _fifo_gyro_samples should be available in the FIFO + const uint32_t reschedule_delay_us = (_fifo_gyro_samples - extra_samples) * static_cast(FIFO_SAMPLE_DT); + ScheduleOnInterval(_fifo_empty_interval_us, reschedule_delay_us); + + } else { + // otherwise reschedule to run immediately + ScheduleOnInterval(_fifo_empty_interval_us); + } } else if (samples < _fifo_gyro_samples) { // reschedule next cycle to catch the desired number of samples - ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * FIFO_SAMPLE_DT); + ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * static_cast(FIFO_SAMPLE_DT)); } if (samples == _fifo_gyro_samples) { diff --git a/src/drivers/imu/invensense/icm20948/ICM20948.cpp b/src/drivers/imu/invensense/icm20948/ICM20948.cpp index fff65ac893..95f863560e 100644 --- a/src/drivers/imu/invensense/icm20948/ICM20948.cpp +++ b/src/drivers/imu/invensense/icm20948/ICM20948.cpp @@ -268,12 +268,19 @@ void ICM20948::RunImpl() timestamp_sample -= extra_samples * static_cast(FIFO_SAMPLE_DT); samples = _fifo_gyro_samples; - ScheduleOnInterval(_fifo_empty_interval_us, - _fifo_empty_interval_us - (extra_samples * FIFO_SAMPLE_DT)); + if (_fifo_gyro_samples > extra_samples) { + // reschedule to run when a total of _fifo_gyro_samples should be available in the FIFO + const uint32_t reschedule_delay_us = (_fifo_gyro_samples - extra_samples) * static_cast(FIFO_SAMPLE_DT); + ScheduleOnInterval(_fifo_empty_interval_us, reschedule_delay_us); + + } else { + // otherwise reschedule to run immediately + ScheduleOnInterval(_fifo_empty_interval_us); + } } else if (samples < _fifo_gyro_samples) { // reschedule next cycle to catch the desired number of samples - ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * FIFO_SAMPLE_DT); + ScheduleOnInterval(_fifo_empty_interval_us, (_fifo_gyro_samples - samples) * static_cast(FIFO_SAMPLE_DT)); } if (samples == _fifo_gyro_samples) {