Enabled the boot_time test on ARM SoCs, set __start_time_stamp on ARM since we don't have a free running counter similar to TSC on x86. Also moved to printing the values out as %u to increase the range of values. Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
82 lines
2.5 KiB
C
82 lines
2.5 KiB
C
/*
|
|
* 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);
|
|
|
|
}
|