Loading...
Searching...
No Matches
xtimer.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de>
3 * Copyright (C) 2016 Eistec AB
4 *
5 * This file is subject to the terms and conditions of the GNU Lesser
6 * General Public License v2.1. See the file LICENSE in the top level
7 * directory for more details.
8 */
9
42#ifndef XTIMER_H
43#define XTIMER_H
44
45#include <stdbool.h>
46#include <stdint.h>
47
48#include "modules.h"
49#include "timex.h"
50#ifdef MODULE_CORE_MSG
51#include "msg.h"
52#endif /* MODULE_CORE_MSG */
53#include "mutex.h"
54#include "sched.h"
55#include "rmutex.h"
56
57#if IS_USED(MODULE_ZTIMER64_XTIMER_COMPAT)
58#include "ztimer64/xtimer_compat.h" /* IWYU pragma: export */
59#elif IS_USED(MODULE_ZTIMER_XTIMER_COMPAT)
60#include "ztimer/xtimer_compat.h" /* IWYU pragma: export */
61#else
62#include "board.h"
63#if !IS_USED(MODULE_XTIMER_ON_ZTIMER)
64#include "periph_conf.h"
65#endif
66
67#ifdef __cplusplus
68extern "C" {
69#endif
70
76typedef struct {
77 uint64_t ticks64;
79
85typedef struct {
86 uint32_t ticks32;
88
92typedef void (*xtimer_callback_t)(void*);
93
97typedef struct xtimer {
98 struct xtimer *next;
99 uint32_t offset;
100 uint32_t long_offset;
101 uint32_t start_time;
105 void *arg;
107
116static inline xtimer_ticks32_t xtimer_now(void);
117
123static inline xtimer_ticks64_t xtimer_now64(void);
124
131
137static inline uint32_t xtimer_now_usec(void);
138
144static inline uint64_t xtimer_now_usec64(void);
145
152void xtimer_init(void);
153
163static inline void xtimer_sleep(uint32_t seconds);
164
170static inline void xtimer_msleep(uint32_t milliseconds);
171
181static inline void xtimer_usleep(uint32_t microseconds);
182
190static inline void xtimer_usleep64(uint64_t microseconds);
191
207static inline void xtimer_nanosleep(uint32_t nanoseconds);
208
218static inline void xtimer_tsleep32(xtimer_ticks32_t ticks);
219
229static inline void xtimer_tsleep64(xtimer_ticks64_t ticks);
230
238static inline void xtimer_spin(xtimer_ticks32_t ticks);
239
257static inline void xtimer_periodic_wakeup(xtimer_ticks32_t *last_wakeup, uint32_t period);
258
269static inline void xtimer_set_wakeup(xtimer_t *timer, uint32_t offset, kernel_pid_t pid);
270
281static inline void xtimer_set_wakeup64(xtimer_t *timer, uint64_t offset, kernel_pid_t pid);
282
299static inline void xtimer_set(xtimer_t *timer, uint32_t offset);
300
318static inline void xtimer_set64(xtimer_t *timer, uint64_t offset_us);
319
328
334static inline bool xtimer_is_set(const xtimer_t *timer);
335
343static inline xtimer_ticks32_t xtimer_ticks_from_usec(uint32_t usec);
344
352static inline xtimer_ticks64_t xtimer_ticks_from_usec64(uint64_t usec);
353
361static inline uint32_t xtimer_usec_from_ticks(xtimer_ticks32_t ticks);
362
370static inline uint64_t xtimer_usec_from_ticks64(xtimer_ticks64_t ticks);
371
379static inline xtimer_ticks32_t xtimer_ticks(uint32_t ticks);
380
388static inline xtimer_ticks64_t xtimer_ticks64(uint64_t ticks);
389
399
409
419
429
439
449int xtimer_mutex_lock_timeout(mutex_t *mutex, uint64_t us);
450
460int xtimer_rmutex_lock_timeout(rmutex_t *rmutex, uint64_t us);
461
462#if defined(MODULE_CORE_THREAD_FLAGS) || defined(DOXYGEN)
463
473void xtimer_set_timeout_flag(xtimer_t *t, uint32_t timeout);
474
483void xtimer_set_timeout_flag64(xtimer_t *t, uint64_t timeout);
484#endif
485
494uint64_t xtimer_left_usec(const xtimer_t *timer);
495
496#if defined(MODULE_CORE_MSG) || defined(DOXYGEN)
511static inline void xtimer_set_msg(xtimer_t *timer, uint32_t offset, msg_t *msg, kernel_pid_t target_pid);
512
527static inline void xtimer_set_msg64(xtimer_t *timer, uint64_t offset, msg_t *msg, kernel_pid_t target_pid);
528
538static inline int xtimer_msg_receive_timeout(msg_t *msg, uint32_t timeout);
539
549static inline int xtimer_msg_receive_timeout64(msg_t *msg, uint64_t timeout);
550#endif
551
560#ifndef XTIMER_BACKOFF
561#define XTIMER_BACKOFF 30
562#endif
563
564#ifndef XTIMER_ISR_BACKOFF
573#define XTIMER_ISR_BACKOFF 20
574#endif
575
576/*
577 * Default xtimer configuration
578 */
579#ifndef XTIMER_DEV
583#define XTIMER_DEV TIMER_DEV(0)
587#define XTIMER_CHAN (0)
588
589#if (TIMER_0_MAX_VALUE) == 0xfffffful
590#define XTIMER_WIDTH (24)
591#elif (TIMER_0_MAX_VALUE) == 0xffff
592#define XTIMER_WIDTH (16)
593#endif
594
595#endif
596
597#ifndef XTIMER_WIDTH
604#define XTIMER_WIDTH (32)
605#endif
606
607#if (XTIMER_WIDTH != 32) || DOXYGEN
617#define XTIMER_MASK ((0xffffffff >> XTIMER_WIDTH) << XTIMER_WIDTH)
618#else
619#define XTIMER_MASK (0)
620#endif
621
625#define XTIMER_HZ_BASE (1000000ul)
626
627#if !defined(XTIMER_HZ) && !defined(MODULE_XTIMER_ON_ZTIMER)
631#define XTIMER_HZ XTIMER_HZ_BASE
632#endif
633
634#if !defined(XTIMER_SHIFT) && !defined(MODULE_XTIMER_ON_ZTIMER)
635#if (XTIMER_HZ == 32768ul)
636/* No shift necessary, the conversion is not a power of two and is handled by
637 * functions in tick_conversion.h */
638#define XTIMER_SHIFT (0)
639#elif (XTIMER_HZ == XTIMER_HZ_BASE)
655#define XTIMER_SHIFT (0)
656#elif (XTIMER_HZ >> 1 == XTIMER_HZ_BASE) || (XTIMER_HZ << 1 == XTIMER_HZ_BASE)
657#define XTIMER_SHIFT (1)
658#elif (XTIMER_HZ >> 2 == XTIMER_HZ_BASE) || (XTIMER_HZ << 2 == XTIMER_HZ_BASE)
659#define XTIMER_SHIFT (2)
660#elif (XTIMER_HZ >> 3 == XTIMER_HZ_BASE) || (XTIMER_HZ << 3 == XTIMER_HZ_BASE)
661#define XTIMER_SHIFT (3)
662#elif (XTIMER_HZ >> 4 == XTIMER_HZ_BASE) || (XTIMER_HZ << 4 == XTIMER_HZ_BASE)
663#define XTIMER_SHIFT (4)
664#elif (XTIMER_HZ >> 5 == XTIMER_HZ_BASE) || (XTIMER_HZ << 5 == XTIMER_HZ_BASE)
665#define XTIMER_SHIFT (5)
666#elif (XTIMER_HZ >> 6 == XTIMER_HZ_BASE) || (XTIMER_HZ << 6 == XTIMER_HZ_BASE)
667#define XTIMER_SHIFT (6)
668#else
669#error "XTIMER_SHIFT cannot be derived for given XTIMER_HZ, verify settings!"
670#endif
671#elif !defined(MODULE_XTIMER_ON_ZTIMER)
672#error "XTIMER_SHIFT is set relative to XTIMER_HZ, no manual define required!"
673#endif
674
676
678
679#ifdef __cplusplus
680}
681#endif
682
683#endif /* MODULE_ZTIMER_XTIMER_COMPAT */
684
686#endif /* XTIMER_H */
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:139
void xtimer_set_timeout_flag64(xtimer_t *t, uint64_t timeout)
Set timeout thread flag after timeout.
static void xtimer_usleep(uint32_t microseconds)
Pause the execution of a thread for some microseconds.
static xtimer_ticks32_t xtimer_diff(xtimer_ticks32_t a, xtimer_ticks32_t b)
Compute difference between two xtimer time stamps.
static uint32_t xtimer_now_usec(void)
get the current system time in microseconds since start
static xtimer_ticks64_t xtimer_ticks_from_usec64(uint64_t usec)
Convert microseconds to xtimer ticks, 64 bit version.
static void xtimer_set_msg64(xtimer_t *timer, uint64_t offset, msg_t *msg, kernel_pid_t target_pid)
Set a timer that sends a message, 64bit version.
void xtimer_remove(xtimer_t *timer)
remove a timer
static void xtimer_set_wakeup64(xtimer_t *timer, uint64_t offset, kernel_pid_t pid)
Set a timer that wakes up a thread, 64bit version.
static bool xtimer_less64(xtimer_ticks64_t a, xtimer_ticks64_t b)
Compare two xtimer time stamps, 64 bit version.
static xtimer_ticks64_t xtimer_now64(void)
get the current system time as 64bit time stamp
static void xtimer_set64(xtimer_t *timer, uint64_t offset_us)
Set a timer to execute a callback at some time in the future, 64bit version.
void(* xtimer_callback_t)(void *)
xtimer callback type
Definition xtimer.h:92
static void xtimer_tsleep32(xtimer_ticks32_t ticks)
Stop execution of a thread for some time, 32bit version.
static void xtimer_msleep(uint32_t milliseconds)
Pause the execution of a thread for some milliseconds.
static void xtimer_sleep(uint32_t seconds)
Pause the execution of a thread for some seconds.
static xtimer_ticks32_t xtimer_diff32_64(xtimer_ticks64_t a, xtimer_ticks64_t b)
Compute 32 bit difference between two 64 bit xtimer time stamps.
int xtimer_rmutex_lock_timeout(rmutex_t *rmutex, uint64_t us)
lock a rmutex but with timeout
static xtimer_ticks64_t xtimer_ticks64(uint64_t ticks)
Create an xtimer time stamp, 64 bit version.
static void xtimer_periodic_wakeup(xtimer_ticks32_t *last_wakeup, uint32_t period)
will cause the calling thread to be suspended until the absolute time (last_wakeup + period).
static void xtimer_set_msg(xtimer_t *timer, uint32_t offset, msg_t *msg, kernel_pid_t target_pid)
Set a timer that sends a message.
static bool xtimer_less(xtimer_ticks32_t a, xtimer_ticks32_t b)
Compare two xtimer time stamps.
static uint32_t xtimer_usec_from_ticks(xtimer_ticks32_t ticks)
Convert xtimer ticks to microseconds.
static xtimer_ticks64_t xtimer_diff64(xtimer_ticks64_t a, xtimer_ticks64_t b)
Compute difference between two xtimer time stamps, 64 bit version.
int xtimer_mutex_lock_timeout(mutex_t *mutex, uint64_t us)
lock a mutex but with timeout
static void xtimer_usleep64(uint64_t microseconds)
Pause the execution of a thread for some microseconds.
static int xtimer_msg_receive_timeout(msg_t *msg, uint32_t timeout)
receive a message blocking but with timeout
void xtimer_now_timex(timex_t *out)
get the current system time into a timex_t
void xtimer_set_timeout_flag(xtimer_t *t, uint32_t timeout)
Set timeout thread flag after timeout.
static void xtimer_tsleep64(xtimer_ticks64_t ticks)
Stop execution of a thread for some time, 64bit version.
static void xtimer_nanosleep(uint32_t nanoseconds)
Stop execution of a thread for some time.
static void xtimer_set_wakeup(xtimer_t *timer, uint32_t offset, kernel_pid_t pid)
Set a timer that wakes up a thread.
void xtimer_init(void)
xtimer initialization function
static void xtimer_spin(xtimer_ticks32_t ticks)
Stop execution of a thread for some time, blocking.
static uint64_t xtimer_now_usec64(void)
get the current system time in microseconds since start
static void xtimer_set(xtimer_t *timer, uint32_t offset)
Set a timer to execute a callback at some time in the future.
static xtimer_ticks32_t xtimer_ticks_from_usec(uint32_t usec)
Convert microseconds to xtimer ticks.
struct xtimer xtimer_t
xtimer timer structure
static xtimer_ticks32_t xtimer_ticks(uint32_t ticks)
Create an xtimer time stamp.
static xtimer_ticks32_t xtimer_now(void)
get the current system time as 32bit time stamp value
static bool xtimer_is_set(const xtimer_t *timer)
state if an xtimer is currently set (waiting to be expired)
static uint64_t xtimer_usec_from_ticks64(xtimer_ticks64_t ticks)
Convert xtimer ticks to microseconds, 64 bit version.
static int xtimer_msg_receive_timeout64(msg_t *msg, uint64_t timeout)
receive a message blocking but with timeout, 64bit version
uint64_t xtimer_left_usec(const xtimer_t *timer)
Get remaining time of timer.
xtimer implementation
Common macros and compiler attributes/pragmas configuration.
Mutex for thread synchronization.
Recursive Mutex for thread synchronization.
Scheduler API definition.
Describes a message object which can be sent between threads.
Definition msg.h:196
Mutex structure.
Definition mutex.h:146
Mutex structure.
Definition rmutex.h:38
A timex timestamp.
Definition timex.h:49
xtimer timestamp (32 bit)
Definition xtimer.h:85
uint32_t ticks32
Tick count.
Definition xtimer.h:86
xtimer timestamp (64 bit)
Definition xtimer.h:76
uint64_t ticks64
Tick count.
Definition xtimer.h:77
xtimer timer structure
Definition xtimer.h:97
uint32_t long_offset
upper 32bit offset time
Definition xtimer.h:100
struct xtimer * next
reference to next timer in timer lists
Definition xtimer.h:98
void * arg
argument to pass to callback function
Definition xtimer.h:105
uint32_t start_time
lower 32bit absolute start time
Definition xtimer.h:101
uint32_t long_start_time
upper 32bit absolute start time
Definition xtimer.h:102
xtimer_callback_t callback
callback function to call when timer expires
Definition xtimer.h:103
uint32_t offset
lower 32bit offset time
Definition xtimer.h:99
xtimer tick <-> seconds conversions for different values of XTIMER_HZ
Utility library for comparing and computing timestamps.
ztimer64 xtimer wrapper interface
ztimer xtimer wrapper interface