diff options
-rw-r--r-- | demos/ARMCM3-STM32F103-FATFS/Makefile | 1 | ||||
-rw-r--r-- | demos/ARMCM3-STM32F103-FATFS/main.c | 38 | ||||
-rw-r--r-- | 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 <http://www.gnu.org/licenses/>.
*/
-#include <stdio.h>
#include <string.h>
#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 <http://www.gnu.org/licenses/>.
-*/
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#include <stdarg.h>
#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--;
}
}
|