Skip to content

Commit

Permalink
tests/bench_thread_yield_pingpong: initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
kaspar030 committed Jun 15, 2018
1 parent 5bf1295 commit 3c9eb94
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 0 deletions.
12 changes: 12 additions & 0 deletions tests/bench_thread_yield_pingpong/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
include ../Makefile.tests_common

BOARD_INSUFFICIENT_MEMORY := nucleo-f031k6

USEMODULE += xtimer

TEST_ON_CI_WHITELIST += all

include $(RIOTBASE)/Makefile.include

test:
tests/01-run.py
8 changes: 8 additions & 0 deletions tests/bench_thread_yield_pingpong/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# About

This test measures the amount of context switches between two threads of the
same priority. The result amounts to the number of thread_yield() calls in
*one* thread (half the number of actual context switches).

This test application intentionally duplicates code with some similar benchmark
applications in order to be able to compare code sizes.
77 changes: 77 additions & 0 deletions tests/bench_thread_yield_pingpong/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (C) 2017 Kaspar Schleiser <kaspar@schleiser.de>
*
* 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 Context switch benchmark test application
*
* @author Kaspar Schleiser <kaspar@schleiser.de>
*
* @}
*/

#include <stdio.h>

#include "thread.h"
#include "xtimer.h"

#ifndef TEST_DURATION
#define TEST_DURATION (1000000U)
#endif

volatile unsigned _flag = 0;
static char _stack[THREAD_STACKSIZE_MAIN];

static void _timer_callback(void*arg)
{
(void)arg;

_flag = 1;
}

static void *_second_thread(void *arg)
{
(void)arg;

while(1) {
thread_yield();
}

return NULL;
}

int main(void)
{
printf("main starting\n");

thread_create(_stack,
sizeof(_stack),
THREAD_PRIORITY_MAIN,
THREAD_CREATE_STACKTEST,
_second_thread,
NULL,
"second_thread");

xtimer_t timer;
timer.callback = _timer_callback;

uint32_t n = 0;

xtimer_set(&timer, TEST_DURATION);
while(!_flag) {
thread_yield();
n++;
}

printf("{ \"result\" : %"PRIu32" }\n", n);

return 0;
}
21 changes: 21 additions & 0 deletions tests/bench_thread_yield_pingpong/tests/01-run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env python3

# Copyright (C) 2018 Kaspar Schleiser <kaspar@schleiser.de>
# 2017 Sebastian Meiling <s@mlng.net>
#
# 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.

import os
import sys


def testfunc(child):
child.expect(r"{ \"result\" : \d+ }")


if __name__ == "__main__":
sys.path.append(os.path.join(os.environ['RIOTTOOLS'], 'testrunner'))
from testrunner import run
sys.exit(run(testfunc))

0 comments on commit 3c9eb94

Please sign in to comment.