X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=blobdiff_plain;f=tos%2Flib%2Fprintf%2FPrintfP.nc;h=a1a81f3beb6a05786d14f20b268ed2cffdadd126;hp=78595a8db9f19189352fdad01fa28be6717729d6;hb=32d57e66807cbea2aedfda37461a891b3168d422;hpb=7e3e9dc68fd8299266a07e07357853271d424cdb diff --git a/tos/lib/printf/PrintfP.nc b/tos/lib/printf/PrintfP.nc index 78595a8d..a1a81f3b 100644 --- a/tos/lib/printf/PrintfP.nc +++ b/tos/lib/printf/PrintfP.nc @@ -54,21 +54,17 @@ /** * This is the PrintfP component. It provides the printf service for printing * data over the serial interface using the standard c-style printf command. - * It must be started via the SplitControl interface it provides. Data - * printed using printf are buffered and only sent over the serial line after - * making a call to PrintfFlush.flush(). This buffer has a maximum size of - * 250 bytes at present. After calling start on this component, printf - * statements can be made anywhere throughout your code, so long as you include - * the "printf.h" header file in every file you wish to use it. Standard - * practice is to start the printf service in the main application, and set up - * a timer to periodically flush the printf buffer (500ms should do). In future - * versions, user defined buffer sizes as well as well as automatic flushing at - * user defined intervals will be supported. + * Data printed using printf are buffered and only sent over the serial line after + * the buffer is half full or an explicit call to printfflush() is made. This + * buffer has a maximum size of 250 bytes at present. This component is wired + * to a shadowed MainC component so that printf statements can be made anywhere + * throughout your code, so long as you include the "printf.h" header file in + * every file you wish to use it. Take a look at the printf tutorial (lesson 15) + * for more details. * * The printf service is currently only available for msp430 based motes - * (i.e. telos, eyes) and atmega128 based motes (i.e. mica2, micaz). On the - * atmega platforms, avr-libc version 1.4 or above mus tbe used. - * + * (i.e. telos, eyes) and atmega128x based motes (i.e. mica2, micaz, iris). On the + * atmega platforms, avr-libc version 1.4 or above must be used. */ /** @@ -80,10 +76,12 @@ #ifdef _H_atmega128hardware_H static int uart_putchar(char c, FILE *stream); -static FILE atm128_stdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); +static FILE atm128_stdout = + FDEV_SETUP_STREAM(TCAST(int (*)(char c, FILE *stream), uart_putchar), + NULL, _FDEV_SETUP_WRITE); #endif -module PrintfP { +module PrintfP @safe() { provides { interface Boot; } @@ -113,11 +111,13 @@ implementation { } event void SerialControl.startDone(error_t error) { + if (state == S_STOPPED) { #ifdef _H_atmega128hardware_H - stdout = &atm128_stdout; + stdout = &atm128_stdout; #endif - atomic state = S_STARTED; - signal Boot.booted(); + atomic state = S_STARTED; + signal Boot.booted(); + } } event void SerialControl.stopDone(error_t error) { @@ -161,13 +161,16 @@ implementation { else post retrySend(); } -#ifdef _H_msp430hardware_h - int putchar(int c) __attribute__((noinline)) @C() @spontaneous() { -#endif #ifdef _H_atmega128hardware_H int uart_putchar(char c, FILE *stream) __attribute__((noinline)) @C() @spontaneous() { +#else +#ifdef __M16C62PHARDWARE_H__ + int lowlevel_putc(int c) __attribute__((noinline)) @C() @spontaneous() { +#else + int putchar(int c) __attribute__((noinline)) @C() @spontaneous() { +#endif #endif - if((state == S_STARTED) && (call Queue.size() >= 5*sizeof(printf_msg_t))) { + if((state == S_STARTED) && (call Queue.size() >= ((PRINTF_BUFFER_SIZE)/2))) { state = S_FLUSHING; sendNext(); }