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:
parent
c9d6c4c744
commit
a995d9d76f
1 changed files with 12 additions and 4 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue