timer.h File Reference

Hardware independent timer driver. More...

#include <cfg/os.h>
#include <cfg/macros.h>
#include <cpu/attr.h>
#include <cpu/irq.h>
#include <emul/timer_posix.h>
#include "cfg/cfg_timer.h"
#include <cfg/debug.h>
#include <cfg/compiler.h>
#include <struct/list.h>
#include <mware/event.h>

Go to the source code of this file.

Data Structures

struct  Timer
 The timer driver supports multiple synchronous timers that can trigger an event when they expire. More...

Defines

#define synctimer_abort(t)   timer_abort(t)

Functions

ticks_t timer_clock (void)
 Return the system tick counter (expressed in ticks).
ticks_t timer_clock_unlocked (void)
 Faster version of timer_clock(), to be called only when the timer interrupt is disabled (DISABLE_INTS) or overridden by a higher-priority or non-nesting interrupt.
ticks_t ms_to_ticks (mtime_t ms)
 Convert ms [ms] to ticks.
ticks_t us_to_ticks (utime_t us)
 Convert us [us] to ticks.
mtime_t ticks_to_ms (ticks_t ticks)
 Convert ticks [ticks] to ms.
utime_t ticks_to_us (ticks_t ticks)
 Convert ticks [ticks] to us.
hptime_t us_to_hptime (utime_t us)
 Convert us [us] to hpticks.
utime_t hptime_to_us (hptime_t hpticks)
 Convert hpticks [hptime] to usec.
void timer_delayTicks (ticks_t delay)
 Wait for the specified amount of timer ticks.
void timer_delay (mtime_t delay)
 Wait some time [ms].
void timer_busyWait (hptime_t delay)
 Busy wait until the specified amount of high-precision ticks have elapsed.
void timer_delayHp (hptime_t delay)
 Wait for the specified amount of time (expressed in microseconds).
void timer_add (Timer *timer)
 Add the specified timer to the software timer service queue.
Timertimer_abort (Timer *timer)
 Remove a timer from the timers queue before it has expired.
void timer_setSoftint (Timer *timer, Hook func, iptr_t user_data)
 Set the timer so that it calls an user hook when it expires.
void timer_setDelay (Timer *timer, ticks_t delay)
 Set the timer delay (the time before the event will be triggered).
void synctimer_add (Timer *timer, List *q)
 Add timer to queue.
void synctimer_poll (List *q)
 Simple synchronous timer based scheduler polling routine.
void timer_setSignal (Timer *timer, struct Process *proc, sigmask_t sigs)
 Set the timer so that it sends a signal when it expires.

Variables

volatile ticks_t _clock
 Master system clock (1 tick accuracy).

Detailed Description

Hardware independent timer driver.

All timer related functions are implemented in this module. You have several options to use timers:

  • simple delay: just use timer_delay() if you want to wait for a few milliseconds;
  • delay with callback: create a timer structure and use timer_setDelay() and timer_setSoftint() to set the callback;
  • delay with signal: same as above but use timer_setSignal() to set specify which signal to send.
  • simple synchronous timer based scheduler: use synctimer_add() to schedule an event in a user provided queue.

Whenever a timer expires you need to explicitly arm it again with timer_add(). If you want to abort a timer, use timer_abort(). You can use conversion macros when using msecs to specify the delay.

Version:
Id
timer.h 3132 2010-01-13 10:04:14Z batt
Author:
Bernie Innocenti <bernie@codewiz.org>

Definition in file timer.h.


Define Documentation

#define synctimer_abort (  )     timer_abort(t)
See also:
timer_abort

Definition at line 297 of file timer.h.


Function Documentation

ticks_t ms_to_ticks ( mtime_t  ms  )  [inline]

Convert ms [ms] to ticks.

Definition at line 150 of file timer.h.

void synctimer_add ( Timer timer,
List queue 
)

Add timer to queue.

See also:
synctimer_poll() for details.

Definition at line 213 of file timer.c.

void synctimer_poll ( List queue  ) 

Simple synchronous timer based scheduler polling routine.

Sometimes you would like to have a proper scheduler, but you can't afford it due to memory constraints.

This is a simple replacement: you can create events and call them periodically at specific time intervals. All you have to do is to set up normal timers, and call synctimer_add() instead of timer_add() to add the events to your specific queue. Then, in the main loop or wherever you want, you can call synctimer_poll() to process expired events. The associated callbacks will be executed. As this is done synchronously you don't have to worry about race conditions. You can kill an event by simply calling synctimer_abort().

Definition at line 235 of file timer.c.

mtime_t ticks_to_ms ( ticks_t  ticks  )  [inline]

Convert ticks [ticks] to ms.

Definition at line 174 of file timer.h.

utime_t ticks_to_us ( ticks_t  ticks  )  [inline]

Convert ticks [ticks] to us.

Definition at line 186 of file timer.h.

Timer* timer_abort ( Timer timer  ) 

Remove a timer from the timers queue before it has expired.

Note:
Attempting to remove a timer already expired cause undefined behaviour.

Definition at line 174 of file timer.c.

void timer_add ( Timer timer  ) 

Add the specified timer to the software timer service queue.

When the delay indicated by the timer expires, the timer device will execute the event associated with it.

Note:
Interrupt safe

Definition at line 163 of file timer.c.

void timer_busyWait ( hptime_t  delay  ) 

Busy wait until the specified amount of high-precision ticks have elapsed.

Note:
This function is interrupt safe, the only requirement is a running hardware timer.

Definition at line 284 of file timer.c.

ticks_t timer_clock ( void   )  [inline]

Return the system tick counter (expressed in ticks).

The result is guaranteed to increment monotonically, but client code must be tolerant with respect to overflows.

The following code is safe:

   drop_teabag();
   ticks_t tea_start_time = timer_clock();

   for (;;)
   {
       if (timer_clock() - tea_start_time > TEAPOT_DELAY)
       {
           printf("Your tea, Sir.\n");
           break;
       }
       patience();
   }
Note:
This function must disable interrupts on 8/16bit CPUs because the clock variable is larger than the processor word size and can't be copied atomically.
See also:
timer_delay()

Definition at line 128 of file timer.h.

ticks_t timer_clock_unlocked ( void   )  [inline]

Faster version of timer_clock(), to be called only when the timer interrupt is disabled (DISABLE_INTS) or overridden by a higher-priority or non-nesting interrupt.

See also:
timer_clock

Definition at line 144 of file timer.h.

void timer_delay ( mtime_t  delay  )  [inline]

Wait some time [ms].

Note:
CPU is released while waiting so you don't have to call cpu_relax() explicitly.
Parameters:
delay Time to wait [ms].

Definition at line 224 of file timer.h.

void timer_delayHp ( hptime_t  delay  ) 

Wait for the specified amount of time (expressed in microseconds).

Definition at line 312 of file timer.c.

void timer_delayTicks ( ticks_t  delay  ) 

Wait for the specified amount of timer ticks.

Note:
Sleeping while preemption is disabled fallbacks to a busy wait sleep.

Definition at line 248 of file timer.c.

void timer_setSoftint ( Timer timer,
Hook  func,
iptr_t  user_data 
) [inline]

Set the timer so that it calls an user hook when it expires.

Sometimes you may want to use the same callback for different events, so you must have different data to operate on. The user_data parameter is such data.

Parameters:
timer Timer struct to set the callback to
func Function that will be called when the timer expires
user_data Additional data you may want to pass to the callback

Definition at line 282 of file timer.h.

ticks_t us_to_ticks ( utime_t  us  )  [inline]

Convert us [us] to ticks.

Definition at line 162 of file timer.h.