X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=debug.h;h=1ede2d7217158f00db113e48321f98f306a3054a;hb=201ffee317b51ececed2ee6cc140eda6ce69f5e0;hp=edd3c5db6c22a96cf1d50c09b425f504f644ab18;hpb=e80433efeea66e4c978029d36e50b1dba54b6751;p=bertos.git diff --git a/debug.h b/debug.h index edd3c5db..1ede2d72 100755 --- a/debug.h +++ b/debug.h @@ -5,11 +5,11 @@ * This file is part of DevLib - See devlib/README for information. * --> * - * \brief Simple debug facilities for hosted and embedded C/C++ applications + * \brief Simple debug facilities for hosted and embedded C/C++ applications. * - * Debug output goes to stderr in hosted applications. Freestanding (AKA embedded) - * applications use drv/kdebug.c to output diagnostic messages to a serial terminal - * or a JTAG debugger. + * Debug output goes to stderr in hosted applications. + * Freestanding (AKA embedded) applications use \c drv/kdebug.c to output + * diagnostic messages to a serial terminal or a JTAG debugger. * * \version $Id$ * \author Bernardo Innocenti @@ -17,6 +17,27 @@ /*#* *#* $Log$ + *#* Revision 1.8 2005/01/11 18:08:08 aleph + *#* Add empty kdump definition for debug off + *#* + *#* Revision 1.7 2004/12/31 17:43:09 bernie + *#* Use UNUSED_ARG instead of obsolete UNUSED macro. + *#* + *#* Revision 1.6 2004/12/08 08:52:00 bernie + *#* Save some more RAM on AVR. + *#* + *#* Revision 1.5 2004/12/08 08:04:13 bernie + *#* Doxygen fixes. + *#* + *#* Revision 1.4 2004/12/08 07:29:27 bernie + *#* Fix Doxygen tags. + *#* + *#* Revision 1.3 2004/09/20 03:31:27 bernie + *#* Sanitize for C++. + *#* + *#* Revision 1.2 2004/09/14 21:01:46 bernie + *#* Mark assertions as LIKELY(). + *#* *#* Revision 1.1 2004/09/14 20:19:47 bernie *#* Unified debug macros. *#* @@ -57,16 +78,19 @@ #ifndef INLINE #define INLINE static inline #endif - #ifndef UNUSED - #define UNUSED(type,name) type + #ifndef UNUSED_ARG + #ifdef __cplusplus + #define UNUSED_ARG(type,name) type + #else + #define UNUSED_ARG(type,name) type name + #endif #endif #else /* !OS_HOSTED */ + #include #include #endif /* !OS_HOSTED */ -/*! - * \def _DEBUG - * +/* * This preprocessor symbol is defined only in debug builds. * * The build infrastructure must arrange for _DEBUG to @@ -107,7 +131,7 @@ * statements conditioned on \c _DEBUG, avoiding the clutter * of #ifdef/#endif pairs. * - * \example + * \code * struct FooBar * { * int foo; @@ -119,8 +143,7 @@ * DB(--ref_count;) * } * }; - * - * \endexample + * \endcode */ #define DB(x) x @@ -162,10 +185,11 @@ #define ASSERT_VALID_PTR_OR_NULL(p) ASSERT((((p) == NULL) || ((unsigned long)(p) >= 0x200))) #else /* !OS_HOSTED */ - /* Implemented in drv/kdebug.h */ + /* These are implemented in drv/kdebug.c */ void kdbg_init(void); void kputchar(char c); void kdump(const void *buf, size_t len); + void __init_wall(long *wall, int size); #ifdef __AVR__ #include @@ -173,33 +197,32 @@ void kprintf_P(const char *PROGMEM fmt, ...) FORMAT(__printf__, 1, 2); int __assert_P(const char *PROGMEM cond, const char *PROGMEM file, int line); int __invalid_ptr_P(void *p, const char *PROGMEM name, const char *PROGMEM file, int line); + int __check_wall_P(long *wall, int size, const char * PGM_ATTR name, const char * PGM_ATTR file, int line); #define kputs(str) kputs_P(PSTR(str)) #define kprintf(fmt, ...) kprintf_P(PSTR(fmt) ,## __VA_ARGS__) #define __assert(cond, file, line) __assert_P(PSTR(cond), PSTR(file), (line)) #define __invalid_ptr(p, name, file, line) __invalid_ptr_P((p), PSTR(name), PSTR(file), (line)) + #define __check_wall(wall, size, name, file, line) __check_wall_P(wall, size, PSTR(name), PSTR(file), (line)) #else /* !__AVR__ */ void kputs(const char *str); void kprintf(const char * fmt, ...) FORMAT(__printf__, 1, 2); int __assert(const char *cond, const char *file, int line); int __invalid_ptr(void *p, const char *name, const char *file, int line); + int __check_wall(long *wall, int size, const char *name, const char *file, int line); #endif /* !__AVR__ */ - void __init_wall(long *wall, int size); - int __check_wall(long *wall, int size, const char *name, const char *file, int line); - #ifndef CONFIG_KDEBUG_ASSERT_NO_TEXT - #define ASSERT(x) ((x) ? 0 : __assert(#x, THIS_FILE, __LINE__)) - #define ASSERT2(x, help) ((x) ? 0 : __assert(help " (" #x ")", THIS_FILE, __LINE__)) + #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __assert(#x, THIS_FILE, __LINE__))) + #define ASSERT2(x, help) ((void)(LIKELY(x) ? 0 : __assert(help " (" #x ")", THIS_FILE, __LINE__))) #else - #define ASSERT(x) ((x) ? 0 : __assert("", THIS_FILE, __LINE__)) - #define ASSERT2(x, help) ASSERT(x) + #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __assert("", THIS_FILE, __LINE__))) + #define ASSERT2(x, help) ((void)ASSERT(x)) #endif - #define ASSERT_VALID_PTR(p) (((p) >= 0x200) ? 0 : __invalid_ptr(p, #p, THIS_FILE, __LINE__)) - #define ASSERT_VALID_PTR_OR_NULL(p) (((p == NULL) || ((p) >= 0x200)) ? 0 : __invalid_ptr((p), #p, THIS_FILE, __LINE__)) - #define TRACE kprintf("%s()\n", __FUNCTION__) - #define TRACEMSG(msg,...) kprintf("%s(): " msg "\n", __FUNCTION__, ## __VA_ARGS__) - + #define ASSERT_VALID_PTR(p) ((void)(LIKELY((p) >= 0x200) ? 0 : __invalid_ptr(p, #p, THIS_FILE, __LINE__))) + #define ASSERT_VALID_PTR_OR_NULL(p) ((void)(LIKELY((p == NULL) || ((p) >= 0x200)) ? 0 : __invalid_ptr((p), #p, THIS_FILE, __LINE__))) + #define TRACE kprintf("%s()\n", __FUNCTION__) + #define TRACEMSG(msg,...) kprintf("%s(): " msg "\n", __FUNCTION__, ## __VA_ARGS__) #endif /* !OS_HOSTED */ @@ -230,7 +253,7 @@ * These macros help track some kinds of leaks in C++ programs. * Usage is as follows: * - * \example + * \code * class Foo * { * DECLARE_INSTANCE_TRACKING(Foo) @@ -259,8 +282,8 @@ * delete foo; * ASSERT_ZERO_INSTANCES(Foo); // OK * } - * - * \end example + * \endcode + * \{ */ #define NEW_INSTANCE(CLASS) do { ++CLASS::__instances } while (0) #define DELETE_INSTANCE(CLASS) do { --CLASS::__instances } while (0) @@ -268,6 +291,7 @@ #define GET_INSTANCE_COUNT(CLASS) (CLASS::__instances) #define DECLARE_INSTANCE_TRACKING(CLASS) static int __instances #define IMPLEMENT_INSTANCE_TRACKING(CLASS) int CLASS::__instances = 0 + /*\}*/ #else /* !_DEBUG */ @@ -303,9 +327,17 @@ #define IMPLEMENT_INSTANCE_TRACKING(CLASS) INLINE void kdbg_init(void) { /* nop */ } - INLINE void kputchar(UNUSED(char, c)) { /* nop */ } - INLINE void kputs(UNUSED(const char*, str)) { /* nop */ } - INLINE void kprintf(UNUSED(const char*, fmt), ...) { /* nop */ } + INLINE void kputchar(UNUSED_ARG(char, c)) { /* nop */ } + INLINE void kputs(UNUSED_ARG(const char *, str)) { /* nop */ } + INLINE void kdump(UNUSED_ARG(const void *, buf), UNUSED_ARG(size_t, len)) { /* nop */ } + + #ifdef __cplusplus + /* G++ can't inline functions with variable arguments... */ + #define kprintf(fmt,...) do { (void)(fmt); } while(0) + #else + /* ...but GCC can. */ + INLINE void kprintf(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #endif #endif /* _DEBUG */