diff options
| author | Keith Packard <keithp@keithp.com> | 2013-04-22 20:27:52 -0500 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2013-05-07 20:16:53 -0700 | 
| commit | 8d0f4bc23eae4f1e085bfb853c995f1fb6b8b594 (patch) | |
| tree | 11576a81b918dea9849e461a0771e74699903c4f | |
| parent | 6f3bbb11880f45284f1f094990ffa32a66bf4560 (diff) | |
altos: Eliminate stdio looping when system has a single stdio source
No need to loop if there's only one
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | src/avr/ao_avr_stdio.c | 11 | ||||
| -rw-r--r-- | src/core/ao_stdio.c | 17 | 
2 files changed, 18 insertions, 10 deletions
diff --git a/src/avr/ao_avr_stdio.c b/src/avr/ao_avr_stdio.c index 2765853a..f9c0f88c 100644 --- a/src/avr/ao_avr_stdio.c +++ b/src/avr/ao_avr_stdio.c @@ -20,16 +20,7 @@  int  stdio_put(char c, FILE *stream)  { -	if (ao_cur_task && ao_num_stdios) -		putchar(c); -	else -	{ -		if (c == '\n') -			stdio_put('\r', stream); -		loop_until_bit_is_set(UCSR1A, UDRE1); -		UDR1 = c; -	} - +	putchar(c);  	return 0;  } diff --git a/src/core/ao_stdio.c b/src/core/ao_stdio.c index 977d74b1..cd144d6b 100644 --- a/src/core/ao_stdio.c +++ b/src/core/ao_stdio.c @@ -66,8 +66,15 @@  #define AO_NUM_STDIOS	(HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN)  __xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS]; + +#if AO_NUM_STDIOS > 1  __pdata int8_t ao_cur_stdio;  __pdata int8_t ao_num_stdios; +#else +__pdata int8_t ao_cur_stdio; +#define ao_cur_stdio	0 +#define ao_num_stdios	0 +#endif  void  putchar(char c) @@ -107,12 +114,16 @@ getchar(void) __reentrant  		c = ao_stdios[stdio]._pollchar();  		if (c != AO_READ_AGAIN)  			break; +#if AO_NUM_STDIOS > 1  		if (++stdio == ao_num_stdios)  			stdio = 0;  		if (stdio == ao_cur_stdio) +#endif  			ao_sleep(&ao_stdin_ready);  	} +#if AO_NUM_STDIOS > 1  	ao_cur_stdio = stdio; +#endif  	ao_arch_release_interrupts();  	return c;  } @@ -128,11 +139,17 @@ ao_add_stdio(int (*_pollchar)(void),  	     void (*putchar)(char),  	     void (*flush)(void)) __reentrant  { +#if AO_NUM_STDIOS > 1  	if (ao_num_stdios == AO_NUM_STDIOS)  		ao_panic(AO_PANIC_STDIO); +#endif  	ao_stdios[ao_num_stdios]._pollchar = _pollchar;  	ao_stdios[ao_num_stdios].putchar = putchar;  	ao_stdios[ao_num_stdios].flush = flush;  	ao_stdios[ao_num_stdios].echo = 1; +#if AO_NUM_STDIOS > 1  	return ao_num_stdios++; +#else +	return 0; +#endif  }  | 
