Loading...
/* * Copyright (c) 2013-2015 Wind River Systems, Inc. * Copyright (c) 2016 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Measure boot time * * Measuring the boot time * 1. From reset to kernel's __start * 2. From __start to main() * 3. From __start to task * 4. From __start to idle */ #include <zephyr.h> #include <tc_util.h> /* externs */ extern u64_t __start_time_stamp; /* timestamp when kernel begins executing */ extern u64_t __main_time_stamp; /* timestamp when main() begins executing */ extern u64_t __idle_time_stamp; /* timestamp when CPU went idle */ void main(void) { u64_t task_time_stamp; /* timestamp at beginning of first task */ u64_t _start_us; /* being of __start timestamp in us */ u64_t main_us; /* begin of main timestamp in us */ u64_t task_us; /* begin of task timestamp in us */ u64_t s_main_time_stamp; /* __start->main timestamp */ u64_t s_task_time_stamp; /*__start->task timestamp */ u64_t idle_us; /* begin of idle timestamp in us */ u64_t s_idle_time_stamp; /*__start->idle timestamp */ task_time_stamp = (u64_t)k_cycle_get_32(); /* * Go to sleep for 1 tick in order to timestamp when idle thread halts. */ k_sleep(1); int freq = CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC / 1000000; _start_us = __start_time_stamp / freq; s_main_time_stamp = __main_time_stamp - __start_time_stamp; main_us = s_main_time_stamp / freq; s_task_time_stamp = task_time_stamp - __start_time_stamp; task_us = s_task_time_stamp / freq; s_idle_time_stamp = __idle_time_stamp - __start_time_stamp; idle_us = s_idle_time_stamp / freq; /* Indicate start for sanity test suite */ TC_START("Boot Time Measurement"); /* Only print lower 32bit of time result */ TC_PRINT("Boot Result: Clock Frequency: %d MHz\n", freq); TC_PRINT("__start : %u cycles, %u us\n", (u32_t)(__start_time_stamp & 0xFFFFFFFFULL), (u32_t) (_start_us & 0xFFFFFFFFULL)); TC_PRINT("_start->main(): %u cycles, %u us\n", (u32_t)(s_main_time_stamp & 0xFFFFFFFFULL), (u32_t) (main_us & 0xFFFFFFFFULL)); TC_PRINT("_start->task : %u cycles, %u us\n", (u32_t)(s_task_time_stamp & 0xFFFFFFFFULL), (u32_t) (task_us & 0xFFFFFFFFULL)); TC_PRINT("_start->idle : %u cycles, %u us\n", (u32_t)(s_idle_time_stamp & 0xFFFFFFFFULL), (u32_t) (idle_us & 0xFFFFFFFFULL)); TC_PRINT("Boot Time Measurement finished\n"); /* for sanity regression test utility. */ TC_END_RESULT(TC_PASS); TC_END_REPORT(TC_PASS); } |