From 4bf85f7c7b67bfb1a044f0fea56ce75d9ffba4b2 Mon Sep 17 00:00:00 2001 From: Masayuki Ishikawa Date: Mon, 19 Dec 2016 18:33:34 -0600 Subject: [PATCH] NSH: dd command will show statistics --- nshlib/Kconfig | 5 +++++ nshlib/nsh_ddcmd.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/nshlib/Kconfig b/nshlib/Kconfig index fdf4da9cd..357e50072 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -557,6 +557,11 @@ config NSH_CMDOPT_DF_H default y if !DEFAULT_SMALL depends on !NSH_DISABLE_DF +config NSH_CMDOPT_DD_STATS + bool "dd: Support transfer statistics" + default n + depends on !NSH_DISABLE_DD + config NSH_CODECS_BUFSIZE int "File buffer size used by CODEC commands" default 128 diff --git a/nshlib/nsh_ddcmd.c b/nshlib/nsh_ddcmd.c index 2b976b8bd..71cdac63c 100644 --- a/nshlib/nsh_ddcmd.c +++ b/nshlib/nsh_ddcmd.c @@ -50,6 +50,7 @@ #include #include #include +#include #include "nsh.h" #include "nsh_console.h" @@ -215,6 +216,12 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) struct dd_s dd; char *infile = NULL; char *outfile = NULL; +#ifdef CONFIG_NSH_CMDOPT_DD_STATS + struct timespec ts0; + struct timespec ts1; + uint64_t elapsed; + uint64_t total; +#endif int ret = ERROR; int i; @@ -302,6 +309,14 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) /* Then perform the data transfer */ +#ifdef CONFIG_NSH_CMDOPT_DD_STATS +#ifdef CONFIG_CLOCK_MONOTONIC + (void)clock_gettime(CLOCK_MONOTONIC, &ts0); +#else + (void)clock_gettime(CLOCK_REALTIME, &ts0); +#endif +#endif + dd.sector = 0; while (!dd.eof && dd.nsectors > 0) { @@ -347,6 +362,25 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) ret = OK; +#ifdef CONFIG_NSH_CMDOPT_DD_STATS +#ifdef CONFIG_CLOCK_MONOTONIC + (void)clock_gettime(CLOCK_MONOTONIC, &ts1); +#else + (void)clock_gettime(CLOCK_REALTIME, &ts1); +#endif + + elapsed = (((uint64_t)ts1.tv_sec * NSEC_PER_SEC) + ts1.tv_nsec); + elapsed -= (((uint64_t)ts0.tv_sec * NSEC_PER_SEC) + ts0.tv_nsec); + elapsed /= NSEC_PER_MSEC; /* msec */ + + total = ((uint64_t)dd.sector * (uint64_t)dd.sectsize); + + nsh_output(vtbl, "%llu bytes copied, %u msec, ", + total, (unsigned int)elapsed); + nsh_output(vtbl, "%u KB/s\n" , + (unsigned int)((double)total / (double)elapsed)); +#endif + errout_with_outf: (void)close(dd.outfd);