From 1ff609167e1819200b5e2cf48b681dc6f8209511 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 16 Jun 2020 12:24:11 +0200 Subject: [PATCH] ztimer: convert_frac: use self->scale_now for max_value When using convert_frac to slow down a timer, the extension machinery is used to prevent converting values that would be larger than, after conversion, 2**32. In order to calculate the maximum value, UINT32_MAX is converted. Previously, this was mistakenly converted by multiplying with the fraction used to scale up a value. E.g., when using convert_frac to slow down a 1us timer to provide a 1ms timer, UINT32_MAX was multiplied by 1000. As the result is used % UINT32_MAX, this lead to a wrong value close to UINT32_MAX, as ((UINT32_MAX * N) % UINT32_MAX = (UINT32_MAX - N - 1)). This PR fixes the calculation so max_value is determined by multiplying with the fraction used to scale down a value. --- sys/ztimer/convert_frac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/ztimer/convert_frac.c b/sys/ztimer/convert_frac.c index 6980fd83d2..4cfbbf98e3 100644 --- a/sys/ztimer/convert_frac.c +++ b/sys/ztimer/convert_frac.c @@ -100,7 +100,7 @@ void ztimer_convert_frac_init(ztimer_convert_frac_t *self, ztimer_convert_frac_compute_scale(self, freq_self, freq_lower); if (freq_self < freq_lower) { - self->super.super.max_value = frac_scale(&self->scale_set, UINT32_MAX); + self->super.super.max_value = frac_scale(&self->scale_now, UINT32_MAX); ztimer_init_extend(&self->super.super); } else {