Loading...
Searching...
No Matches
ztimer.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Kaspar Schleiser <kaspar@schleiser.de>
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
261
262#include <stdint.h>
263
264#include "mbox.h"
265#include "msg.h"
266#include "mutex.h"
267#include "rmutex.h"
268#include "sched.h"
269
270#ifdef __cplusplus
271extern "C" {
272#endif
273
277#define ZTIMER_CLOCK_NO_REQUIRED_PM_MODE (UINT8_MAX)
278
283
288
292typedef void (*ztimer_callback_t)(void *arg);
293
299 uint32_t offset;
300};
301
308typedef uint32_t ztimer_now_t;
309
321
329typedef struct {
335 void (*set)(ztimer_clock_t *clock, uint32_t val);
336
341 uint32_t (*now)(ztimer_clock_t *clock);
342
347 void (*cancel)(ztimer_clock_t *clock);
348
349#if MODULE_ZTIMER_ONDEMAND || DOXYGEN
354 void (*start)(ztimer_clock_t *clock);
355
360 void (*stop)(ztimer_clock_t *clock);
361#endif
363
371 uint16_t adjust_set;
372 uint16_t adjust_sleep;
374#if MODULE_ZTIMER_ONDEMAND || DOXYGEN
378 uint16_t users;
379#endif
380#if MODULE_ZTIMER_EXTEND || DOXYGEN
381 /* values used for checkpointed intervals and 32bit extension */
382 uint32_t max_value;
383 uint32_t lower_last;
385#endif
386#if MODULE_PM_LAYERED && !MODULE_ZTIMER_ONDEMAND || DOXYGEN
389#endif
390};
391
399
400/* User API */
412#if MODULE_ZTIMER_ONDEMAND || DOXYGEN
414#else
415static inline bool ztimer_acquire(ztimer_clock_t *clock)
416{
417 (void)clock;
418 return false;
419}
420#endif
421
432#if MODULE_ZTIMER_ONDEMAND || DOXYGEN
434#else
435static inline bool ztimer_release(ztimer_clock_t *clock)
436{
437 (void)clock;
438 return false;
439}
440#endif
441
458uint32_t ztimer_set(ztimer_clock_t *clock, ztimer_t *timer, uint32_t val);
459
469unsigned ztimer_is_set(const ztimer_clock_t *clock, const ztimer_t *timer);
470
489
505void ztimer_set_msg(ztimer_clock_t *clock, ztimer_t *timer, uint32_t offset,
506 msg_t *msg, kernel_pid_t target_pid);
507
526 uint32_t timeout);
527
528/* created with dist/tools/define2u16.py */
529#define MSG_ZTIMER 0xc83e
530
545int ztimer_mbox_get_timeout(ztimer_clock_t *clock, mbox_t *mbox, msg_t *msg, uint32_t timeout);
546
556
567
681{
682#if MODULE_ZTIMER_ONDEMAND && DEVELHELP
684#endif
685
686#if MODULE_ZTIMER_EXTEND
687 if (clock->max_value < UINT32_MAX) {
688#else
689 if (0) {
690#endif
691 return _ztimer_now_extend(clock);
692 }
693 else {
694 return clock->ops->now(clock);
695 }
696}
697
720void ztimer_periodic_wakeup(ztimer_clock_t *clock, uint32_t *last_wakeup,
721 uint32_t period);
722
729void ztimer_sleep(ztimer_clock_t *clock, uint32_t duration);
730
739static inline void ztimer_spin(ztimer_clock_t *clock, uint32_t duration)
740{
741 ztimer_acquire(clock);
742 uint32_t end = ztimer_now(clock) + duration;
743
744 /* Rely on integer overflow. `end - now` will be smaller than `duration`,
745 * counting down, until it underflows to UINT32_MAX. Loop ends then. */
746 while ((end - ztimer_now(clock)) <= duration) {}
747 ztimer_release(clock);
748}
749
761void ztimer_set_wakeup(ztimer_clock_t *clock, ztimer_t *timer, uint32_t offset,
762 kernel_pid_t pid);
763
775 uint32_t timeout);
776
788 uint32_t timeout, mutex_t *mutex);
789
801 uint32_t timeout);
802
814 uint32_t timeout);
815
819void ztimer_init(void);
820
821#if defined(MODULE_ZTIMER_EXTEND) || defined(DOXYGEN)
832static inline void ztimer_init_extend(ztimer_clock_t *clock)
833{
834 if (clock->max_value < UINT32_MAX) {
835 clock->ops->set(clock, clock->max_value >> 1);
836 }
837}
838#endif /* MODULE_ZTIMER_EXTEND */
839
840/* default ztimer virtual devices */
844extern ztimer_clock_t *const ZTIMER_USEC;
845
849extern ztimer_clock_t *const ZTIMER_MSEC;
850
854extern ztimer_clock_t *const ZTIMER_SEC;
855
870extern ztimer_clock_t *const ZTIMER_USEC_BASE;
871
889extern ztimer_clock_t *const ZTIMER_MSEC_BASE;
890
891#ifdef __cplusplus
892}
893#endif
894
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:134
void ztimer_init(void)
Initialize the board-specific default ztimer configuration.
struct ztimer_base ztimer_base_t
ztimer_base_t forward declaration
Definition ztimer.h:282
bool ztimer_release(ztimer_clock_t *clock)
Release a clock.
void(* ztimer_callback_t)(void *arg)
Type of callbacks in timers.
Definition ztimer.h:292
struct ztimer_clock ztimer_clock_t
ztimer_clock_t forward declaration
Definition ztimer.h:287
void ztimer_periodic_wakeup(ztimer_clock_t *clock, uint32_t *last_wakeup, uint32_t period)
Suspend the calling thread until the time (last_wakeup + period)
void ztimer_set_wakeup(ztimer_clock_t *clock, ztimer_t *timer, uint32_t offset, kernel_pid_t pid)
Set a timer that wakes up a thread.
ztimer_clock_t *const ZTIMER_SEC
Default ztimer second clock.
int ztimer_mbox_get_timeout(ztimer_clock_t *clock, mbox_t *mbox, msg_t *msg, uint32_t timeout)
Get message from mailbox, blocking with a timeout.
void ztimer_set_msg(ztimer_clock_t *clock, ztimer_t *timer, uint32_t offset, msg_t *msg, kernel_pid_t target_pid)
Post a message after a delay.
ztimer_clock_t *const ZTIMER_MSEC_BASE
Base ztimer for the millisecond clock (ZTIMER_MSEC)
uint32_t ztimer_set(ztimer_clock_t *clock, ztimer_t *timer, uint32_t val)
Set a timer on a clock.
ztimer_clock_t *const ZTIMER_USEC
Default ztimer microsecond clock.
static void ztimer_spin(ztimer_clock_t *clock, uint32_t duration)
Busy-wait specified duration.
Definition ztimer.h:739
bool ztimer_acquire(ztimer_clock_t *clock)
Acquire a clock.
uint32_t ztimer_now_t
type for ztimer_now() result
Definition ztimer.h:308
static ztimer_now_t ztimer_now(ztimer_clock_t *clock)
Get the current time from a clock.
Definition ztimer.h:680
int ztimer_msg_receive_timeout(ztimer_clock_t *clock, msg_t *msg, uint32_t timeout)
receive a message (blocking, with timeout)
static void ztimer_init_extend(ztimer_clock_t *clock)
Initialize possible ztimer extension intermediate timer.
Definition ztimer.h:832
unsigned ztimer_is_set(const ztimer_clock_t *clock, const ztimer_t *timer)
Check if a timer is currently active.
int ztimer_rmutex_lock_timeout(ztimer_clock_t *clock, rmutex_t *rmutex, uint32_t timeout)
Try to lock the given rmutex, but give up after timeout.
void ztimer_sleep(ztimer_clock_t *clock, uint32_t duration)
Put the calling thread to sleep for the specified number of ticks.
bool ztimer_remove(ztimer_clock_t *clock, ztimer_t *timer)
Remove a timer from a clock.
void ztimer_handler(ztimer_clock_t *clock)
main ztimer callback handler
ztimer_now_t _ztimer_now_extend(ztimer_clock_t *clock)
ztimer_now() for extending timers
void ztimer_mutex_unlock(ztimer_clock_t *clock, ztimer_t *timer, uint32_t timeout, mutex_t *mutex)
Unlock mutex after timeout.
ztimer_clock_t *const ZTIMER_USEC_BASE
Base ztimer for the microsecond clock (ZTIMER_USEC)
void _ztimer_assert_clock_active(ztimer_clock_t *clock)
asserts the given clock to be active
void ztimer_set_timeout_flag(ztimer_clock_t *clock, ztimer_t *timer, uint32_t timeout)
Set timeout thread flag after timeout.
int ztimer_mutex_lock_timeout(ztimer_clock_t *clock, mutex_t *mutex, uint32_t timeout)
Try to lock the given mutex, but give up after timeout.
ztimer_clock_t *const ZTIMER_MSEC
Default ztimer millisecond clock.
Mailbox API.
Mutex for thread synchronization.
Recursive Mutex for thread synchronization.
Mailbox struct definition.
Definition mbox.h:38
Describes a message object which can be sent between threads.
Definition msg.h:193
Mutex structure.
Definition mutex.h:36
Mutex structure.
Definition rmutex.h:34
Minimum information for each timer.
Definition ztimer.h:297
uint32_t offset
offset from last timer in list
Definition ztimer.h:299
ztimer_base_t * next
next timer in list
Definition ztimer.h:298
ztimer device structure
Definition ztimer.h:367
uint16_t adjust_sleep
will be subtracted on every sleep(), in addition to adjust_set
Definition ztimer.h:372
uint32_t lower_last
timer value at last now() call
Definition ztimer.h:383
uint32_t max_value
maximum relative timer value
Definition ztimer.h:382
ztimer_now_t checkpoint
cumulated time at last now() call
Definition ztimer.h:384
ztimer_base_t * last
last timer in queue, for _is_set()
Definition ztimer.h:370
uint16_t users
user count of this clock
Definition ztimer.h:378
ztimer_base_t list
list of active timers
Definition ztimer.h:368
uint16_t adjust_clock_start
will be subtracted on every set(), if the underlying periph is in stopped state
Definition ztimer.h:375
uint16_t adjust_set
will be subtracted on every set()
Definition ztimer.h:371
const ztimer_ops_t * ops
pointer to methods structure
Definition ztimer.h:369
uint8_t block_pm_mode
min.
Definition ztimer.h:387
ztimer backend method structure
Definition ztimer.h:329
uint32_t(* now)(ztimer_clock_t *clock)
Get the current count of the timer.
Definition ztimer.h:341
void(* start)(ztimer_clock_t *clock)
Starts the underlying timer.
Definition ztimer.h:354
void(* stop)(ztimer_clock_t *clock)
Stops the underlying timer.
Definition ztimer.h:360
void(* cancel)(ztimer_clock_t *clock)
Cancel any set target.
Definition ztimer.h:347
void(* set)(ztimer_clock_t *clock, uint32_t val)
Set a new timer target.
Definition ztimer.h:335
ztimer structure
Definition ztimer.h:316
ztimer_callback_t callback
timer callback function pointer
Definition ztimer.h:318
void * arg
timer callback argument
Definition ztimer.h:319
ztimer_base_t base
clock list entry
Definition ztimer.h:317