kernel: fix k_sleep in no multi-threading mode

Fix k_sleep implementation for no multi-threading mode.

Absolute value of timeout expiration was fed to the k_busy_wait()
function instead of delta value. That caused bug like incrementing of
sleep time in geometric progression (while actual function argument is
constant) during program running.

Signed-off-by: Mikhail Kushnerov <m.kushnerov@yadro.com>
This commit is contained in:
Mikhail Kushnerov 2024-11-06 11:26:36 +03:00 committed by Anas Nashif
parent c9d6c4c744
commit a995d9d76f

View file

@ -20,7 +20,7 @@ bool k_is_in_isr(void)
int32_t z_impl_k_sleep(k_timeout_t timeout) int32_t z_impl_k_sleep(k_timeout_t timeout)
{ {
k_ticks_t ticks; k_ticks_t ticks;
uint32_t expected_wakeup_ticks; uint32_t ticks_to_wait;
__ASSERT(!arch_is_in_isr(), ""); __ASSERT(!arch_is_in_isr(), "");
@ -37,12 +37,20 @@ int32_t z_impl_k_sleep(k_timeout_t timeout)
ticks = timeout.ticks; ticks = timeout.ticks;
if (Z_TICK_ABS(ticks) <= 0) { if (Z_TICK_ABS(ticks) <= 0) {
expected_wakeup_ticks = ticks + sys_clock_tick_get_32(); /* ticks is delta timeout */
ticks_to_wait = ticks;
} else { } else {
expected_wakeup_ticks = Z_TICK_ABS(ticks); /* ticks is absolute timeout expiration */
uint32_t curr_ticks = sys_clock_tick_get_32();
if (Z_TICK_ABS(ticks) > curr_ticks) {
ticks_to_wait = Z_TICK_ABS(ticks) - curr_ticks;
} else {
ticks_to_wait = 0;
}
} }
/* busy wait to be time coherent since subsystems may depend on it */ /* busy wait to be time coherent since subsystems may depend on it */
z_impl_k_busy_wait(k_ticks_to_us_ceil32(expected_wakeup_ticks)); z_impl_k_busy_wait(k_ticks_to_us_ceil32(ticks_to_wait));
int32_t ret = k_ticks_to_ms_ceil64(0); int32_t ret = k_ticks_to_ms_ceil64(0);