@@ -88,6 +88,9 @@ STATIC_FASTRAM filter_t gyroLpfState[XYZ_AXIS_COUNT];
8888STATIC_FASTRAM filterApplyFnPtr gyroLpf2ApplyFn ;
8989STATIC_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+
9194STATIC_FASTRAM filterApplyFnPtr gyroLuluApplyFn ;
9295STATIC_FASTRAM filter_t gyroLuluState [XYZ_AXIS_COUNT ];
9396
@@ -293,6 +296,7 @@ static void gyroInitFilters(void)
293296bool 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