SITL: fixed a interrupt recursion bug

this can be triggered by the timer scheduler re-enabling interrupts
This commit is contained in:
Andrew Tridgell 2012-11-20 22:29:26 +11:00
parent 3c88b0d204
commit ccb1f1722e
1 changed files with 8 additions and 6 deletions

View File

@ -232,6 +232,7 @@ static void timer_handler(int signum)
if (_interrupts_are_blocked()) { if (_interrupts_are_blocked()) {
return; return;
} }
uint8_t oldSREG = SREG;
cli(); cli();
#ifndef __CYGWIN__ #ifndef __CYGWIN__
@ -255,9 +256,6 @@ static void timer_handler(int signum)
/* check for packet from flight sim */ /* check for packet from flight sim */
sitl_fdm_input(); sitl_fdm_input();
// trigger all timers
timer_scheduler.run();
// trigger RC input // trigger RC input
if (isr_registry._registry[ISR_REGISTRY_TIMER4_CAPT]) { if (isr_registry._registry[ISR_REGISTRY_TIMER4_CAPT]) {
isr_registry._registry[ISR_REGISTRY_TIMER4_CAPT](); isr_registry._registry[ISR_REGISTRY_TIMER4_CAPT]();
@ -268,12 +266,12 @@ static void timer_handler(int signum)
if (update_count == 0) { if (update_count == 0) {
sitl_update_gps(0, 0, 0, 0, 0, false); sitl_update_gps(0, 0, 0, 0, 0, false);
sei(); SREG = oldSREG;
return; return;
} }
if (update_count == last_update_count) { if (update_count == last_update_count) {
sei(); SREG = oldSREG;
return; return;
} }
last_update_count = update_count; last_update_count = update_count;
@ -292,7 +290,11 @@ static void timer_handler(int signum)
// so the ADC code doesn't get stuck // so the ADC code doesn't get stuck
ADCSRA &= ~_BV(ADSC); ADCSRA &= ~_BV(ADSC);
sei(); // trigger all APM timers. We do this last as it can re-enable
// interrupts, which can lead to recursion
timer_scheduler.run();
SREG = oldSREG;
} }