tests: kernel/sched: 32-bit tick wraparound during k_sleep() execution

This test reproduce the issue: https://github.com/zephyrproject-rtos/zephyr/issues/79863

In this test, instead of waiting the 32-bit tick wraparound for several
days, patching the kernel internal tick with the test API.

Signed-off-by: Akaiwa Wataru <akaiwa@sonas.co.jp>
This commit is contained in:
Akaiwa Wataru 2024-11-28 23:23:37 +09:00 committed by Benjamin Cabé
commit 1bb5c34f98
4 changed files with 53 additions and 0 deletions

View file

@ -0,0 +1,8 @@
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(sleep)
FILE(GLOB app_sources src/*.c)
target_sources(app PRIVATE ${app_sources})

View file

@ -0,0 +1 @@
CONFIG_ZTEST=y

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2024 Akaiwa Wataru <akaiwa@sonas.co.jp>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/ztest.h>
static k_tid_t thread_id;
static void alarm_callback(struct k_timer *timer)
{
k_wakeup(thread_id);
}
K_TIMER_DEFINE(alarm, alarm_callback, NULL);
/**
* @brief Test 32-bit tick wraparound during k_sleep() execution
*/
ZTEST(wraparound, test_tick_wraparound_in_sleep)
{
static const uint32_t start_ticks = 0xffffff00; /* It wraps around after 256 ticks! */
static const uint32_t timeout_ticks = 300; /* 3 seconds @ 100Hz tick */
static const uint32_t wakeup_ticks = 10; /* 100 ms @ 100Hz tick */
sys_clock_tick_set(start_ticks);
/* Wake up myself by alarm */
thread_id = k_current_get();
k_timer_start(&alarm, K_TICKS(wakeup_ticks), K_FOREVER);
/* Waiting alarm's k_wakeup() call */
int32_t left_ms = k_sleep(K_TICKS(timeout_ticks));
zassert(left_ms > 0, "k_sleep() timed out");
k_timer_stop(&alarm);
}
ZTEST_SUITE(wraparound, NULL, NULL, NULL, NULL, NULL);

View file

@ -0,0 +1,3 @@
tests:
kernel.scheduler.wraparound:
tags: kernel