diff options
author | Bart Massey <bart@cs.pdx.edu> | 2016-03-05 17:38:19 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2016-03-07 13:54:47 -0800 |
commit | d1af180c2d2a2caf1e13f00d83f2b86ba26de27f (patch) | |
tree | 766e27ba7ca5c85251aae14aa03a0b3194eb64fd /src/kernel/ao_panic.c | |
parent | 20d9286402b7da74fef9b7c98e79d13671f6c82b (diff) |
altos: Fixed timing of panic display LED to be readable
When we don't have a beeper, there's no way to signal a 'warble' for
panic. So, elide that bit.
Second, panic can't use the scheduler and timer because those may not
be running (or may have failed), and so it uses a delay loop. Add a
configurable scale value to the panic loop so that the LED blinks can
be read. For stm32f0 devices, scale that by the sysclk value to
automatically make them of reasonable length.
Diffstat (limited to 'src/kernel/ao_panic.c')
-rw-r--r-- | src/kernel/ao_panic.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/kernel/ao_panic.c b/src/kernel/ao_panic.c index c29cd8fe..e280f98c 100644 --- a/src/kernel/ao_panic.c +++ b/src/kernel/ao_panic.c @@ -38,10 +38,15 @@ ao_panic_delay(uint8_t n) { uint8_t i = 0, j = 0; - while (n--) + while (n--) { +#ifdef AO_PANIC_DELAY_SCALE + uint8_t s = AO_PANIC_DELAY_SCALE; + while (s--) +#endif while (--j) while (--i) ao_arch_nop(); + } } void @@ -56,16 +61,16 @@ ao_panic(uint8_t reason) ao_arch_block_interrupts(); for (;;) { ao_panic_delay(20); +#if HAS_BEEP for (n = 0; n < 5; n++) { - ao_led_on(AO_LED_PANIC); ao_beep(AO_BEEP_HIGH); ao_panic_delay(1); - ao_led_off(AO_LED_PANIC); ao_beep(AO_BEEP_LOW); ao_panic_delay(1); } ao_beep(AO_BEEP_OFF); ao_panic_delay(2); +#endif #ifdef SDCC #pragma disable_warning 126 |