summaryrefslogtreecommitdiff
path: root/src/kernel/ao_panic.c
diff options
context:
space:
mode:
authorBart Massey <bart@cs.pdx.edu>2016-03-05 17:38:19 -0800
committerKeith Packard <keithp@keithp.com>2016-03-07 13:54:47 -0800
commitd1af180c2d2a2caf1e13f00d83f2b86ba26de27f (patch)
tree766e27ba7ca5c85251aae14aa03a0b3194eb64fd /src/kernel/ao_panic.c
parent20d9286402b7da74fef9b7c98e79d13671f6c82b (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.c11
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