From 302f866e5c2671919f4900983a59476966c84156 Mon Sep 17 00:00:00 2001 From: Patrice Chotard Date: Tue, 14 Jan 2025 14:28:13 +0100 Subject: [PATCH 1/2] cyclic: Fix rollover every 72 min on 32 bits platforms On 32 bits platforms, timer_get_us() returns an unsigned long which is a 32 bits. timer_get_us() wraps around every 72 minutes (2 ^ 32 / 1000000 =~ 4295 sec =~ 72 min). So the test "if time_after_eq64(now, cyclic->next_call)" is no more true when cyclic->next_call becomes above 32 bits max value (4294967295). At this point after 72 min, no more cyclic function are executed included watchdog one. Instead of using timer_get_us(), use get_timer_us() which returns a uint64_t, this allows a rollover every 584942 years. Signed-off-by: Patrice Chotard Reviewed-by: Stefan Roese --- common/cyclic.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/cyclic.c b/common/cyclic.c index 196797fd61e..fad071a39c6 100644 --- a/common/cyclic.c +++ b/common/cyclic.c @@ -36,7 +36,7 @@ void cyclic_register(struct cyclic_info *cyclic, cyclic_func_t func, cyclic->func = func; cyclic->name = name; cyclic->delay_us = delay_us; - cyclic->start_time_us = timer_get_us(); + cyclic->start_time_us = get_timer_us(0); hlist_add_head(&cyclic->list, cyclic_get_list()); } @@ -61,13 +61,13 @@ static void cyclic_run(void) * Check if this cyclic function needs to get called, e.g. * do not call the cyclic func too often */ - now = timer_get_us(); + now = get_timer_us(0); if (time_after_eq64(now, cyclic->next_call)) { /* Call cyclic function and account it's cpu-time */ cyclic->next_call = now + cyclic->delay_us; cyclic->func(cyclic); cyclic->run_cnt++; - cpu_time = timer_get_us() - now; + cpu_time = get_timer_us(0) - now; cyclic->cpu_time_us += cpu_time; /* Check if cpu-time exceeds max allowed time */ From fb30f75655cdd1bf838827a8461b3434c07b1a62 Mon Sep 17 00:00:00 2001 From: Patrice Chotard Date: Tue, 14 Jan 2025 14:28:14 +0100 Subject: [PATCH 2/2] cyclic: Fix typo in struct cyclic_info description Replace delay_ns by delay_us which is the field name used into struct cyclic_info. Signed-off-by: Patrice Chotard Reviewed-by: Stefan Roese --- include/cyclic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cyclic.h b/include/cyclic.h index c6c463d68e9..df8b725e3d0 100644 --- a/include/cyclic.h +++ b/include/cyclic.h @@ -20,7 +20,7 @@ * * @func: Function to call periodically * @name: Name of the cyclic function, e.g. shown in the commands - * @delay_ns: Delay is ns after which this function shall get executed + * @delay_us: Delay is us after which this function shall get executed * @start_time_us: Start time in us, when this function started its execution * @cpu_time_us: Total CPU time of this function * @run_cnt: Counter of executions occurances