This is an automated email from the ASF dual-hosted git repository.
lupyuen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 91aa0b8ae benchmarks/cyclictest/cyclictest.c: periodic output and -q
option
91aa0b8ae is described below
commit 91aa0b8ae85e4f279ebc28dc2991f93caa01b82e
Author: Stepan Pressl <[email protected]>
AuthorDate: Sat Mar 1 12:22:13 2025 +0100
benchmarks/cyclictest/cyclictest.c: periodic output and -q option
Without the -q (--quiet) option, the program outputs the thread
stats every 100ms, which is compatible with the original
rt-tests/cyclictest utility.
Signed-off-by: Stepan Pressl <[email protected]>
---
benchmarks/cyclictest/cyclictest.c | 43 ++++++++++++++++++++++++++++++++------
1 file changed, 37 insertions(+), 6 deletions(-)
diff --git a/benchmarks/cyclictest/cyclictest.c
b/benchmarks/cyclictest/cyclictest.c
index 2ab0f1208..92bad1eb0 100644
--- a/benchmarks/cyclictest/cyclictest.c
+++ b/benchmarks/cyclictest/cyclictest.c
@@ -96,6 +96,7 @@ struct cyclictest_config_s
int threads;
int policy;
int prio;
+ bool quiet;
char *timer_dev;
enum meas_method_e meas_method;
enum wait_method_e wait_method;
@@ -117,9 +118,11 @@ struct thread_stats_s
long hist_overflow;
long min;
long max;
+ long act;
double avg;
unsigned long cycles;
pthread_t id;
+ int tid;
bool ended;
};
@@ -141,6 +144,7 @@ static const struct option optargs[] =
{"measurement", optional_argument, 0, 'm'},
{"nanosleep", optional_argument, 0, 'n'},
{"prio", optional_argument, 0, 'p'},
+ {"quiet", optional_argument, 0, 'q'},
{"threads", optional_argument, 0, 't'},
{"timer-device", optional_argument, 0, 'T'},
{"policy", optional_argument, 0, 'y'},
@@ -187,6 +191,7 @@ static void print_help(void)
" If METHOD 1 is selected, you need to specify a timer device "
"(e.g. /dev/timer0) in -T.\n"
" -p --prio: Set the priority of the first thread.\n"
+ " -q --quiet: Print a summary only on exit.\n"
" -t --threads [N]: The number of test threads to be created. "
"Default is 1.\n"
" -T --timer-device [DEV]: The measuring timer device.\n"
@@ -214,7 +219,7 @@ static bool parse_args(int argc, char * const argv[])
int longindex;
int opt;
long decimal;
- while ((opt = getopt_long(argc, argv, "c:d:D:h:Hi:l:m:n:p:t:T:",
+ while ((opt = getopt_long(argc, argv, "c:d:D:h:Hi:l:m:n:p:qt:T:",
optargs, &longindex)) != -1)
{
switch (opt)
@@ -323,6 +328,9 @@ static bool parse_args(int argc, char * const argv[])
return false;
}
break;
+ case 'q':
+ config.quiet = true;
+ break;
case 't':
decimal = arg_decimal(optarg);
if (decimal > 0)
@@ -479,6 +487,7 @@ static void *testthread(void *arg)
struct thread_param_s *param = (struct thread_param_s *)arg;
struct thread_stats_s *stats = param->stats;
+ stats->tid = gettid();
stats->min = LONG_MAX;
interval.tv_sec = param->interval / 1000000;
interval.tv_nsec = (param->interval % 1000000) * 1000;
@@ -624,6 +633,7 @@ static void *testthread(void *arg)
break;
}
+ stats->act = diff;
if (diff < stats->min)
{
stats->min = diff;
@@ -805,6 +815,21 @@ static void print_hist(struct thread_param_s *par[], int
nthreads)
printf("\n");
}
+/* Copied from the original rt-tests/cyclictest.
+ * This way, the output is compatible with the original cyclictest.
+ */
+
+static void print_stat(struct thread_param_s *par, int index)
+{
+ struct thread_stats_s *stat = par->stats;
+ char *fmt;
+ fmt = "T:%2d (%5d) P:%2d I:%ld C:%7lu "
+ "Min:%7ld Act:%5ld Avg:%5ld Max:%8ld\n";
+ printf(fmt, index, stat->tid, par->prio, par->interval, stat->cycles,
+ stat->min, stat->act,
+ stat->cycles ? (long)(stat->avg / stat->cycles) : 0, stat->max);
+}
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -834,6 +859,7 @@ int main(int argc, char *argv[])
config.meas_method = M_GETTIME;
config.wait_method = W_NANOSLEEP;
config.timer_dev = NULL;
+ config.quiet = false;
if (!parse_args(argc, argv))
{
@@ -865,7 +891,7 @@ int main(int argc, char *argv[])
/* Fill in the notify struct
* We do not want any signalling. But we must configure it,
- * because without the timer will not start.
+ * because without it the timer will not start.
*/
memset(&event, 0, sizeof(event));
@@ -906,10 +932,6 @@ int main(int argc, char *argv[])
reqtimeout_timer = 3 * (config.interval +
(config.threads - 1) * config.distance);
}
- else
- {
- reqtimeout_timer = 2 * CONFIG_USEC_PER_TICK;
- }
ret = ioctl(timerfd, TCIOC_MAXTIMEOUT,
(unsigned long)((uintptr_t)&maxtimeout_timer));
@@ -1017,6 +1039,11 @@ int main(int argc, char *argv[])
int ended = 0;
for (i = 0; i < config.threads; ++i)
{
+ if (!config.quiet)
+ {
+ print_stat(params[i], i);
+ }
+
if (stats[i]->ended)
{
ended += 1;
@@ -1027,6 +1054,10 @@ int main(int argc, char *argv[])
{
running = false;
}
+ else if (!config.quiet)
+ {
+ printf("\x1B[%dA", config.threads);
+ }
}
for (i = 0; i < config.threads; ++i)