From 3f69e897aa68a07639e01f406eed4572c62eae43 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Mon, 11 Feb 2013 19:09:55 +0100 Subject: digital/ucoolib/ucoolib/utils: add trace buffer --- digital/ucoolib/ucoolib/utils/dtrace.py | 37 +++++++++ digital/ucoolib/ucoolib/utils/trace.hh | 133 ++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 digital/ucoolib/ucoolib/utils/dtrace.py create mode 100644 digital/ucoolib/ucoolib/utils/trace.hh (limited to 'digital/ucoolib') diff --git a/digital/ucoolib/ucoolib/utils/dtrace.py b/digital/ucoolib/ucoolib/utils/dtrace.py new file mode 100644 index 00000000..f836a363 --- /dev/null +++ b/digital/ucoolib/ucoolib/utils/dtrace.py @@ -0,0 +1,37 @@ +"""GDB plugin to dump trace from a Trace object.""" + +class DTrace(gdb.Command): + def __init__(self): + gdb.Command.__init__(self, "dtrace", gdb.COMMAND_DATA, gdb.COMPLETE_SYMBOL, True) + + def invoke(self, arg, from_tty): + args = gdb.string_to_argv(arg) + if len(args) != 1: + print 'Usage: dtrace ' + return + + trace = gdb.parse_and_eval(args[0]) + args_nb = trace['args_nb']; + entries_nb = trace['entries_nb']; + index = trace['index']; + entries = trace['entries']; + + if entries[index]['str']: + r = range(index, entries_nb) + range(index) + else: + r = range(index) + + for i in r: + entry = entries[i] + if not entry['str']: + break + s = entry['str'].string() + sargs = s.count('%') - 2 * s.count('%%') + args = tuple(entry['args'][i] for i in xrange(sargs)) + try: + s = s % args + except: + pass + print s + +DTrace() diff --git a/digital/ucoolib/ucoolib/utils/trace.hh b/digital/ucoolib/ucoolib/utils/trace.hh new file mode 100644 index 00000000..df8d59bb --- /dev/null +++ b/digital/ucoolib/ucoolib/utils/trace.hh @@ -0,0 +1,133 @@ +#ifndef ucoolib_utils_trace_hh +#define ucoolib_utils_trace_hh +// ucoolib - Microcontroller object oriented library. {{{ +// +// Copyright (C) 2013 Nicolas Schodet +// +// APBTeam: +// Web: http://apbteam.org/ +// Email: team AT apbteam DOT org +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} + +namespace ucoo { + +/// Trace buffer to be read with debugger, no initialisation, should be +/// instantiated in BSS. +class TraceBuffer +{ + /// Maximum number of arguments. + static const int args_nb = 4; + /// Maximum number of trace entries. + static const int entries_nb = 32; + public: + /// Trace without argument. + inline void operator() (const char *str); + /// Trace with N arguments... + inline void operator() (const char *str, int a0); + inline void operator() (const char *str, int a0, int a1); + inline void operator() (const char *str, int a0, int a1, int a2); + inline void operator() (const char *str, int a0, int a1, int a2, int a3); + private: + /// Trace entry, contains all given parameters. + struct Entry + { + const char *str; + int args[args_nb]; + }; + /// Trace entries array. + Entry entries[entries_nb]; + /// Index of next entry to be written in entries array. + unsigned int index; +}; + +/// Dummy trace, trace nothing. +class TraceDummy +{ + public: + inline void operator() (const char *str) { } + inline void operator() (const char *str, int a0) { } + inline void operator() (const char *str, int a0, int a1) { } + inline void operator() (const char *str, int a0, int a1, int a2) { } + inline void operator() (const char *str, int a0, int a1, int a2, int a3) { } +}; + +/// Conditional trace, whether it trace or not depends on the template +/// argument. +template +class Trace +{ +}; + +template<> +class Trace : public TraceBuffer +{ +}; + +template<> +class Trace : public TraceDummy +{ +}; + +inline void +TraceBuffer::operator() (const char *str) +{ + entries[index].str = str; + index = (index + 1) % entries_nb; +} + +inline void +TraceBuffer::operator() (const char *str, int a0) +{ + entries[index].str = str; + entries[index].args[0] = a0; + index = (index + 1) % entries_nb; +} + +inline void +TraceBuffer::operator() (const char *str, int a0, int a1) +{ + entries[index].str = str; + entries[index].args[0] = a0; + entries[index].args[1] = a1; + index = (index + 1) % entries_nb; +} + +inline void +TraceBuffer::operator() (const char *str, int a0, int a1, int a2) +{ + entries[index].str = str; + entries[index].args[0] = a0; + entries[index].args[1] = a1; + entries[index].args[2] = a2; + index = (index + 1) % entries_nb; +} + +inline void +TraceBuffer::operator() (const char *str, int a0, int a1, int a2, int a3) +{ + entries[index].str = str; + entries[index].args[0] = a0; + entries[index].args[1] = a1; + entries[index].args[2] = a2; + entries[index].args[3] = a3; + index = (index + 1) % entries_nb; +} + +} // namespace ucoo + +#endif // ucoolib_utils_trace_hh -- cgit v1.2.3