Contiki-NG
Loading...
Searching...
No Matches
rtimer.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2005, Swedish Institute of Computer Science
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the Institute nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * This file is part of the Contiki operating system.
30 *
31 */
32
33/**
34 * \file
35 * Header file for the real-time timer module.
36 * \author
37 * Adam Dunkels <adam@sics.se>
38 *
39 */
40
41/** \addtogroup threads
42 * @{ */
43
44/**
45 * \defgroup rt Real-time task scheduling
46 *
47 * The real-time module handles the scheduling and execution of
48 * real-time tasks (with predictable execution times).
49 *
50 * @{
51 */
52
53#ifndef RTIMER_H_
54#define RTIMER_H_
55
56#include "contiki.h"
57#include "dev/watchdog.h"
58#include <stdbool.h>
59
60/*---------------------------------------------------------------------------*/
61
62/** \brief The rtimer size (in bytes) */
63#ifdef RTIMER_CONF_CLOCK_SIZE
64#define RTIMER_CLOCK_SIZE RTIMER_CONF_CLOCK_SIZE
65#else /* RTIMER_CONF_CLOCK_SIZE */
66/* Default: 32bit rtimer*/
67#define RTIMER_CLOCK_SIZE 4
68#endif /* RTIMER_CONF_CLOCK_SIZE */
69
70#if RTIMER_CLOCK_SIZE == 2
71/* 16-bit rtimer */
72typedef uint16_t rtimer_clock_t;
73#define RTIMER_CLOCK_DIFF(a,b) ((int16_t)((a)-(b)))
74
75#elif RTIMER_CLOCK_SIZE == 4
76/* 32-bit rtimer */
77typedef uint32_t rtimer_clock_t;
78#define RTIMER_CLOCK_DIFF(a, b) ((int32_t)((a) - (b)))
79
80#elif RTIMER_CLOCK_SIZE == 8
81/* 64-bit rtimer */
82typedef uint64_t rtimer_clock_t;
83#define RTIMER_CLOCK_DIFF(a,b) ((int64_t)((a)-(b)))
84
85#else
86#error Unsupported rtimer size (check RTIMER_CLOCK_SIZE)
87#endif
88
89#define RTIMER_CLOCK_MAX ((rtimer_clock_t)-1)
90#define RTIMER_CLOCK_LT(a, b) (RTIMER_CLOCK_DIFF((a),(b)) < 0)
91
92#include "rtimer-arch.h"
93
94
95/*
96 * RTIMER_GUARD_TIME is the minimum amount of rtimer ticks between
97 * the current time and the future time when a rtimer is scheduled.
98 * Necessary to avoid accidentally scheduling a rtimer in the past
99 * on platforms with fast rtimer ticks. Should be >= 2.
100 */
101#ifdef RTIMER_CONF_GUARD_TIME
102#define RTIMER_GUARD_TIME RTIMER_CONF_GUARD_TIME
103#else /* RTIMER_CONF_GUARD_TIME */
104#define RTIMER_GUARD_TIME (RTIMER_ARCH_SECOND >> 14)
105#endif /* RTIMER_CONF_GUARD_TIME */
106
107/*---------------------------------------------------------------------------*/
108
109/**
110 * Number of rtimer ticks for 1 second.
111 */
112#define RTIMER_SECOND RTIMER_ARCH_SECOND
113
114/**
115 * \brief Initialize the real-time scheduler.
116 *
117 * This function initializes the real-time scheduler and
118 * must be called at boot-up, before any other functions
119 * from the real-time scheduler is called.
120 *
121 * \hideinitializer
122 */
123#define rtimer_init() rtimer_arch_init()
124
125struct rtimer;
126typedef void (* rtimer_callback_t)(struct rtimer *t, void *ptr);
127
128/**
129 * \brief Representation of a real-time task
130 *
131 * This structure represents a real-time task and is used
132 * by the real-time module and the architecture specific
133 * support module for the real-time module.
134 */
135struct rtimer {
136 rtimer_clock_t time;
137 rtimer_callback_t func;
138 void *ptr;
139};
140
141/**
142 * TODO: we need to document meanings of these symbols.
143 */
144enum {
145 RTIMER_OK, /**< rtimer task is scheduled successfully */
146 RTIMER_ERR_FULL,
147 RTIMER_ERR_TIME,
148 RTIMER_ERR_ALREADY_SCHEDULED,
149};
150
151/**
152 * \brief Post a real-time task.
153 * \param task A pointer to the task variable allocated somewhere.
154 * \param time The time when the task is to be executed.
155 * \param duration Unused argument.
156 * \param func A function to be called when the task is executed.
157 * \param ptr An opaque pointer that will be supplied as an argument to the callback function.
158 * \return RTIMER_OK if the task could be scheduled. Any other value indicates
159 * the task could not be scheduled.
160 *
161 * This function schedules a real-time task at a specified
162 * time in the future.
163 *
164 */
165int rtimer_set(struct rtimer *task, rtimer_clock_t time,
166 rtimer_clock_t duration, rtimer_callback_t func, void *ptr);
167
168/**
169 * \brief Execute the next real-time task and schedule the next task, if any
170 *
171 * This function is called by the architecture dependent
172 * code to execute and schedule the next real-time task.
173 *
174 */
175void rtimer_run_next(void);
176
177/**
178 * \brief Get the current clock time
179 * \return The current time
180 *
181 * This function returns what the real-time module thinks
182 * is the current time. The current time is used to set
183 * the timeouts for real-time tasks.
184 *
185 * \hideinitializer
186 */
187#define RTIMER_NOW() rtimer_arch_now()
188
189/**
190 * \brief Get the time that a task last was executed
191 * \param task The task
192 * \return The time that a task last was executed
193 *
194 * This function returns the time that the task was last
195 * executed. This typically is used to get a periodic
196 * execution of a task without clock drift.
197 *
198 * \hideinitializer
199 */
200#define RTIMER_TIME(task) ((task)->time)
201
202/** \brief Busy-wait until a condition. Start time is t0, max wait time is max_time */
203#ifndef RTIMER_BUSYWAIT_UNTIL_ABS
204#define RTIMER_BUSYWAIT_UNTIL_ABS(cond, t0, max_time) \
205 ({ \
206 bool c; \
207 while(!(c = cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), (t0) + (max_time))); \
208 c; \
209 })
210#endif /* RTIMER_BUSYWAIT_UNTIL_ABS */
211
212/** \brief Busy-wait until a condition for at most max_time */
213#define RTIMER_BUSYWAIT_UNTIL(cond, max_time) \
214 ({ \
215 rtimer_clock_t t0 = RTIMER_NOW(); \
216 RTIMER_BUSYWAIT_UNTIL_ABS(cond, t0, max_time); \
217 })
218
219/** \brief Busy-wait for a fixed duration */
220#define RTIMER_BUSYWAIT(duration) RTIMER_BUSYWAIT_UNTIL(0, duration)
221
222/*---------------------------------------------------------------------------*/
223
224/**
225 * \name Architecture-dependent symbols
226 *
227 * The functions declared in this section must be defined in
228 * architecture-dependent implementation of rtimer. Alternatively,
229 * they can be defined as macros in rtimer-arch.h.
230 *
231 * In addition, the architecture-dependent header (rtimer-arch.h)
232 * must define the following macros.
233 *
234 * - RTIMER_ARCH_SECOND
235 * - US_TO_RTIMERTICKS(us)
236 * - RTIMERTICKS_TO_US(t)
237 * - RTIMERTICKS_TO_US_64(t)
238 *
239 * @{
240 */
241
242/**
243 * Initialized the architecture-dependent part of rtimer.
244 */
245void rtimer_arch_init(void);
246
247/**
248 * \brief Schedules an rtimer task to be triggered at time t
249 * \param t The time when the task will need executed.
250 *
251 * \e t is an absolute time, in other words the task will be executed AT
252 * time \e t, not IN \e t rtimer ticks.
253 *
254 */
255void rtimer_arch_schedule(rtimer_clock_t t);
256
257/*
258 * Return the current time in rtimer ticks.
259 *
260 * Currently rtimer_arch_now() needs to be defined in rtimer-arch.h
261 */
262/* rtimer_clock_t rtimer_arch_now(void); */
263
264/** @} */
265
266#endif /* RTIMER_H_ */
267
268/** @} */
269/** @} */
int rtimer_set(struct rtimer *rtimer, rtimer_clock_t time, rtimer_clock_t duration, rtimer_callback_t func, void *ptr)
Post a real-time task.
Definition rtimer.c:57
void rtimer_arch_init(void)
Initialized the architecture-dependent part of rtimer.
Definition rtimer-arch.c:59
void rtimer_run_next(void)
Execute the next real-time task and schedule the next task, if any.
Definition rtimer.c:78
void rtimer_arch_schedule(rtimer_clock_t t)
Schedules an rtimer task to be triggered at time t.
Definition rtimer-arch.c:65
@ RTIMER_OK
rtimer task is scheduled successfully
Definition rtimer.h:145
Representation of a real-time task.
Definition rtimer.h:135