From ca366d0e382bed14c7914e2327c6460ecdddcffd Mon Sep 17 00:00:00 2001 From: Che-liang Chiou Date: Thu, 6 Oct 2011 23:40:48 +0000 Subject: cmd_time: add time command The 'time' command runs and reports execution time of commands. Sample usage: -------------------- u-boot# time crc 0x1000 1000 CRC32 for 00001000 ... 00001fff ==> ae94dc4b time: 0.004 seconds, 4 ticks -------------------- Signed-off-by: Che-Liang Chiou Acked-by: Mike Frysinger --- common/cmd_time.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 common/cmd_time.c (limited to 'common/cmd_time.c') diff --git a/common/cmd_time.c b/common/cmd_time.c new file mode 100644 index 0000000000..c937ae4af3 --- /dev/null +++ b/common/cmd_time.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 2 of + * the License, or (at your option) any later version. + * + * This program 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include + +/* + * TODO(clchiou): This function actually minics the bottom-half of the + * run_command() function. Since this function has ARM-dependent timer + * codes, we cannot merge it with the run_command() for now. + */ +static int run_command_and_time_it(int flag, int argc, char * const argv[], + ulong *cycles) +{ + cmd_tbl_t *cmdtp = find_cmd(argv[0]); + int retval = 0; + + if (!cmdtp) { + printf("%s: command not found\n", argv[0]); + return 1; + } + if (argc > cmdtp->maxargs) + return cmd_usage(cmdtp); + + /* + * TODO(clchiou): get_timer_masked() is only defined in certain ARM + * boards. We could use the new timer API that Graeme is proposing + * so that this piece of code would be arch-independent. + */ + *cycles = get_timer_masked(); + retval = cmdtp->cmd(cmdtp, flag, argc, argv); + *cycles = get_timer_masked() - *cycles; + + return retval; +} + +static void report_time(ulong cycles) +{ + ulong minutes, seconds, milliseconds; + ulong total_seconds, remainder; + + total_seconds = cycles / CONFIG_SYS_HZ; + remainder = cycles % CONFIG_SYS_HZ; + minutes = total_seconds / 60; + seconds = total_seconds % 60; + /* approximate millisecond value */ + milliseconds = (remainder * 1000 + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ; + + printf("\ntime:"); + if (minutes) + printf(" %lu minutes,", minutes); + printf(" %lu.%03lu seconds, %lu ticks\n", + seconds, milliseconds, cycles); +} + +static int do_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + ulong cycles = 0; + int retval = 0; + + if (argc == 1) + return cmd_usage(cmdtp); + + retval = run_command_and_time_it(0, argc - 1, argv + 1, &cycles); + report_time(cycles); + + return retval; +} + +U_BOOT_CMD(time, CONFIG_SYS_MAXARGS, 0, do_time, + "run commands and summarize execution time", + "command [args...]\n"); -- cgit v1.2.1