Skip to content

Commit

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

BOARD_INSUFFICIENT_MEMORY := nucleo-f031k6

USEMODULE += core_thread_flags
USEMODULE += xtimer

TEST_ON_CI_WHITELIST += all

include $(RIOTBASE)/Makefile.include

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

This test measures the number of times one thread can set (and wakeup) another
thread using thread_flags(). The result amounts to the number of times the
thread flag was set, which is half the number of context switches incurred in
that time.

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

#include <stdio.h>
#include "thread.h"

#include "thread_flags.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_flags_wait_any(0x0 - 1);
}

return NULL;
}

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

kernel_pid_t other = thread_create(_stack,
sizeof(_stack),
(THREAD_PRIORITY_MAIN - 1),
THREAD_CREATE_STACKTEST,
_second_thread,
NULL,
"second_thread");

thread_t *tcb = (thread_t *)sched_threads[other];

xtimer_t timer;
timer.callback = _timer_callback;

uint32_t n = 0;

xtimer_set(&timer, TEST_DURATION);
while(!_flag) {
thread_flags_set(tcb, 0x1);
n++;
}

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

return 0;
}
21 changes: 21 additions & 0 deletions tests/bench_thread_flags_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 5bf1295

Please sign in to comment.