blob: 6306dc3076e79ea97928de52efa89de72762b643 [file] [log] [blame]
/*
* Copyright (c) 2017 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <kernel.h>
/* #include <kernel_structs.h> */
u64_t __noinit __start_swap_time;
u64_t __noinit __end_swap_time;
u64_t __noinit __start_intr_time;
u64_t __noinit __end_intr_time;
u64_t __noinit __start_tick_time;
u64_t __noinit __end_tick_time;
/* location of the time stamps*/
u32_t __read_swap_end_time_value;
u64_t __common_var_swap_end_time;
/* NRF RTC TIMER runs ar very slow rate (32KHz), So in order to measure
* Kernel stats dedicated timer is used to measure kernel stats
*/
#if defined(CONFIG_NRF_RTC_TIMER)
#include <arch/arm/cortex_m/cmsis.h>
/* To get current count of timer, first 1 need to be written into
* Capture Register and Current Count will be copied into corresponding
* current count register.
*/
#define TIMING_INFO_PRE_READ() (NRF_TIMER2->TASKS_CAPTURE[0] = 1)
#define TIMING_INFO_OS_GET_TIME() (NRF_TIMER2->CC[0])
#define TIMING_INFO_GET_TIMER_VALUE() TIMING_INFO_OS_GET_TIME()
#else /* All other architectures */
#define TIMING_INFO_PRE_READ()
#define TIMING_INFO_OS_GET_TIME() k_cycle_get_32()
#ifdef CONFIG_ARM
#include <arch/arm/cortex_m/cmsis.h>
#define TIMING_INFO_GET_TIMER_VALUE() SysTick->VAL
#endif /* CONFIG_ARM */
#endif /* CONFIG_NRF_RTC_TIMER */
#ifdef CONFIG_ARM
void read_timer_start_of_swap(void)
{
TIMING_INFO_PRE_READ();
__start_swap_time = (u32_t) TIMING_INFO_GET_TIMER_VALUE();
}
void read_timer_end_of_swap(void)
{
if (__read_swap_end_time_value == 1) {
TIMING_INFO_PRE_READ();
__read_swap_end_time_value = 2;
__common_var_swap_end_time = TIMING_INFO_OS_GET_TIME();
}
}
/* ARM processors read current value of time through sysTick timer
* and nrf soc read it though timer
*/
void read_timer_start_of_isr(void)
{
TIMING_INFO_PRE_READ();
__start_intr_time = (u32_t) TIMING_INFO_GET_TIMER_VALUE();
}
void read_timer_end_of_isr(void)
{
TIMING_INFO_PRE_READ();
__end_intr_time = (u32_t) TIMING_INFO_GET_TIMER_VALUE();
}
void read_timer_start_of_tick_handler(void)
{
TIMING_INFO_PRE_READ();
__start_tick_time = (u32_t)TIMING_INFO_GET_TIMER_VALUE();
}
void read_timer_end_of_tick_handler(void)
{
TIMING_INFO_PRE_READ();
__end_tick_time = (u32_t) TIMING_INFO_GET_TIMER_VALUE();
}
#endif /* CONFIG_ARM */