Contiki 2.6

rtimer.h

Go to the documentation of this file.
00001 /** \addtogroup sys
00002  * @{ */
00003 
00004 /**
00005  * \defgroup rt Real-time task scheduling
00006  *
00007  * The real-time module handles the scheduling and execution of
00008  * real-time tasks (with predictable execution times).
00009  *
00010  * @{
00011  */
00012 
00013 /**
00014  * \file
00015  *         Header file for the real-time timer module.
00016  * \author
00017  *         Adam Dunkels <adam@sics.se>
00018  *
00019  */
00020 
00021 /*
00022  * Copyright (c) 2005, Swedish Institute of Computer Science
00023  * All rights reserved.
00024  *
00025  * Redistribution and use in source and binary forms, with or without
00026  * modification, are permitted provided that the following conditions
00027  * are met:
00028  * 1. Redistributions of source code must retain the above copyright
00029  *    notice, this list of conditions and the following disclaimer.
00030  * 2. Redistributions in binary form must reproduce the above copyright
00031  *    notice, this list of conditions and the following disclaimer in the
00032  *    documentation and/or other materials provided with the distribution.
00033  * 3. Neither the name of the Institute nor the names of its contributors
00034  *    may be used to endorse or promote products derived from this software
00035  *    without specific prior written permission.
00036  *
00037  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00038  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00039  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00040  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00041  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00042  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00043  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00044  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00045  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00046  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00047  * SUCH DAMAGE.
00048  *
00049  * This file is part of the Contiki operating system.
00050  *
00051  * @(#)$Id: rtimer.h,v 1.12 2010/09/13 20:46:02 nifi Exp $
00052  */
00053 #ifndef __RTIMER_H__
00054 #define __RTIMER_H__
00055 
00056 #include "contiki-conf.h"
00057 
00058 #ifndef RTIMER_CLOCK_LT
00059 typedef unsigned short rtimer_clock_t;
00060 #define RTIMER_CLOCK_LT(a,b)     ((signed short)((a)-(b)) < 0)
00061 #endif /* RTIMER_CLOCK_LT */
00062 
00063 #include "rtimer-arch.h"
00064 
00065 /**
00066  * \brief      Initialize the real-time scheduler.
00067  *
00068  *             This function initializes the real-time scheduler and
00069  *             must be called at boot-up, before any other functions
00070  *             from the real-time scheduler is called.
00071  */
00072 void rtimer_init(void);
00073 
00074 struct rtimer;
00075 typedef void (* rtimer_callback_t)(struct rtimer *t, void *ptr);
00076 
00077 /**
00078  * \brief      Representation of a real-time task
00079  *
00080  *             This structure represents a real-time task and is used
00081  *             by the real-time module and the architecture specific
00082  *             support module for the real-time module.
00083  */
00084 struct rtimer {
00085   rtimer_clock_t time;
00086   rtimer_callback_t func;
00087   void *ptr;
00088 };
00089 
00090 enum {
00091   RTIMER_OK,
00092   RTIMER_ERR_FULL,
00093   RTIMER_ERR_TIME,
00094   RTIMER_ERR_ALREADY_SCHEDULED,
00095 };
00096 
00097 /**
00098  * \brief      Post a real-time task.
00099  * \param task A pointer to the task variable previously declared with RTIMER_TASK().
00100  * \param time The time when the task is to be executed.
00101  * \param duration Unused argument.
00102  * \param func A function to be called when the task is executed.
00103  * \param ptr An opaque pointer that will be supplied as an argument to the callback function.
00104  * \return     Non-zero (true) if the task could be scheduled, zero
00105  *             (false) if the task could not be scheduled.
00106  *
00107  *             This function schedules a real-time task at a specified
00108  *             time in the future.
00109  *
00110  */
00111 int rtimer_set(struct rtimer *task, rtimer_clock_t time,
00112                rtimer_clock_t duration, rtimer_callback_t func, void *ptr);
00113 
00114 /**
00115  * \brief      Execute the next real-time task and schedule the next task, if any
00116  *
00117  *             This function is called by the architecture dependent
00118  *             code to execute and schedule the next real-time task.
00119  *
00120  */
00121 void rtimer_run_next(void);
00122 
00123 /**
00124  * \brief      Get the current clock time
00125  * \return     The current time
00126  *
00127  *             This function returns what the real-time module thinks
00128  *             is the current time. The current time is used to set
00129  *             the timeouts for real-time tasks.
00130  *
00131  * \hideinitializer
00132  */
00133 #define RTIMER_NOW() rtimer_arch_now()
00134 
00135 /**
00136  * \brief      Get the time that a task last was executed
00137  * \param task The task
00138  * \return     The time that a task last was executed
00139  *
00140  *             This function returns the time that the task was last
00141  *             executed. This typically is used to get a periodic
00142  *             execution of a task without clock drift.
00143  *
00144  * \hideinitializer
00145  */
00146 #define RTIMER_TIME(task) ((task)->time)
00147 
00148 void rtimer_arch_init(void);
00149 void rtimer_arch_schedule(rtimer_clock_t t);
00150 /*rtimer_clock_t rtimer_arch_now(void);*/
00151 
00152 #define RTIMER_SECOND RTIMER_ARCH_SECOND
00153 
00154 #endif /* __RTIMER_H__ */
00155 
00156 /** @} */
00157 /** @} */