X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcfg%2Fdebug.h;h=2fefc1b1468c68ed509503ec52c67abfc428c4c2;hb=dc1dad9f59d3e25ee9d6e4a25098818a0f629d2f;hp=a75b4d2d9f9b22f027bc53fd531683469ba534be;hpb=791e167e053bdd9250d34a9a5ccae6ccde4d6679;p=bertos.git diff --git a/bertos/cfg/debug.h b/bertos/cfg/debug.h index a75b4d2d..2fefc1b1 100644 --- a/bertos/cfg/debug.h +++ b/bertos/cfg/debug.h @@ -37,11 +37,17 @@ * diagnostic messages to a serial terminal or a JTAG debugger. * * \version $Id$ - * \author Bernardo Innocenti + * \author Bernie Innocenti + * + * $WIZ$ module_name = "debug" + * $WIZ$ module_configuration = "bertos/cfg/cfg_debug.h" + * $WIZ$ DEBUG = 1 + * $WIZ$ module_depends = "formatwr" + * $WIZ$ module_supports = "not atmega103" */ -#ifndef DEVLIB_DEBUG_H -#define DEVLIB_DEBUG_H +#ifndef BERTOS_DEBUG_H +#define BERTOS_DEBUG_H #include #include @@ -72,7 +78,6 @@ #endif #ifdef _DEBUG - // STLport specific: enable extra checks #define __STL_DEBUG 1 @@ -119,8 +124,8 @@ */ #define DB(x) x - #include /* CONFIG_KDEBUG_ASSERT_NO_TEXT */ - #include /* CPU_HARVARD */ + #include "cfg/cfg_debug.h" /* CONFIG_KDEBUG_ASSERT_NO_TEXT */ + #include /* CPU_HARVARD */ /* These are implemented in drv/kdebug.c */ void kdbg_init(void); @@ -130,17 +135,17 @@ void __init_wall(long *wall, int size); #if CPU_HARVARD - #include + #include void kputs_P(const char *PROGMEM str); 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 __bassert_P(const char *PROGMEM cond, const char *PROGMEM file, int line); void __trace_P(const char *func); void __tracemsg_P(const char *func, const char *PROGMEM fmt, ...); 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 __bassert(cond, file, line) __bassert_P(PSTR(cond), PSTR(file), (line)) #define __trace(func) __trace_P(func) #define __tracemsg(func, fmt, ...) __tracemsg_P(func, PSTR(fmt), ## __VA_ARGS__) #define __invalid_ptr(p, name, file, line) __invalid_ptr_P((p), PSTR(name), PSTR(file), (line)) @@ -148,7 +153,7 @@ #else /* !CPU_HARVARD */ 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 __bassert(const char *cond, const char *file, int line); void __trace(const char *func); void __tracemsg(const char *func, const char *fmt, ...) FORMAT(__printf__, 2, 3); int __invalid_ptr(void *p, const char *name, const char *file, int line); @@ -156,10 +161,10 @@ #endif /* !CPU_HARVARD */ #if !CONFIG_KDEBUG_ASSERT_NO_TEXT - #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__))) + #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __bassert(#x, THIS_FILE, __LINE__))) + #define ASSERT2(x, help) ((void)(LIKELY(x) ? 0 : __bassert(help " (" #x ")", THIS_FILE, __LINE__))) #else - #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __assert("", THIS_FILE, __LINE__))) + #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __bassert("", THIS_FILE, __LINE__))) #define ASSERT2(x, help) ((void)ASSERT(x)) #endif @@ -169,15 +174,24 @@ * The assumption here is that valid pointers never point to low * memory regions. This helps catching pointers taken from * struct/class memebers when the struct pointer was NULL. + * + * \see ASSERT_VALID_PTR_OR_NULL() */ - #define ASSERT_VALID_PTR(p) ((void)(LIKELY((p) >= 0x200) ? 0 : __invalid_ptr(p, #p, THIS_FILE, __LINE__))) + #define ASSERT_VALID_PTR(p) ((void)(LIKELY((void *)(p) >= (void *)CPU_RAM_START) \ + ? 0 : __invalid_ptr(p, #p, THIS_FILE, __LINE__))) /** * Check that the given pointer is not pointing to invalid memory. * + * \note The check for invalid memory is architecture specific and + * conservative. The current implementation only checks against + * a lower bound. + * * \see ASSERT_VALID_PTR() */ - #define ASSERT_VALID_PTR_OR_NULL(p) ((void)(LIKELY((p == NULL) || ((p) >= 0x200)) ? 0 : __invalid_ptr((p), #p, THIS_FILE, __LINE__))) + #define ASSERT_VALID_PTR_OR_NULL(p) ((void)(LIKELY((p == NULL) \ + || ((void *)(p) >= (void *)CPU_RAM_START)) \ + ? 0 : __invalid_ptr((p), #p, THIS_FILE, __LINE__))) #if !CONFIG_KDEBUG_DISABLE_TRACE #define TRACE __trace(__func__) @@ -187,6 +201,7 @@ #define TRACEMSG(...) do {} while(0) #endif + /** * \name Walls to detect data corruption * \{ @@ -305,9 +320,9 @@ #define kprintf(fmt,...) do { (void)(fmt); } while(0) #else /* ...but GCC can. */ - INLINE void kprintf(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + INLINE void kprintf(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } #endif #endif /* _DEBUG */ -#endif /* DEVLIB_DEBUG_H */ +#endif /* BERTOS_DEBUG_H */