libprof/libprof.c

58 lines
1.1 KiB
C
Raw Permalink Normal View History

2019-07-17 19:00:20 +02:00
#include <gint/timer.h>
#include <gint/clock.h>
2019-07-17 19:00:20 +02:00
#include <gint/mpu/tmu.h>
#include <gint/hardware.h>
#include <libprof.h>
/* Timer counter */
uint32_t volatile *prof_tcnt = NULL;
/* Timer ID */
static int prof_timer = -1;
2020-10-20 16:28:57 +02:00
static int callback(void)
{
return TIMER_CONTINUE;
}
/* prof_init(): Initialize the profiler's timer */
int prof_init(void)
{
/* Get a TMU with the exact constant 0xffffffff */
int timer = -1;
for(int t = 2; t >= 0 && timer == -1; t--)
{
2021-04-27 15:47:41 +02:00
timer = timer_configure(t | TIMER_Pphi_4, 0xffffffff,
GINT_CALL(callback));
}
if(timer == -1)
{
prof_quit();
return 1;
}
/* Keep the address of the TCNT register */
prof_tcnt = isSH3()
? &SH7705_TMU.TMU[timer].TCNT
: &SH7305_TMU.TMU[timer].TCNT;
timer_start(timer);
prof_timer = timer;
return 0;
}
/* prof_quit(): Free the profiler's timer */
void prof_quit(void)
{
if(prof_timer >= 0) timer_stop(prof_timer);
prof_timer = -1;
}
/* prof_time(): Time spent in a given context, in microseconds */
uint32_t prof_time(prof_t prof)
{
int Pphi = clock_freq()->Pphi_f;
return ((uint64_t)prof.elapsed * 4 * 1000000) / Pphi;
}