Skip to content

Commit 15e118f

Browse files
authored
Merge pull request iNavFlight#11398 from iNavFlight/dzikuvx-gyro-optimizations
Eliminates: 1 function call + internal state check per gyro sample
2 parents 8f9fc23 + 7119138 commit 15e118f

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

src/main/sensors/gyro.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ STATIC_FASTRAM filter_t gyroLpfState[XYZ_AXIS_COUNT];
8888
STATIC_FASTRAM filterApplyFnPtr gyroLpf2ApplyFn;
8989
STATIC_FASTRAM filter_t gyroLpf2State[XYZ_AXIS_COUNT];
9090

91+
// Cached calibration status to eliminate function call in hot path
92+
STATIC_FASTRAM bool gyroCalibrationComplete;
93+
9194
STATIC_FASTRAM filterApplyFnPtr gyroLuluApplyFn;
9295
STATIC_FASTRAM filter_t gyroLuluState[XYZ_AXIS_COUNT];
9396

@@ -293,6 +296,7 @@ static void gyroInitFilters(void)
293296
bool gyroInit(void)
294297
{
295298
memset(&gyro, 0, sizeof(gyro));
299+
gyroCalibrationComplete = false;
296300

297301
// Set inertial sensor tag (for dual-gyro selection)
298302
#ifdef USE_DUAL_GYRO
@@ -352,6 +356,7 @@ void gyroStartCalibration(void)
352356
}
353357
#endif
354358

359+
gyroCalibrationComplete = false;
355360
zeroCalibrationStartV(&gyroCalibration[0], CALIBRATING_GYRO_TIME_MS, CALIBRATING_GYRO_MORON_THRESHOLD, false);
356361
}
357362

@@ -392,6 +397,9 @@ STATIC_UNIT_TESTED void performGyroCalibration(gyroDev_t *dev, zeroCalibrationVe
392397
setGyroCalibration(dev->gyroZero);
393398
#endif
394399

400+
// Cache completion status to avoid function call in hot path
401+
gyroCalibrationComplete = true;
402+
395403
LOG_DEBUG(GYRO, "Gyro calibration complete (%d, %d, %d)", (int16_t) dev->gyroZero[X], (int16_t) dev->gyroZero[Y], (int16_t) dev->gyroZero[Z]);
396404
schedulerResetTaskStatistics(TASK_SELF); // so calibration cycles do not pollute tasks statistics
397405
} else {
@@ -421,14 +429,16 @@ static bool FAST_CODE NOINLINE gyroUpdateAndCalibrate(gyroDev_t * gyroDev, zeroC
421429
if (!gyroConfig()->init_gyro_cal_enabled) {
422430
// marks that the gyro calibration has ended
423431
gyroCalibration[0].params.state = ZERO_CALIBRATION_DONE;
432+
gyroCalibrationComplete = true;
424433
// pass the calibration values
425434
gyroDev->gyroZero[X] = gyroConfig()->gyro_zero_cal[X];
426435
gyroDev->gyroZero[Y] = gyroConfig()->gyro_zero_cal[Y];
427436
gyroDev->gyroZero[Z] = gyroConfig()->gyro_zero_cal[Z];
428437
}
429438
#endif
430439

431-
if (zeroCalibrationIsCompleteV(gyroCal)) {
440+
// Use cached status to avoid function call in hot path
441+
if (gyroCalibrationComplete) {
432442
float gyroADCtmp[XYZ_AXIS_COUNT];
433443

434444
//Apply zero calibration with CMSIS DSP

0 commit comments

Comments
 (0)