Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * 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 __start to main()
 *  2. From __start to task
 *  3. From __start to idle
 */

#include <zephyr.h>
#include <tc_util.h>
#include <kernel_internal.h>

void main(void)
{
	u32_t task_time_stamp;	/* timestamp at beginning of first task */
	u32_t main_us;		/* begin of main timestamp in us */
	u32_t task_us;		/* begin of task timestamp in us */
	u32_t idle_us;		/* begin of idle timestamp in us */

	task_time_stamp = k_cycle_get_32();

	/*
	 * Go to sleep for 1 tick in order to timestamp when idle thread halts.
	 */
	k_sleep(K_MSEC(1));

	main_us = (u32_t)ceiling_fraction(USEC_PER_SEC *
					  (u64_t)z_timestamp_main,
					  sys_clock_hw_cycles_per_sec());
	task_us = (u32_t)ceiling_fraction(USEC_PER_SEC *
					  (u64_t)task_time_stamp,
					  sys_clock_hw_cycles_per_sec());
	idle_us = (u32_t)ceiling_fraction(USEC_PER_SEC *
					  (u64_t)z_timestamp_idle,
					  sys_clock_hw_cycles_per_sec());

	TC_START("Boot Time Measurement");
	TC_PRINT("Boot Result: Clock Frequency: %d Hz\n",
					  sys_clock_hw_cycles_per_sec());
	TC_PRINT("_start->main(): %u cycles, %u us\n", z_timestamp_main,
						       main_us);
	TC_PRINT("_start->task  : %u cycles, %u us\n", task_time_stamp,
						       task_us);
	TC_PRINT("_start->idle  : %u cycles, %u us\n", z_timestamp_idle,
						       idle_us);
	TC_PRINT("Boot Time Measurement finished\n");

	TC_END_RESULT(TC_PASS);
	TC_END_REPORT(TC_PASS);
}