Reduce CPU overhead by rate-limiting updateArmingStatus() to 200 Hz#11200
Merged
sensei-hacker merged 1 commit intoiNavFlight:maintenance-9.xfrom Feb 18, 2026
Merged
Conversation
The updateArmingStatus() function performs 20+ safety checks (GPS fix, battery voltage, sensor health, LED updates, etc.) that don't need millisecond-level updates. Previously called every PID loop iteration (2000 Hz), now rate-limited to 200 Hz. Testing on AT32F435 hardware showed 10-13% PID loop performance improvement with no functional impact. 200 Hz (5ms response time) is well within human reaction time (~200ms) and exceeds the update rate of the sensors being checked (GPS: 5-10 Hz, battery: slow).
Contributor
ⓘ Your approaching your monthly quota for Qodo. Upgrade your plan PR Compliance Guide 🔍All compliance sections have been disabled in the configurations. |
Comment on lines
+947
to
+951
| static uint8_t armingStatusDivider = 0; | ||
| if (++armingStatusDivider >= 10) { | ||
| armingStatusDivider = 0; | ||
| updateArmingStatus(); | ||
| } |
Contributor
There was a problem hiding this comment.
Suggestion: Replace the iteration-based counter with a time-based check using currentTimeUs to ensure updateArmingStatus() runs at a consistent 200 Hz. [general, importance: 7]
Suggested change
| static uint8_t armingStatusDivider = 0; | |
| if (++armingStatusDivider >= 10) { | |
| armingStatusDivider = 0; | |
| updateArmingStatus(); | |
| } | |
| static timeUs_t lastArmingStatusTimeUs = 0; | |
| if ((int32_t)(currentTimeUs - lastArmingStatusTimeUs) >= 5000) { | |
| lastArmingStatusTimeUs = currentTimeUs; | |
| updateArmingStatus(); | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
User description
Summary
Rate-limit
updateArmingStatus()from every PID loop iteration (2000 Hz) to 200 Hz, reducing CPU overhead by 10-13%.Changes
updateArmingStatus()every 10th PID loop iterationRationale
The
updateArmingStatus()function performs 20+ safety checks (GPS fix quality, battery voltage, sensor health, failsafe status, LED indicators) that don't require millisecond-level updates:Testing
Tested on AT32F435 hardware (BLUEBERRYF435WING):
All arming safety checks, LED indicators, and mode switching remain fully functional.
Impact
PR Type
Enhancement
Description
Rate-limit updateArmingStatus() from 2000 Hz to 200 Hz
Reduces CPU overhead by 10-13% on PID loop execution
Maintains all safety checks and functional behavior
No configuration changes or breaking changes required
Diagram Walkthrough
File Walkthrough
fc_core.c
Implement rate divider for updateArmingStatus() functionsrc/main/fc/fc_core.c
every iteration