From 05dccc355144dc717b3cb9ef0074a9ab38a520f4 Mon Sep 17 00:00:00 2001 From: Brandon Low Date: Wed, 18 Jan 2006 20:54:13 +0000 Subject: Profiling support, tools and documentation. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8375 a1c6a512-1295-4272-9138-f99709370657 --- firmware/export/profile.h | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 firmware/export/profile.h (limited to 'firmware/export/profile.h') diff --git a/firmware/export/profile.h b/firmware/export/profile.h new file mode 100644 index 0000000000..cb751328ae --- /dev/null +++ b/firmware/export/profile.h @@ -0,0 +1,80 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Profiling routines counts ticks and calls to each profiled function. + * + * Copyright (C) 2005 by Brandon Low + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + ****************************************************************************/ + +#ifndef _SYS_PROFILE_H +#define _SYS_PROFILE_H 1 + +#include + +/* PFD is Profiled Function Data */ + +/* Indices are shorts which means that we use 4k of RAM */ +#define INDEX_BITS 11 /* What is a reasonable size for this? */ +#define INDEX_SIZE 2048 /* 2 ^ INDEX_BITS */ +#define INDEX_MASK 0x7FF /* lower INDEX_BITS 1 */ + +/* + * In the current setup (pfd has 4 longs and 2 shorts) this uses 20k of RAM + * for profiling, and allows for profiling sections of code with up-to + * 1024 function caller->callee pairs + */ +#define NUMPFDS 1024 + +struct pfd_struct { + void *self_pc; + unsigned long count; + unsigned long time; + unsigned short link; + struct pfd_struct *caller; +}; + +/* Possible states of profiling */ +#define PROF_ON 0x00 +#define PROF_BUSY 0x01 +#define PROF_ERROR 0x02 +#define PROF_OFF 0x03 +/* Masks for thread switches */ +#define PROF_OFF_THREAD 0x10 +#define PROF_ON_THREAD 0x0F + +extern int current_thread; + +/* Initialize and start profiling */ +void profstart(int current_thread) + NO_PROF_ATTR; + +/* Clean up and write profile data */ +void profstop (void) + NO_PROF_ATTR; + +/* Called every time a thread stops, we check if it's our thread and store + * temporary timing data if it is */ +void profile_thread_stopped(int current_thread) + NO_PROF_ATTR; +/* Called when a thread starts, we check if it's our thread and resume timing */ +void profile_thread_started(int current_thread) + NO_PROF_ATTR; + +void profile_func_exit(void *this_fn, void *call_site) + NO_PROF_ATTR ICODE_ATTR; +void profile_func_enter(void *this_fn, void *call_site) + NO_PROF_ATTR ICODE_ATTR; + +#endif /*_SYS_PROFILE_H*/ -- cgit v1.2.3