|  | /* | 
|  | * Copyright (c) 2017 Intel Corporation | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <ztest.h> | 
|  |  | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | #define ALIGN_MS_BOUNDARY		       \ | 
|  | do {				       \ | 
|  | u32_t t = k_uptime_get_32();   \ | 
|  | while (t == k_uptime_get_32()) \ | 
|  | k_busy_wait(50);       \ | 
|  | } while (0) | 
|  | #else | 
|  | #define ALIGN_MS_BOUNDARY		       \ | 
|  | do {				       \ | 
|  | u32_t t = k_uptime_get_32();   \ | 
|  | while (t == k_uptime_get_32()) \ | 
|  | ;		       \ | 
|  | } while (0) | 
|  | #endif | 
|  |  | 
|  | /** | 
|  | * @addtogroup kernel_common_tests | 
|  | * @{ | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @brief Test clock uptime APIs functionality | 
|  | * | 
|  | * @see k_uptime_get(), k_uptime_get_32(), k_uptime_delta() | 
|  | * k_uptime_delta_32() | 
|  | */ | 
|  | void test_clock_uptime(void) | 
|  | { | 
|  | u64_t t64, t32; | 
|  | s64_t d64 = 0; | 
|  |  | 
|  | /**TESTPOINT: uptime elapse*/ | 
|  | t64 = k_uptime_get(); | 
|  | while (k_uptime_get() < (t64 + 5)) { | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | k_busy_wait(50); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /**TESTPOINT: uptime elapse lower 32-bit*/ | 
|  | t32 = k_uptime_get_32(); | 
|  | while (k_uptime_get_32() < (t32 + 5)) { | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | k_busy_wait(50); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /**TESTPOINT: uptime straddled ms boundary*/ | 
|  | t32 = k_uptime_get_32(); | 
|  | ALIGN_MS_BOUNDARY; | 
|  | zassert_true(k_uptime_get_32() > t32, NULL); | 
|  |  | 
|  | /**TESTPOINT: uptime delta*/ | 
|  | d64 = k_uptime_delta(&d64); | 
|  | while (k_uptime_delta(&d64) == 0) { | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | k_busy_wait(50); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /**TESTPOINT: uptime delta lower 32-bit*/ | 
|  | k_uptime_delta_32(&d64); | 
|  | while (k_uptime_delta_32(&d64) == 0) { | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | k_busy_wait(50); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /**TESTPOINT: uptime delta straddled ms boundary*/ | 
|  | k_uptime_delta_32(&d64); | 
|  | ALIGN_MS_BOUNDARY; | 
|  | zassert_true(k_uptime_delta_32(&d64) > 0, NULL); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Test clock cycle functionality | 
|  | * | 
|  | * @see k_cycle_get_32(), k_uptime_get_32() | 
|  | */ | 
|  | void test_clock_cycle(void) | 
|  | { | 
|  | u32_t c32, c0, c1, t32; | 
|  |  | 
|  | /**TESTPOINT: cycle elapse*/ | 
|  | ALIGN_MS_BOUNDARY; | 
|  | c32 = k_cycle_get_32(); | 
|  | /*break if cycle counter wrap around*/ | 
|  | while (k_cycle_get_32() > c32 && | 
|  | k_cycle_get_32() < (c32 + k_ticks_to_cyc_floor32(1))) { | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | k_busy_wait(50); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /**TESTPOINT: cycle/uptime cross check*/ | 
|  | c0 = k_cycle_get_32(); | 
|  | ALIGN_MS_BOUNDARY; | 
|  | t32 = k_uptime_get_32(); | 
|  | while (t32 == k_uptime_get_32()) { | 
|  | #if defined(CONFIG_ARCH_POSIX) | 
|  | k_busy_wait(50); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | c1 = k_uptime_get_32(); | 
|  | /*avoid cycle counter wrap around*/ | 
|  | if (c1 > c0) { | 
|  | /* delta cycle should be greater than 1 milli-second*/ | 
|  | zassert_true((c1 - c0) > | 
|  | (sys_clock_hw_cycles_per_sec() / MSEC_PER_SEC), | 
|  | NULL); | 
|  | /* delta NS should be greater than 1 milli-second */ | 
|  | zassert_true((u32_t)k_cyc_to_ns_floor64(c1 - c0) > | 
|  | (NSEC_PER_SEC / MSEC_PER_SEC), NULL); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @} | 
|  | */ |