diff options
author | Keith Packard <keithp@keithp.com> | 2012-10-24 22:35:32 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2012-10-25 00:07:14 -0700 |
commit | e80fa6de4ccc5c4851eab9fb941f9282d2e3eb16 (patch) | |
tree | 716c76a2a0aae0ade116f1c9d959d68fedeb112a /src/core/ao_panic.c | |
parent | b119e19604aa557a40e848c60d98a67b5f259bbd (diff) |
altos: Replace __critical usage with ao_arch_critical as needed
sdcc offers __critical as a machine-independent way to block
interrupts, but as gcc doesn't, we need to use a compiler-independent
construct instead. ao_arch_critical has been around since the AVR
port, but some old __critical usages remained.
This fixes a bunch of random hangs when communicating with MM over USB
or the radio as the various stdio loops were running without
interrupts blocked between the test and the sleep.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/core/ao_panic.c')
-rw-r--r-- | src/core/ao_panic.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/core/ao_panic.c b/src/core/ao_panic.c index 3c0b471e..c29cd8fe 100644 --- a/src/core/ao_panic.c +++ b/src/core/ao_panic.c @@ -53,7 +53,8 @@ ao_panic(uint8_t reason) ao_cur_task = NULL; printf ("panic %d\n", reason); #endif - __critical for (;;) { + ao_arch_block_interrupts(); + for (;;) { ao_panic_delay(20); for (n = 0; n < 5; n++) { ao_led_on(AO_LED_PANIC); |