Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ps: fix schedstatistics #6975

Merged
merged 3 commits into from
May 17, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions core/include/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,10 @@ NORETURN void sched_task_exit(void);
* Scheduler statistics
*/
typedef struct {
unsigned int laststart; /**< Time stamp of the last time this thread was
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

uint64_t would be more semantically correct since _xtimer_now64 returns an uint64_t

scheduled to run */
unsigned int schedules; /**< How often the thread was scheduled to run */
unsigned long runtime_ticks; /**< The total runtime of this thread in ticks */
uint64_t laststart; /**< Time stamp of the last time this thread was
scheduled to run */
unsigned int schedules; /**< How often the thread was scheduled to run */
uint64_t runtime_ticks; /**< The total runtime of this thread in ticks */
} schedstat;

/**
Expand Down
8 changes: 4 additions & 4 deletions core/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ int __attribute__((used)) sched_run(void)
}

#ifdef MODULE_SCHEDSTATISTICS
unsigned long time = _xtimer_now();
uint64_t now = _xtimer_now64();
#endif

if (active_thread) {
Expand All @@ -118,17 +118,17 @@ int __attribute__((used)) sched_run(void)
#ifdef MODULE_SCHEDSTATISTICS
schedstat *active_stat = &sched_pidlist[active_thread->pid];
if (active_stat->laststart) {
active_stat->runtime_ticks += time - active_stat->laststart;
active_stat->runtime_ticks += now - active_stat->laststart;
}
#endif
}

#ifdef MODULE_SCHEDSTATISTICS
schedstat *next_stat = &sched_pidlist[next_thread->pid];
next_stat->laststart = time;
next_stat->laststart = now;
next_stat->schedules++;
if (sched_cb) {
sched_cb(time, next_thread->pid);
sched_cb(now, next_thread->pid);
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion examples/default/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ RIOTBASE ?= $(CURDIR)/../..
#RIOTBOARD ?= $(CURDIR)/../../RIOT/thirdparty_boards

# Uncomment this to enable scheduler statistics for ps:
#CFLAGS += -DSCHEDSTATISTICS
#USEMODULE += schedstatistics

# If you want to use native with valgrind, you should recompile native
# with the target all-valgrind instead of all:
Expand Down
5 changes: 3 additions & 2 deletions sys/ps/ps.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ void ps(void)
#endif
"%-9sQ | pri "
#ifdef DEVELHELP
"| stack ( used) | base | current "
"| stack ( used) | base | current "
#endif
#ifdef MODULE_SCHEDSTATISTICS
"| runtime | switches"
Expand Down Expand Up @@ -98,7 +98,8 @@ void ps(void)
overall_used += stacksz;
#endif
#ifdef MODULE_SCHEDSTATISTICS
double runtime_ticks = sched_pidlist[i].runtime_ticks / (double) xtimer_now() * 100;
double runtime_ticks = sched_pidlist[i].runtime_ticks /
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like this only works for the first 2**32 ticks after boot, right? (Now that we're looking at it. :) )

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And ... can we get change this to use uint64_t?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will look into it

(double) _xtimer_now64() * 100;
int switches = sched_pidlist[i].schedules;
#endif
printf("\t%3" PRIkernel_pid
Expand Down
16 changes: 16 additions & 0 deletions tests/ps_schedstatistics/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
APPLICATION = ps_schedstatistics
include ../Makefile.tests_common

BOARD_INSUFFICIENT_MEMORY := chronos msb-430 msb-430h nucleo-f030 nucleo-l053 \
nucleo32-f031 nucleo32-f042 nucleo32-l031 \
stm32f0discovery telosb weio wsn430-v1_3b \
wsn430-v1_4 z1

CFLAGS += -DDEVELHELP
USEMODULE += shell
USEMODULE += shell_commands
USEMODULE += ps
USEMODULE += schedstatistics
USEMODULE += printf_float

include $(RIOTBASE)/Makefile.include
65 changes: 65 additions & 0 deletions tests/ps_schedstatistics/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (C) 2017 OTA keys S.A.
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @ingroup tests
* @{
*
* @file
* @brief ps schedstatistics test app
*
* @author Vincent Dupont <vincent@otakeys.com>
*
* @}
*/

#include <stdio.h>
#include <inttypes.h>

#include <shell.h>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For future reference: internal includes are marked with #include "header.h" instead of #include <header.h>

#include <thread.h>
#include <xtimer.h>

#define NB_THREADS 5

static char stacks[NB_THREADS][THREAD_STACKSIZE_DEFAULT];
static kernel_pid_t pids[NB_THREADS];

static void *_thread_fn(void *arg)
{
int next = (int)arg < NB_THREADS - 1 ? (int)arg + 1 : 0;
msg_t msg;

printf("Creating thread #%d, next=%d\n", (int)arg, next);

while (1) {
msg_receive(&msg);
xtimer_usleep(XTIMER_BACKOFF - 1);
xtimer_usleep(2 * XTIMER_BACKOFF);
msg_send(&msg, pids[next]);
}

return NULL;
}

int main(void)
{
for (int i = 0; i < NB_THREADS; i++) {
pids[i] = thread_create(stacks[i], sizeof(stacks[i]),
THREAD_PRIORITY_MAIN + 1,
THREAD_CREATE_STACKTEST,
_thread_fn, (void *)i, "thread");
}


msg_t msg;
msg_send(&msg, pids[0]);

char line_buf[SHELL_DEFAULT_BUFSIZE];
shell_run(NULL, line_buf, SHELL_DEFAULT_BUFSIZE);
}