- * 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.
+ *#* 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().
+ *#*
* This preprocessor symbol is defined only in debug builds.
*
* The build infrastructure must arrange for _DEBUG to
* This preprocessor symbol is defined only in debug builds.
*
* The build infrastructure must arrange for _DEBUG to
* statements conditioned on \c _DEBUG, avoiding the clutter
* of #ifdef/#endif pairs.
*
* statements conditioned on \c _DEBUG, avoiding the clutter
* of #ifdef/#endif pairs.
*
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);
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);
#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 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);
#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);
- void __init_wall(long *wall, int size);
- int __check_wall(long *wall, int size, const char *name, const char *file, int line);
-
- #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__)))
- #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))
- #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__)
*/
#define NEW_INSTANCE(CLASS) do { ++CLASS::__instances } while (0)
#define DELETE_INSTANCE(CLASS) do { --CLASS::__instances } while (0)
*/
#define NEW_INSTANCE(CLASS) do { ++CLASS::__instances } while (0)
#define DELETE_INSTANCE(CLASS) do { --CLASS::__instances } while (0)
#define GET_INSTANCE_COUNT(CLASS) (CLASS::__instances)
#define DECLARE_INSTANCE_TRACKING(CLASS) static int __instances
#define IMPLEMENT_INSTANCE_TRACKING(CLASS) int CLASS::__instances = 0
#define GET_INSTANCE_COUNT(CLASS) (CLASS::__instances)
#define DECLARE_INSTANCE_TRACKING(CLASS) static int __instances
#define IMPLEMENT_INSTANCE_TRACKING(CLASS) int CLASS::__instances = 0
INLINE void kdbg_init(void) { /* nop */ }
INLINE void kputchar(UNUSED(char, c)) { /* nop */ }
INLINE void kputs(UNUSED(const char*, str)) { /* nop */ }
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 */ }
+ #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(const char*, fmt), ...) { /* nop */ }
+ #endif