blob: 1fa07eeb2b48164d944bbfae9a1d427c7e92d347 [file] [log] [blame]
/*
* Copyright (c) 2018 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include <zephyr/kernel.h>
#include <cmsis_os.h>
#define WAIT_TIME_US 1000000
/* Specify accepted tolerance. On some Zephyr platforms (e.g. nRF5x) the busy
* wait loop and the system timer are based on different mechanisms and may not
* align perfectly. 1 percent base intolerance is to cover CPU processing in the
* test.
*/
#if CONFIG_NRF_RTC_TIMER
/* High frequency clock used for k_busy_wait may have up to 8% tolerance.
* Additionally, if RC is used for low frequency clock then it has 5% tolerance.
*/
#define TOLERANCE_PPC \
(1 + 8 + (IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC) ? 5 : 0))
#else
#define TOLERANCE_PPC 1
#endif
/**
* @brief Test kernel start
*
* @see osKernelInitialize(), osKernelStart(),
* osKernelRunning()
*/
ZTEST(kernel_apis, test_kernel_start)
{
if (osFeature_MainThread) {
/* When osFeature_MainThread is 1 the kernel offers to start
* with 'main'. The kernel is in this case already started.
*/
zassert_true(!osKernelInitialize() && !osKernelStart()
&& osKernelRunning(), NULL);
} else {
/* When osFeature_MainThread is 0 the kernel requires
* explicit start with osKernelStart.
*/
zassert_false(osKernelRunning());
}
}
/**
* @brief Test kernel system timer
*
* @see osKernelSysTick()
*/
ZTEST(kernel_apis, test_kernel_systick)
{
uint32_t start_time, stop_time, diff, max, min;
start_time = osKernelSysTick();
k_busy_wait(WAIT_TIME_US);
stop_time = osKernelSysTick();
diff = (uint32_t)k_cyc_to_ns_floor64(stop_time -
start_time) / NSEC_PER_USEC;
max = WAIT_TIME_US + (TOLERANCE_PPC * WAIT_TIME_US / 100);
min = WAIT_TIME_US - (TOLERANCE_PPC * WAIT_TIME_US / 100);
zassert_true(diff <= max && diff >= min,
"start %d stop %d (diff %d) wait %d\n",
start_time, stop_time, diff, WAIT_TIME_US);
}
ZTEST_SUITE(kernel_apis, NULL, NULL, NULL, NULL, NULL);