1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/include/ztimer/convert_muldiv64.h
Kaspar Schleiser 6dd79366bb sys: add ztimer subsystem
Co-authored-by: Joakim Nohlgård <joakim.nohlgard@eistec.se>
2020-03-04 12:44:02 +01:00

86 lines
2.5 KiB
C

/*
* Copyright (C) 2019 Kaspar Schleiser <kaspar@schleiser.de>
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @defgroup sys_ztimer_convert_muldiv64 plain 64bit carithmetic
* @ingroup sys_ztimer_convert
* @brief ztimer frequency conversion module (64bit arithmetic)
*
* This ztimer module allows converting a lower-level ztimer clockwith a given
* frequency to another frequency.
*
* It is configured by passing two parameters (div, mul).
* Given a lower clock frequency f_low and a desired upper frequency f_upper,
* div and mul must be chosen such that
*
* (f_upper * mul / div) == f_lower
*
* A div or mul value of 0 is treated as 1 (no multiplication or division by 0 is
* done).
*
* On every ztimer_set(), the target offset is first multiplied by mul and
* then divided by div, before passing it to the lower ztimer's ztimer_set().
*
* On every ztimer_now(), the value from the lower ztimer is first multiplied
* by div and then divided by mul.
*
* Multiplication and division is done using 64bit multiplication / division,
* thus its use should be avoided in favour of more optimized conversion
* modules.
*
* Example:
*
* 1. if a ztimer_periph_timer with 250kHz is to be "sped up" to 1MHz,
* use div=4, mul=0
*
* 2. if a ztimer with 1024Hz is to be converted to 1000Hz, use div=125, mul=128
*
* @{
* @file
* @brief ztimer frequency conversion module API
* @author Kaspar Schleiser <kaspar@schleiser.de>
*/
#ifndef ZTIMER_CONVERT_MULDIV64_H
#define ZTIMER_CONVERT_MULDIV64_H
#include "ztimer.h"
#include "ztimer/convert.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief ztimer_convert_muldiv64 structure
*/
typedef struct {
ztimer_convert_t super; /**< super class */
uint16_t mul; /**< please read */
uint16_t div; /**< module docs */
} ztimer_convert_muldiv64_t;
/**
* @brief ztimer_convert_muldiv64 initialization function
*
* @param[in] ztimer_convert_muldiv64 instance to initialize
* @param[in] lower lower timer to convert
* @param[in] div see module doc
* @param[in] mul see module doc
*/
void ztimer_convert_muldiv64_init(
ztimer_convert_muldiv64_t *ztimer_convert_muldiv64, ztimer_clock_t *lower,
unsigned div, unsigned mul);
#ifdef __cplusplus
}
#endif
#endif /* ZTIMER_CONVERT_MULDIV64_H */
/** @} */