From e10edf16834d7dbe0c4ce7ea88c634e31b7d3113 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 27 Jun 2011 19:57:11 +0000 Subject: Dedicated printf implementation. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3092 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-FATFS/Makefile | 1 + demos/ARMCM3-STM32F103-FATFS/main.c | 38 ++++---- os/various/chprintf.c | 167 ++++++++++++---------------------- 3 files changed, 73 insertions(+), 133 deletions(-) diff --git a/demos/ARMCM3-STM32F103-FATFS/Makefile b/demos/ARMCM3-STM32F103-FATFS/Makefile index f8733c3ae..5e7ac0c65 100644 --- a/demos/ARMCM3-STM32F103-FATFS/Makefile +++ b/demos/ARMCM3-STM32F103-FATFS/Makefile @@ -76,6 +76,7 @@ CSRC = $(PORTSRC) \ $(FATFSSRC) \ $(CHIBIOS)/os/various/shell.c \ $(CHIBIOS)/os/various/syscalls.c \ + $(CHIBIOS)/os/various/chprintf.c \ main.c # C++ sources that can be compiled in ARM or THUMB mode depending on the global diff --git a/demos/ARMCM3-STM32F103-FATFS/main.c b/demos/ARMCM3-STM32F103-FATFS/main.c index a5bfb13a8..98eb19962 100644 --- a/demos/ARMCM3-STM32F103-FATFS/main.c +++ b/demos/ARMCM3-STM32F103-FATFS/main.c @@ -18,7 +18,6 @@ along with this program. If not, see . */ -#include #include #include "ch.h" @@ -26,6 +25,7 @@ #include "test.h" #include "shell.h" #include "evtimer.h" +#include "chprintf.h" #include "ff.h" @@ -62,7 +62,7 @@ static bool_t mmc_is_protected(void) {return !palReadPad(IOPORT3, GPIOC_MMCWP);} /* Generic large buffer.*/ uint8_t fbuff[1024]; -static FRESULT scan_files(char *path) +static FRESULT scan_files(BaseChannel *chp, char *path) { FRESULT res; FILINFO fno; @@ -81,14 +81,15 @@ static FRESULT scan_files(char *path) continue; fn = fno.fname; if (fno.fattrib & AM_DIR) { - siprintf(&path[i], "/%s", fn); - res = scan_files(path); + path[i++] = '/'; + strcpy(&path[i], fn); + res = scan_files(chp, path); if (res != FR_OK) break; path[i] = 0; } else { - iprintf("%s/%s\r\n", path, fn); + chprintf(chp, "%s/%s\r\n", path, fn); } } } @@ -104,7 +105,6 @@ static FRESULT scan_files(char *path) static void cmd_mem(BaseChannel *chp, int argc, char *argv[]) { size_t n, size; - char buf[52]; (void)argv; if (argc > 0) { @@ -112,12 +112,9 @@ static void cmd_mem(BaseChannel *chp, int argc, char *argv[]) { return; } n = chHeapStatus(NULL, &size); - siprintf(buf, "core free memory : %u bytes", chCoreStatus()); - shellPrintLine(chp, buf); - siprintf(buf, "heap fragments : %u", n); - shellPrintLine(chp, buf); - siprintf(buf, "heap free total : %u bytes", size); - shellPrintLine(chp, buf); + chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); + chprintf(chp, "heap fragments : %u\r\n", n); + chprintf(chp, "heap free total : %u bytes\r\n", size); } static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) { @@ -138,7 +135,6 @@ static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) { "FINAL" }; Thread *tp; - char buf[60]; (void)argv; if (argc > 0) { @@ -148,11 +144,10 @@ static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) { shellPrintLine(chp, " addr stack prio refs state time"); tp = chRegFirstThread(); do { - siprintf(buf, "%8lx %8lx %4u %4i %9s %u", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (unsigned int)tp->p_prio, tp->p_refs - 1, - states[tp->p_state], (unsigned int)tp->p_time); - shellPrintLine(chp, buf); + chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", + (uint32_t)tp, (uint32_t)tp->p_ctx.r13, + (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), + states[tp->p_state], (uint32_t)tp->p_time); tp = chRegNextThread(tp); } while (tp != NULL); } @@ -193,13 +188,12 @@ static void cmd_tree(BaseChannel *chp, int argc, char *argv[]) { shellPrintLine(chp, "FS: f_getfree() failed"); return; } - siprintf((void *)fbuff, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free", + chprintf(chp, + "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", clusters, (uint32_t)MMC_FS.csize, clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMC_SECTOR_SIZE); - shellPrintLine(chp, (void *)fbuff); fbuff[0] = 0; - scan_files((char *)fbuff); + scan_files(chp, (char *)fbuff); } static const ShellCommand commands[] = { diff --git a/os/various/chprintf.c b/os/various/chprintf.c index 2d210b5cb..383a2121a 100644 --- a/os/various/chprintf.c +++ b/os/various/chprintf.c @@ -1,83 +1,57 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011 Giovanni Di Sirio. + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011 Giovanni Di Sirio. - This file is part of ChibiOS/RT. + This file is part of ChibiOS/RT. - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ #include #include "ch.h" -#define MAXDIG 11 - -static char *itoa(char *p, int num, unsigned radix) { - int i; - char *q; - - q = p + MAXDIG; - do { - i = (int)(num % radix); - i += '0'; - if (i > '9') - i += 'A' - '0' - 10; - *--q = i; - } while ((num /= radix) != 0); - - i = (int)(p + MAXDIG - q); - do - *p++ = *q++; - while (--i); - - return p; -} - -#ifndef NO_LONGD +#define MAX_FILLER 11 static char *ltoa(char *p, long num, unsigned radix) { int i; char *q; - q = p + MAXDIG; + q = p + MAX_FILLER; do { i = (int)(num % radix); i += '0'; if (i > '9') - i += 'A' - '0' - 10; + i += 'A' - '0' - 10; *--q = i; } while ((num /= radix) != 0); - i = (int)(p + MAXDIG - q); + i = (int)(p + MAX_FILLER - q); do *p++ = *q++; while (--i); return p; } -#endif void chprintf(BaseChannel *chp, const char *fmt, ...) { va_list ap; - char buf[MAXDIG + 1]; - char *p, *s; - int c, i, width, ndigit, ndfnd, ljust, zfill; -#ifndef NO_LONGD - int lflag; + char buf[MAX_FILLER + 1]; + char *p, *s, c, filler; + int i, n, width; + bool_t lflag, ljust; long l; -#endif va_start(ap, fmt); while (TRUE) { @@ -92,15 +66,15 @@ void chprintf(BaseChannel *chp, const char *fmt, ...) { } p = buf; s = buf; - ljust = 0; + ljust = FALSE; if (*fmt == '-') { fmt++; - ljust++; + ljust = TRUE; } - zfill = ' '; - if (*fmt == '0') { + filler = ' '; + if (*fmt == '.') { fmt++; - zfill = '0'; + filler = '0'; } for (width = 0;;) { c = *fmt++; @@ -113,8 +87,7 @@ void chprintf(BaseChannel *chp, const char *fmt, ...) { width *= 10; width += c; } - ndfnd = 0; - ndigit = 0; + n = 0; if (c == '.') { for (;;) { c = *fmt++; @@ -124,89 +97,61 @@ void chprintf(BaseChannel *chp, const char *fmt, ...) { c = va_arg(ap, int); else break; - ndigit *= 10; - ndigit += c; - ndfnd++; + n *= 10; + n += c; } } -#ifndef NO_LONGD - lflag = 0; -#endif + lflag = FALSE; if (c == 'l' || c == 'L') { -#ifndef NO_LONGD lflag++; -#endif if (*fmt) c = *fmt++; } switch (c) { case 'X': -#ifndef NO_LONGD - lflag++; -#endif + lflag = TRUE; case 'x': c = 16; goto oxu; case 'U': -#ifndef NO_LONGD - lflag++; -#endif + lflag = TRUE; case 'u': c = 10; goto oxu; case 'O': -#ifndef NO_LONGD - lflag++; -#endif + lflag = TRUE; case 'o': c = 8; - oxu: -#ifndef NO_LONGD - if (lflag) { - p = ltoa(p, va_arg(ap, long), c); - break; - } -#endif - p = itoa(p, va_arg(ap, int), c); + oxu: if (lflag) + l = va_arg(ap, long); + else + l = va_arg(ap, int); + p = ltoa(p, l, c); break; case 'D': -#ifndef NO_LONGD - lflag++; -#endif + lflag = TRUE; case 'd': -#ifndef NO_LONGD - if (lflag) { - if ((l = va_arg(ap, long)) < 0) { - *p++ = '-'; - l = -l; - } - p = ltoa(p, l, 10); - break; - } -#endif - if ((i = va_arg(ap, int)) < 0) { + if (lflag) + l = va_arg(ap, long); + else + l = va_arg(ap, int); + if (l < 0) { *p++ = '-'; - i = -i; + l = -l; } - p = itoa(p, i, 10); + p = ltoa(p, l, 10); break; -/* case 'e': - case 'f': - case 'g': - zfill = ' '; - *p++ = '?'; - break;*/ case 'c': - zfill = ' '; + filler = ' '; *p++ = va_arg(ap, int); break; case 's': - zfill = ' '; + filler = ' '; if ((s = va_arg(ap, char *)) == 0) s = "(null)"; - if (ndigit == 0) - ndigit = 32767; - for (p = s; *p && --ndigit >= 0; p++) + if (n == 0) + n = 32767; + for (p = s; *p && --n >= 0; p++) ; break; default: @@ -216,22 +161,22 @@ void chprintf(BaseChannel *chp, const char *fmt, ...) { i = (int)(p - s); if ((width -= i) < 0) width = 0; - if (ljust == 0) + if (ljust == FALSE) width = -width; if (width < 0) { - if (*s == '-' && zfill == '0') { + if (*s == '-' && filler == '0') { chIOPut(chp, (uint8_t)*s++); i--; } do - chIOPut(chp, (uint8_t)zfill); + chIOPut(chp, (uint8_t)filler); while (++width != 0); } while (--i >= 0) chIOPut(chp, (uint8_t)*s++); while (width) { - chIOPut(chp, (uint8_t)zfill); + chIOPut(chp, (uint8_t)filler); width--; } } -- cgit v1.2.3