tests/periph_timer_short_relative_set: initial commit
This commit is contained in:
parent
4df6bb425f
commit
81f113ba05
17
tests/periph_timer_short_relative_set/Makefile
Normal file
17
tests/periph_timer_short_relative_set/Makefile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
include ../Makefile.tests_common
|
||||||
|
|
||||||
|
FEATURES_REQUIRED = periph_timer
|
||||||
|
|
||||||
|
USEMODULE += core_thread_flags
|
||||||
|
|
||||||
|
# optionally configure timer under test. Defaults to xtimer config.
|
||||||
|
# TEST_TIMER_DEV takes a 0-based index to the periph_timer instance defined in
|
||||||
|
# the board's periph_conf.h. TEST_TIMER_FREQ as an integer number which will
|
||||||
|
# be used as "freq" parameter in the timer_init() call.
|
||||||
|
# Note: not all implementations support arbitrary frequencies.
|
||||||
|
#CFLAGS += -DTEST_TIMER_DEV=foo -DTEST_TIMER_FREQ=bar
|
||||||
|
|
||||||
|
# this test currently fails all CI boards and native
|
||||||
|
TEST_ON_CI_BLACKLIST += all
|
||||||
|
|
||||||
|
include $(RIOTBASE)/Makefile.include
|
||||||
32
tests/periph_timer_short_relative_set/README.md
Normal file
32
tests/periph_timer_short_relative_set/README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Periph Timer Test for short timer_set() values
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
This test exposes if timer_set() with very low values (down to zero) underflows.
|
||||||
|
For each value from 100 to 0, it'll try to set a timer with that length.
|
||||||
|
In human terms, that should trigger instantly (It depends on TEST_TIMER_FREQ.
|
||||||
|
The default configuration is 1MHz. Some boards configure 32768kHz, which is the
|
||||||
|
slowest configuration currently. So each line should trigger after at most
|
||||||
|
31us.).
|
||||||
|
|
||||||
|
See this example of a timer_set() implementation:
|
||||||
|
|
||||||
|
int timer_set(tim_t dev, int channel, unsigned int timeout)
|
||||||
|
{
|
||||||
|
return timer_set_absolute(dev, channel, timer_read(dev) + timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
This will probably underflow if "timeout" is 0, or if an ISR interrupts
|
||||||
|
somewhere between the read and the timerSet_absolute() call.
|
||||||
|
Depending on the used frequency of the underlying timer and the time it
|
||||||
|
requires for the involved function calls, reading the timer register, doing the
|
||||||
|
addition and writing back to the register, this will also fail for higher
|
||||||
|
timeouts.
|
||||||
|
|
||||||
|
For example, as of this writing (30-Oct-19), samr21-xpro fails for values below
|
||||||
|
8, nrf52dk for values below 2.
|
||||||
|
|
||||||
|
## Expected Result
|
||||||
|
|
||||||
|
After 100 "interval N ok" messages the test should print "TEST SUCCEEDED".
|
||||||
|
On failure, the test will print "TEST FAILED".
|
||||||
83
tests/periph_timer_short_relative_set/main.c
Normal file
83
tests/periph_timer_short_relative_set/main.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 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 Peripheral timer test application
|
||||||
|
*
|
||||||
|
* @author Kaspar Schleiser <kaspar@schleiser.de>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
#include "thread.h"
|
||||||
|
#include "thread_flags.h"
|
||||||
|
|
||||||
|
#include "periph/timer.h"
|
||||||
|
|
||||||
|
#ifndef TEST_TIMER_DEV
|
||||||
|
# include "xtimer.h"
|
||||||
|
# define TEST_TIMER_DEV XTIMER_DEV
|
||||||
|
# define TEST_TIMER_FREQ XTIMER_HZ
|
||||||
|
#else
|
||||||
|
# ifndef TEST_TIMER_FREQ
|
||||||
|
# define TEST_TIMER_FREQ (1000000LU)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TEST_MAX_DIFF
|
||||||
|
#define TEST_MAX_DIFF (1000LU)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void cb(void *arg, int chan)
|
||||||
|
{
|
||||||
|
(void)chan;
|
||||||
|
thread_flags_set(arg, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
puts("\nTest for peripheral TIMER short timer_set()\n");
|
||||||
|
|
||||||
|
printf("This test tries timer_set() with decreasing intervals down to 0.\n"
|
||||||
|
"You should see lines like 'interval <n> ok', followed by a success"
|
||||||
|
" message.\n"
|
||||||
|
"On failure, this test prints an error message.\n\n");
|
||||||
|
|
||||||
|
printf("testing periph_timer %u, freq %lu\n", TEST_TIMER_DEV, TEST_TIMER_FREQ);
|
||||||
|
timer_init(TEST_TIMER_DEV, TEST_TIMER_FREQ, cb, (thread_t *)sched_active_thread);
|
||||||
|
|
||||||
|
uint32_t interval = 100;
|
||||||
|
while (interval--) {
|
||||||
|
uint32_t before = timer_read(TEST_TIMER_DEV);
|
||||||
|
timer_set(TEST_TIMER_DEV, 0, interval);
|
||||||
|
while(!thread_flags_clear(1)) {
|
||||||
|
uint32_t diff = timer_read(TEST_TIMER_DEV) - before;
|
||||||
|
if (diff > TEST_MAX_DIFF) {
|
||||||
|
printf("ERROR: too long delay, aborted after %" PRIu32
|
||||||
|
" (TEST_MAX_DIFF=%lu)\n"
|
||||||
|
"TEST FAILED\n",
|
||||||
|
diff, TEST_MAX_DIFF);
|
||||||
|
while(1) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("interval %" PRIu32 " ok\n", interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("\nTEST SUCCEEDED");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
18
tests/periph_timer_short_relative_set/tests/01-run.py
Executable file
18
tests/periph_timer_short_relative_set/tests/01-run.py
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright (C) 2019 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.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from testrunner import run
|
||||||
|
|
||||||
|
|
||||||
|
def testfunc(child):
|
||||||
|
child.expect_exact('TEST SUCCEEDED')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(run(testfunc))
|
||||||
Loading…
x
Reference in New Issue
Block a user