Prevent re-entering of temperature ISR
If Marlin is inside the temperature ISR, the stepper ISR is enabled. If a stepper event is now happening Marlin will proceed with the stepper ISR. Now, at the end of the stepper ISR, the temperatre ISR gets enabled again. While Marlin proceed the rest of the temperature ISR, it's now vulnerable to a second ISR call.
This commit is contained in:
parent
1b59766fcb
commit
271ced7341
2 changed files with 12 additions and 1 deletions
|
@ -1483,7 +1483,14 @@ void Temperature::set_current_temp_raw() {
|
|||
*/
|
||||
ISR(TIMER0_COMPB_vect) { Temperature::isr(); }
|
||||
|
||||
volatile bool Temperature::in_temp_isr = false;
|
||||
|
||||
void Temperature::isr() {
|
||||
// The stepper ISR can interrupt this ISR. When it does it re-enables this ISR
|
||||
// at the end of its run, potentially causing re-entry. This flag prevents it.
|
||||
if (in_temp_isr) return;
|
||||
in_temp_isr = true;
|
||||
|
||||
// Allow UART and stepper ISRs
|
||||
CBI(TIMSK0, OCIE0B); //Disable Temperature ISR
|
||||
sei();
|
||||
|
@ -1949,5 +1956,7 @@ void Temperature::isr() {
|
|||
}
|
||||
#endif
|
||||
|
||||
cli();
|
||||
in_temp_isr = false;
|
||||
SBI(TIMSK0, OCIE0B); //re-enable Temperature ISR
|
||||
}
|
||||
|
|
|
@ -61,6 +61,8 @@ class Temperature {
|
|||
current_temperature_bed_raw,
|
||||
target_temperature_bed;
|
||||
|
||||
static volatile bool in_temp_isr;
|
||||
|
||||
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
|
||||
static float redundant_temperature;
|
||||
#endif
|
||||
|
|
Reference in a new issue