From d05fb1e4fff0f89de2c6a68ee2b989770f769f24 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 4 Oct 2014 07:47:23 +0000 Subject: [PATCH] Fixed bug #538. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7358 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/SPC5/RT-SPC560B-EVB/main.c | 2 +- demos/SPC5/RT-SPC560D-EVB/main.c | 2 +- demos/SPC5/RT-SPC560P-EVB/main.c | 2 +- demos/SPC5/RT-SPC563M-EVB/main.c | 2 +- demos/SPC5/RT-SPC564A-EVB/main.c | 2 +- demos/SPC5/RT-SPC56EC-EVB/main.c | 2 +- demos/SPC5/RT-SPC56EL-EVB/main.c | 2 +- .../STM32/RT-STM32F407-DISCOVERY-MEMS/main.c | 2 +- demos/STM32/RT-STM32F429-DISCOVERY/main.c | 2 +- os/various/chprintf.c | 26 ++++++++++++------- testhal/STM32/STM32F1xx/USB_CDC/main.c | 2 +- testhal/STM32/STM32F1xx/USB_CDC_F107/main.c | 2 +- testhal/STM32/STM32F30x/USB_CDC/main.c | 2 +- testhal/STM32/STM32F37x/USB_CDC/main.c | 2 +- testhal/STM32/STM32F4xx/USB_CDC/main.c | 2 +- 15 files changed, 31 insertions(+), 23 deletions(-) diff --git a/demos/SPC5/RT-SPC560B-EVB/main.c b/demos/SPC5/RT-SPC560B-EVB/main.c index 4314c1538..4516c6224 100644 --- a/demos/SPC5/RT-SPC560B-EVB/main.c +++ b/demos/SPC5/RT-SPC560B-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/SPC5/RT-SPC560D-EVB/main.c b/demos/SPC5/RT-SPC560D-EVB/main.c index 4314c1538..4516c6224 100644 --- a/demos/SPC5/RT-SPC560D-EVB/main.c +++ b/demos/SPC5/RT-SPC560D-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/SPC5/RT-SPC560P-EVB/main.c b/demos/SPC5/RT-SPC560P-EVB/main.c index deac100c5..b17e1e523 100644 --- a/demos/SPC5/RT-SPC560P-EVB/main.c +++ b/demos/SPC5/RT-SPC560P-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/SPC5/RT-SPC563M-EVB/main.c b/demos/SPC5/RT-SPC563M-EVB/main.c index 93a001ffa..e90e683e3 100644 --- a/demos/SPC5/RT-SPC563M-EVB/main.c +++ b/demos/SPC5/RT-SPC563M-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/SPC5/RT-SPC564A-EVB/main.c b/demos/SPC5/RT-SPC564A-EVB/main.c index 93a001ffa..e90e683e3 100644 --- a/demos/SPC5/RT-SPC564A-EVB/main.c +++ b/demos/SPC5/RT-SPC564A-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/SPC5/RT-SPC56EC-EVB/main.c b/demos/SPC5/RT-SPC56EC-EVB/main.c index 4314c1538..4516c6224 100644 --- a/demos/SPC5/RT-SPC56EC-EVB/main.c +++ b/demos/SPC5/RT-SPC56EC-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/SPC5/RT-SPC56EL-EVB/main.c b/demos/SPC5/RT-SPC56EL-EVB/main.c index deac100c5..b17e1e523 100644 --- a/demos/SPC5/RT-SPC56EL-EVB/main.c +++ b/demos/SPC5/RT-SPC56EL-EVB/main.c @@ -49,7 +49,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\r\n", (uint32_t)tp, (uint32_t)tp->p_ctx.sp, (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), states[tp->p_state]); diff --git a/demos/STM32/RT-STM32F407-DISCOVERY-MEMS/main.c b/demos/STM32/RT-STM32F407-DISCOVERY-MEMS/main.c index 85310332f..982981993 100644 --- a/demos/STM32/RT-STM32F407-DISCOVERY-MEMS/main.c +++ b/demos/STM32/RT-STM32F407-DISCOVERY-MEMS/main.c @@ -60,7 +60,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\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]); diff --git a/demos/STM32/RT-STM32F429-DISCOVERY/main.c b/demos/STM32/RT-STM32F429-DISCOVERY/main.c index d857c3ddd..6db720300 100644 --- a/demos/STM32/RT-STM32F429-DISCOVERY/main.c +++ b/demos/STM32/RT-STM32F429-DISCOVERY/main.c @@ -91,7 +91,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\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]); diff --git a/os/various/chprintf.c b/os/various/chprintf.c index e39b4c324..838cd7ce8 100644 --- a/os/various/chprintf.c +++ b/os/various/chprintf.c @@ -32,7 +32,7 @@ #include "memstreams.h" #define MAX_FILLER 11 -#define FLOAT_PRECISION 100000 +#define FLOAT_PRECISION 5 static char *long_to_string_with_divisor(char *p, long num, @@ -73,9 +73,16 @@ static char *ltoa(char *p, long num, unsigned radix) { } #if CHPRINTF_USE_FLOAT -static char *ftoa(char *p, double num) { +static long pow10[] = {10, 100, 1000, 10000, 100000, 1000000, 10000000, + 100000000, 1000000000, 10000000000, 100000000000, + 1000000000000, 10000000000000}; + +static char *ftoa(char *p, double num, unsigned long precision) { long l; - unsigned long precision = FLOAT_PRECISION; + + if (precision == 0) + precision = FLOAT_PRECISION; + precision = pow10[precision - 1]; l = (long)num; p = long_to_string_with_divisor(p, l, 10, 0); @@ -137,7 +144,7 @@ void chvprintf(BaseSequentialStream *chp, const char *fmt, va_list ap) { left_align = TRUE; } filler = ' '; - if ((*fmt == '.') || (*fmt == '0')) { + if (*fmt == '0') { fmt++; filler = '0'; } @@ -211,7 +218,7 @@ void chvprintf(BaseSequentialStream *chp, const char *fmt, va_list ap) { *p++ = '-'; f = -f; } - p = ftoa(p, f); + p = ftoa(p, f, precision); break; #endif case 'X': @@ -290,8 +297,9 @@ int chsnprintf(char *str, size_t size, const char *fmt, ...) { MemoryStream ms; BaseSequentialStream *chp; - /* Memory stream object to be used as a string writer.*/ - msObjectInit(&ms, (uint8_t *)str, size, 0); + /* Memory stream object to be used as a string writer, reserving one + byte for the final zero.*/ + msObjectInit(&ms, (uint8_t *)str, size - 1, 0); /* Performing the print operation using the common code.*/ chp = (BaseSequentialStream *)&ms; @@ -300,8 +308,8 @@ int chsnprintf(char *str, size_t size, const char *fmt, ...) { va_end(ap); /* Final zero and size return.*/ - chSequentialStreamPut(chp, 0); - return ms.eos - 1; + str[ms.eos] = 0; + return ms.eos; } /** @} */ diff --git a/testhal/STM32/STM32F1xx/USB_CDC/main.c b/testhal/STM32/STM32F1xx/USB_CDC/main.c index 38dc09260..3d556fce7 100644 --- a/testhal/STM32/STM32F1xx/USB_CDC/main.c +++ b/testhal/STM32/STM32F1xx/USB_CDC/main.c @@ -361,7 +361,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", + chprintf(chp, "%08lx %08lx %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]); diff --git a/testhal/STM32/STM32F1xx/USB_CDC_F107/main.c b/testhal/STM32/STM32F1xx/USB_CDC_F107/main.c index 8dda559c0..3ca3648f8 100644 --- a/testhal/STM32/STM32F1xx/USB_CDC_F107/main.c +++ b/testhal/STM32/STM32F1xx/USB_CDC_F107/main.c @@ -361,7 +361,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", + chprintf(chp, "%08lx %08lx %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); diff --git a/testhal/STM32/STM32F30x/USB_CDC/main.c b/testhal/STM32/STM32F30x/USB_CDC/main.c index 31122bcbd..67cd65d4a 100644 --- a/testhal/STM32/STM32F30x/USB_CDC/main.c +++ b/testhal/STM32/STM32F30x/USB_CDC/main.c @@ -368,7 +368,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", + chprintf(chp, "%08lx %08lx %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]); diff --git a/testhal/STM32/STM32F37x/USB_CDC/main.c b/testhal/STM32/STM32F37x/USB_CDC/main.c index 8730cabe6..fadfc9092 100644 --- a/testhal/STM32/STM32F37x/USB_CDC/main.c +++ b/testhal/STM32/STM32F37x/USB_CDC/main.c @@ -367,7 +367,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\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]); diff --git a/testhal/STM32/STM32F4xx/USB_CDC/main.c b/testhal/STM32/STM32F4xx/USB_CDC/main.c index dd01ecb25..054c4e23c 100644 --- a/testhal/STM32/STM32F4xx/USB_CDC/main.c +++ b/testhal/STM32/STM32F4xx/USB_CDC/main.c @@ -361,7 +361,7 @@ static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { chprintf(chp, " addr stack prio refs state time\r\n"); tp = chRegFirstThread(); do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s\r\n", + chprintf(chp, "%08lx %08lx %4lu %4lu %9s\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]);