This reverts commit fd8ca83e9a.
https://github.com/zephyrproject-rtos/zephyr/pull/69705
Introduced a regression in main in which
tests/subsys/logging/log_timestamp
started failing. (See
https://github.com/zephyrproject-rtos/zephyr/issues/72344
for more info).
Let's revert the PR. It can be submitted after with the issue
fixed.
Signed-off-by: Alberto Escolar Piedras <alberto.escolar.piedras@nordicsemi.no>
105 lines
2.4 KiB
C
105 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 2018 Intel Corporation
|
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/ztest.h>
|
|
|
|
ZTEST(no_multithreading, test_k_busy_wait)
|
|
{
|
|
int64_t now = k_uptime_get();
|
|
uint32_t watchdog = CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC;
|
|
|
|
while (k_uptime_get() != now) {
|
|
/* Wait until uptime progresses */
|
|
watchdog--;
|
|
if (watchdog == 0) {
|
|
zassert_false(true, "No progress in uptime");
|
|
}
|
|
}
|
|
|
|
now = k_uptime_get();
|
|
/* Check that k_busy_wait is working as expected. */
|
|
k_busy_wait(10000);
|
|
|
|
int64_t diff = k_uptime_get() - now;
|
|
|
|
zassert_within(diff, 10, 2);
|
|
}
|
|
|
|
static void timeout_handler(struct k_timer *timer)
|
|
{
|
|
bool *flag = k_timer_user_data_get(timer);
|
|
|
|
*flag = true;
|
|
}
|
|
|
|
K_TIMER_DEFINE(timer, timeout_handler, NULL);
|
|
|
|
ZTEST(no_multithreading, test_irq_locking)
|
|
{
|
|
volatile bool timeout_run = false;
|
|
|
|
k_timer_user_data_set(&timer, (void *)&timeout_run);
|
|
k_timer_start(&timer, K_MSEC(10), K_NO_WAIT);
|
|
|
|
unsigned int key = irq_lock();
|
|
|
|
k_busy_wait(15000);
|
|
zassert_false(timeout_run, "Timeout should not expire because irq is locked");
|
|
|
|
irq_unlock(key);
|
|
|
|
zassert_true(timeout_run, "Timeout should expire because irq got unlocked");
|
|
}
|
|
|
|
ZTEST(no_multithreading, test_cpu_idle)
|
|
{
|
|
volatile bool timeout_run = false;
|
|
int64_t now, diff;
|
|
|
|
k_timer_user_data_set(&timer, (void *)&timeout_run);
|
|
now = k_uptime_get();
|
|
/* Start timer and go to idle, cpu should sleep until it is waken up
|
|
* by sys clock interrupt.
|
|
*/
|
|
k_timer_start(&timer, K_MSEC(10), K_NO_WAIT);
|
|
|
|
k_cpu_idle();
|
|
|
|
diff = k_uptime_get() - now;
|
|
zassert_true(timeout_run, "Timeout should expire");
|
|
zassert_within(diff, 10, 2, "Unexpected time passed: %d ms", (int)diff);
|
|
}
|
|
|
|
#define IDX_PRE_KERNEL_1 0
|
|
#define IDX_PRE_KERNEL_2 1
|
|
#define IDX_POST_KERNEL 2
|
|
|
|
#define SYS_INIT_CREATE(level) \
|
|
static int pre_kernel_##level##_init_func(void) \
|
|
{ \
|
|
if (init_order != IDX_##level && sys_init_result == 0) { \
|
|
sys_init_result = -1; \
|
|
return -EIO; \
|
|
} \
|
|
init_order++; \
|
|
return 0;\
|
|
} \
|
|
SYS_INIT(pre_kernel_##level##_init_func, level, 0)
|
|
|
|
static int init_order;
|
|
static int sys_init_result;
|
|
|
|
FOR_EACH(SYS_INIT_CREATE, (;), PRE_KERNEL_1, PRE_KERNEL_2, POST_KERNEL);
|
|
|
|
ZTEST(no_multithreading, test_sys_init)
|
|
{
|
|
zassert_equal(init_order, 3, "SYS_INIT failed: %d", init_order);
|
|
}
|
|
|
|
ZTEST_SUITE(no_multithreading, NULL, NULL, NULL, NULL, NULL);
|