Loading...
Searching...
No Matches
ztimer64.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 Inria
3 * 2021 Freie Universität Berlin
4 * 2021 Kaspar Schleiser <kaspar@schleiser.de>
5 *
6 * This file is subject to the terms and conditions of the GNU Lesser
7 * General Public License v2.1. See the file LICENSE in the top level
8 * directory for more details.
9 */
10
11#pragma once
12
65
66#include <stdint.h>
67
68#include "irq.h"
69#include "mutex.h"
70#include "msg.h"
71#include "ztimer.h"
72
73#ifdef __cplusplus
74extern "C" {
75#endif
76
85
93
100typedef struct {
102 void (*callback)(void *arg);
103 void *arg;
104} ztimer64_t;
105
113 uint64_t checkpoint;
114 uint16_t adjust_set;
115 uint16_t adjust_sleep;
117#if MODULE_PM_LAYERED || DOXYGEN
119#endif
120};
121
130
139static inline uint64_t ztimer64_offset2absolute(ztimer64_clock_t *clock,
140 uint64_t offset)
141{
142 unsigned state = irq_disable();
143 uint64_t result = ztimer64_now(clock) + offset;
144
145 irq_restore(state);
146 return result;
147}
148
163 uint64_t target);
164
178static inline void ztimer64_set(ztimer64_clock_t *clock, ztimer64_t *timer,
179 uint64_t offset)
180{
181 ztimer64_set_at(clock, timer,
182 ztimer64_offset2absolute(clock, offset));
183}
184
193unsigned ztimer64_is_set(const ztimer64_t *timer);
194
207
223 uint64_t target,
224 msg_t *msg, kernel_pid_t target_pid);
225
241static inline void ztimer64_set_msg(ztimer64_clock_t *clock, ztimer64_t *timer,
242 uint64_t offset,
243 msg_t *msg, kernel_pid_t target_pid)
244{
245 ztimer64_set_msg_at(clock, timer,
246 ztimer64_offset2absolute(clock, offset),
247 msg, target_pid);
248}
249
268 uint64_t target);
269
288 msg_t *msg,
289 uint64_t timeout)
290{
291 return ztimer64_msg_receive_until(clock, msg,
292 ztimer64_offset2absolute(clock, timeout));
293}
294
295#define MSG_ZTIMER64 0xc83f
296
317void ztimer64_periodic_wakeup(ztimer64_clock_t *clock, uint64_t *last_wakeup,
318 uint64_t period);
319
326void ztimer64_sleep_until(ztimer64_clock_t *clock, uint64_t target);
327
334static inline void ztimer64_sleep(ztimer64_clock_t *clock, uint64_t duration)
335{
336 ztimer64_sleep_until(clock, ztimer64_offset2absolute(clock, duration));
337}
338
347static inline void ztimer64_spin_until(ztimer64_clock_t *clock, uint64_t target)
348{
349 while (ztimer64_now(clock) <= target) {}
350}
351
364 uint64_t target,
365 kernel_pid_t pid);
366
378static inline void ztimer64_set_wakeup(ztimer64_clock_t *clock,
379 ztimer64_t *timer, uint64_t offset,
380 kernel_pid_t pid)
381{
382 ztimer64_set_wakeup_at(clock, timer,
383 ztimer64_offset2absolute(clock, offset), pid);
384}
385
397 uint64_t target);
398
410 ztimer64_t *timer,
411 uint64_t timeout)
412{
413 ztimer64_set_timeout_flag_at(clock, timer,
414 ztimer64_offset2absolute(clock, timeout));
415}
416
428 uint64_t target);
429
441 mutex_t *mutex,
442 uint64_t timeout)
443{
444 return ztimer64_mutex_lock_until(clock, mutex,
445 ztimer64_offset2absolute(clock, timeout));
446}
447
459 uint64_t target);
460
472 rmutex_t *rmutex,
473 uint64_t timeout)
474{
475 return ztimer64_rmutex_lock_until(clock, rmutex,
476 ztimer64_offset2absolute(clock, timeout));
477}
478
487
491void ztimer64_init(void);
492
499
500/* default ztimer virtual devices */
504extern ztimer64_clock_t *const ZTIMER64_USEC;
505
509extern ztimer64_clock_t *const ZTIMER64_MSEC;
510
514extern ztimer64_clock_t *const ZTIMER64_SEC;
515
527int64_t ztimer64_overhead(ztimer64_clock_t *clock, uint64_t base);
528
529#ifdef __cplusplus
530}
531#endif
532
MAYBE_INLINE void irq_restore(unsigned state)
This function restores the IRQ disable bit in the status register to the value contained within passe...
MAYBE_INLINE unsigned irq_disable(void)
This function sets the IRQ disable bit in the status register.
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:138
void ztimer64_init(void)
Initialize the board-specific default ztimer configuration.
void ztimer64_set_wakeup_at(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t target, kernel_pid_t pid)
Set a timer that wakes up a thread (absolute version)
void ztimer64_clock_init(ztimer64_clock_t *clock, ztimer_clock_t *base_clock)
Initialize clock to be run from base_clock.
unsigned ztimer64_is_set(const ztimer64_t *timer)
Check if a timer is currently active.
static void ztimer64_set_wakeup(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t offset, kernel_pid_t pid)
Set a timer that wakes up a thread (relative version)
Definition ztimer64.h:378
void ztimer64_remove(ztimer64_clock_t *clock, ztimer64_t *timer)
Remove a timer from a clock.
static void ztimer64_set_timeout_flag(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t timeout)
Set timeout thread flag after timeout.
Definition ztimer64.h:409
struct ztimer64_base ztimer64_base_t
ztimer64_t forward declaration
Definition ztimer64.h:80
int ztimer64_mutex_lock_until(ztimer64_clock_t *clock, mutex_t *mutex, uint64_t target)
Try to lock the given mutex, but give up at target time.
void ztimer64_sleep_until(ztimer64_clock_t *clock, uint64_t target)
Put the calling thread to sleep until the specified time.
void ztimer64_update_head_offset(ztimer64_clock_t *clock)
Update ztimer clock head list offset.
uint64_t ztimer64_now(ztimer64_clock_t *clock)
Get the current time from a clock.
static void ztimer64_set_msg(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t offset, msg_t *msg, kernel_pid_t target_pid)
Post a message after a delay (relative version)
Definition ztimer64.h:241
static int ztimer64_msg_receive_timeout(ztimer64_clock_t *clock, msg_t *msg, uint64_t timeout)
receive a message (blocking, with relative timeout)
Definition ztimer64.h:287
static int ztimer64_mutex_lock_timeout(ztimer64_clock_t *clock, mutex_t *mutex, uint64_t timeout)
Try to lock the given mutex, but give up after timeout.
Definition ztimer64.h:440
static void ztimer64_set(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t offset)
Set a timer on a clock (relative version)
Definition ztimer64.h:178
void ztimer64_periodic_wakeup(ztimer64_clock_t *clock, uint64_t *last_wakeup, uint64_t period)
Suspend the calling thread until the time (last_wakeup + period)
struct ztimer64_clock ztimer64_clock_t
ztimer64_clock_t forward declaration
Definition ztimer64.h:84
void ztimer64_set_timeout_flag_at(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t target)
Set timeout thread flag at target time.
static uint64_t ztimer64_offset2absolute(ztimer64_clock_t *clock, uint64_t offset)
Get absolute target time for a clock given offset.
Definition ztimer64.h:139
void ztimer64_set_at(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t target)
Set a timer on a clock (absolute version)
static void ztimer64_sleep(ztimer64_clock_t *clock, uint64_t duration)
Put the calling thread to sleep for the specified number of ticks.
Definition ztimer64.h:334
int ztimer64_msg_receive_until(ztimer64_clock_t *clock, msg_t *msg, uint64_t target)
receive a message (blocking, with absolute timeout)
static int ztimer64_rmutex_lock_timeout(ztimer64_clock_t *clock, rmutex_t *rmutex, uint64_t timeout)
Try to lock the given rmutex, but give up after timeout.
Definition ztimer64.h:471
ztimer64_clock_t *const ZTIMER64_USEC
Default ztimer microsecond clock.
int64_t ztimer64_overhead(ztimer64_clock_t *clock, uint64_t base)
Measure ztimer64 overhead.
void ztimer64_set_msg_at(ztimer64_clock_t *clock, ztimer64_t *timer, uint64_t target, msg_t *msg, kernel_pid_t target_pid)
Post a message at a specified time.
ztimer64_clock_t *const ZTIMER64_MSEC
Default ztimer millisecond clock.
ztimer64_clock_t *const ZTIMER64_SEC
Default ztimer second clock.
static void ztimer64_spin_until(ztimer64_clock_t *clock, uint64_t target)
Busy-wait until specified target time.
Definition ztimer64.h:347
int ztimer64_rmutex_lock_until(ztimer64_clock_t *clock, rmutex_t *rmutex, uint64_t target)
Try to lock the given rmutex, but give up at time.
struct ztimer_clock ztimer_clock_t
ztimer_clock_t forward declaration
Definition ztimer.h:290
IRQ driver interface.
Mutex for thread synchronization.
Describes a message object which can be sent between threads.
Definition msg.h:195
Mutex structure.
Definition mutex.h:39
Mutex structure.
Definition rmutex.h:37
Minimum information for each timer.
Definition ztimer64.h:89
ztimer64_base_t * next
next timer in list
Definition ztimer64.h:90
uint64_t target
absolute target time
Definition ztimer64.h:91
ztimer64 clock structure
Definition ztimer64.h:109
ztimer_t base_timer
32bit backend timer
Definition ztimer64.h:112
uint16_t adjust_sleep
will be subtracted on every sleep(), in addition to adjust_set
Definition ztimer64.h:115
uint8_t block_pm_mode
min.
Definition ztimer64.h:118
uint64_t checkpoint
lower timer checkpoint offset
Definition ztimer64.h:113
uint16_t adjust_set
will be subtracted on every set()
Definition ztimer64.h:114
ztimer64_base_t * first
list of active timers
Definition ztimer64.h:110
ztimer_clock_t * base_clock
32bit clock backend
Definition ztimer64.h:111
ztimer64 structure
Definition ztimer64.h:100
ztimer64_base_t base
clock list entry
Definition ztimer64.h:101
void * arg
timer callback argument
Definition ztimer64.h:103
void(* callback)(void *arg)
timer callback function pointer
Definition ztimer64.h:102
ztimer structure
Definition ztimer.h:319
ztimer API