From b8056b9c9750c3330c5546dda4b28ded5d032dd6 Mon Sep 17 00:00:00 2001 From: Jesus Sanchez-Palencia Date: Thu, 2 Jul 2015 14:42:03 -0300 Subject: [PATCH] examples: Add all-timers example This commit adds a very simple example which is useful to verify that all timers APIs are working. There are 3 protothreads running, the first process tests etimer, timer and stimer APIs, the second process tests the ctimer APIs, and the third one tests the rtimer APIs. --- examples/timers/Makefile | 5 ++ examples/timers/all-timers.c | 131 +++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 examples/timers/Makefile create mode 100644 examples/timers/all-timers.c diff --git a/examples/timers/Makefile b/examples/timers/Makefile new file mode 100644 index 000000000..d5b2a2846 --- /dev/null +++ b/examples/timers/Makefile @@ -0,0 +1,5 @@ +CONTIKI_PROJECT = all-timers +all: $(CONTIKI_PROJECT) + +CONTIKI = ../.. +include $(CONTIKI)/Makefile.include diff --git a/examples/timers/all-timers.c b/examples/timers/all-timers.c new file mode 100644 index 000000000..60eb56651 --- /dev/null +++ b/examples/timers/all-timers.c @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2015, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "contiki.h" +#include "sys/etimer.h" +#include "sys/stimer.h" +#include "sys/timer.h" +#include "sys/rtimer.h" + +PROCESS(process1, "ETimer x Timer x STimer Process"); +PROCESS(process2, "CTimer Process 2"); +PROCESS(process3, "RTimer Process 3"); +AUTOSTART_PROCESSES(&process1, &process2, &process3); + +static int counter_etimer; +static int counter_timer; +static int counter_stimer; +static int counter_ctimer; +static int counter_rtimer; +static struct timer timer_timer; +static struct stimer timer_stimer; +static struct ctimer timer_ctimer; +static struct rtimer timer_rtimer; +static rtimer_clock_t timeout_rtimer = RTIMER_SECOND / 2; + +void +do_timeout1() +{ + counter_etimer++; + if(timer_expired(&timer_timer)) { + counter_timer++; + } + + if(stimer_expired(&timer_stimer)) { + counter_stimer++; + } + + printf("\nProcess 1: %s", counter_timer == counter_etimer + && counter_timer == counter_stimer ? "SUCCESS" : "FAIL"); +} +/*---------------------------------------------------------------------------*/ +void +do_timeout2() +{ + ctimer_reset(&timer_ctimer); + printf("\nProcess 2: CTimer callback called"); + counter_ctimer++; +} +/*---------------------------------------------------------------------------*/ +void +do_timeout3(struct rtimer *timer, void *ptr) +{ + counter_rtimer++; + + printf("\nProcess 3: RTimer callback called"); + + /* Re-arm rtimer */ + rtimer_set(&timer_rtimer, RTIMER_NOW() + timeout_rtimer, 0, do_timeout3, + NULL); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(process1, ev, data) +{ + static struct etimer timer_etimer; + + PROCESS_BEGIN(); + + while(1) { + timer_set(&timer_timer, 3 * CLOCK_SECOND); + stimer_set(&timer_stimer, 3); + etimer_set(&timer_etimer, 3 * CLOCK_SECOND); + PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER); + do_timeout1(); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(process2, ev, data) +{ + PROCESS_BEGIN(); + + while(1) { + ctimer_set(&timer_ctimer, 5 * CLOCK_SECOND, do_timeout2, NULL); + PROCESS_YIELD(); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(process3, ev, data) +{ + PROCESS_BEGIN(); + + while(1) { + rtimer_set(&timer_rtimer, RTIMER_NOW() + timeout_rtimer, 0, + do_timeout3, NULL); + PROCESS_YIELD(); + } + + PROCESS_END(); +}