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_ignite.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_ignite.c')
| -rw-r--r-- | src/core/ao_ignite.c | 10 | 
1 files changed, 6 insertions, 4 deletions
| diff --git a/src/core/ao_ignite.c b/src/core/ao_ignite.c index c7829fc3..693b7c7a 100644 --- a/src/core/ao_ignite.c +++ b/src/core/ao_ignite.c @@ -21,10 +21,12 @@  __xdata struct ao_ignition ao_ignition[2];  void -ao_ignite(enum ao_igniter igniter) __critical +ao_ignite(enum ao_igniter igniter)  { +	cli();  	ao_ignition[igniter].request = 1;  	ao_wakeup(&ao_ignition); +	sei();  }  #ifndef AO_SENSE_DROGUE @@ -39,12 +41,12 @@ ao_igniter_status(enum ao_igniter igniter)  	__pdata int16_t value;  	__pdata uint8_t request, firing, fired; -	__critical { +	ao_arch_critical(  		ao_data_get(&packet);  		request = ao_ignition[igniter].request;  		fired = ao_ignition[igniter].fired;  		firing = ao_ignition[igniter].firing; -	} +		);  	if (firing || (request && !fired))  		return ao_igniter_active; @@ -79,7 +81,7 @@ ao_igniter_status(enum ao_igniter igniter)  #endif  void -ao_igniter_fire(enum ao_igniter igniter) __critical +ao_igniter_fire(enum ao_igniter igniter)  {  	ao_ignition[igniter].firing = 1;  	switch(ao_config.ignite_mode) { | 
