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. | |
| Timer * | timer_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
Definition in file timer.h.
Define Documentation
| #define synctimer_abort | ( | t | ) | timer_abort(t) |
- See also:
- timer_abort
Function Documentation
| 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().
| void timer_add | ( | Timer * | timer | ) |
| void timer_busyWait | ( | hptime_t | delay | ) |
| 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()
| 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
| 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].
| void timer_delayHp | ( | hptime_t | delay | ) |
| void timer_delayTicks | ( | ticks_t | delay | ) |
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
