Fixed timing-dependent hang with M5 #282
Merged
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.
Under hard-to-predict conditions, M5 will hang the system. Here is the analysis:
Before the loop, protocol_auto_cycle_start() is called to make things run if there is anything in the planner.
Then the stepper runs and, if the segment is short, it might just finish with it by the time protocol_execute_realtime() is called, and if so, protocol_execute_realtime will see the rtCycleStop and set state to Idle.
The while will not exit the loop because plan_get_current_block() is still returning non-null, i.e. there are some planner blocks left. But since we are in idle state, there is no way to run them.
If you move the protocol_auto_cycle_start() inside the loop, it works.