|  | /* | 
|  | * 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); | 
|  |  | 
|  | } |