diff options
Diffstat (limited to 'src-avr/ao_stdio.c')
-rw-r--r-- | src-avr/ao_stdio.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src-avr/ao_stdio.c b/src-avr/ao_stdio.c index 6702fab0..0ec0fc2e 100644 --- a/src-avr/ao_stdio.c +++ b/src-avr/ao_stdio.c @@ -37,6 +37,8 @@ __data int8_t ao_num_stdios; void putchar(char c) { + if (ao_cur_stdio >= ao_num_stdios || !ao_stdios[ao_cur_stdio].putchar) + return; if (c == '\n') (*ao_stdios[ao_cur_stdio].putchar)('\r'); (*ao_stdios[ao_cur_stdio].putchar)(c); @@ -58,10 +60,12 @@ ao_getchar(void) __reentrant __critical int8_t stdio = ao_cur_stdio; for (;;) { - c = ao_stdios[stdio].pollchar(); - if (c != AO_READ_AGAIN) - break; - if (++stdio == ao_num_stdios) + if (stdio < ao_num_stdios) { + c = ao_stdios[stdio].pollchar(); + if (c != AO_READ_AGAIN) + break; + } + if (++stdio >= ao_num_stdios) stdio = 0; if (stdio == ao_cur_stdio) ao_sleep(&ao_stdin_ready); @@ -87,6 +91,7 @@ ao_add_stdio(char (*pollchar)(void), ao_stdios[ao_num_stdios].putchar = putchar; ao_stdios[ao_num_stdios].flush = flush; ao_stdios[ao_num_stdios].echo = 1; + ao_wakeup(&ao_stdin_ready); return ao_num_stdios++; } @@ -94,7 +99,7 @@ ao_add_stdio(char (*pollchar)(void), int stdio_put(char c, FILE *stream) { -#if 0 +#if 1 if (ao_cur_task && ao_num_stdios) putchar(c); else @@ -124,6 +129,5 @@ ao_stdio_init(void) { stdout = &mystdout; stdin = &mystdin; - printf("%d stdios registered\n", ao_num_stdios); } #endif |