Cleanup debug module.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6120 35acf78f-673a-0410-8e92-d51de3d6d3f4
master
gdisirio 2013-08-10 10:17:45 +00:00
parent c3dc5598c3
commit 649decd105
10 changed files with 213 additions and 184 deletions

View File

@ -357,7 +357,7 @@
* @note The default is @p FALSE. * @note The default is @p FALSE.
*/ */
#if !defined(CH_DBG_STATISTICS) || defined(__DOXYGEN__) #if !defined(CH_DBG_STATISTICS) || defined(__DOXYGEN__)
#define CH_DBG_STATISTICS FALSE #define CH_DBG_STATISTICS TRUE
#endif #endif
/** /**
@ -368,7 +368,7 @@
* @note The default is @p FALSE. * @note The default is @p FALSE.
*/ */
#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) #if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__)
#define CH_DBG_SYSTEM_STATE_CHECK FALSE #define CH_DBG_SYSTEM_STATE_CHECK TRUE
#endif #endif
/** /**
@ -379,7 +379,7 @@
* @note The default is @p FALSE. * @note The default is @p FALSE.
*/ */
#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) #if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__)
#define CH_DBG_ENABLE_CHECKS FALSE #define CH_DBG_ENABLE_CHECKS TRUE
#endif #endif
/** /**
@ -391,7 +391,7 @@
* @note The default is @p FALSE. * @note The default is @p FALSE.
*/ */
#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) #if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__)
#define CH_DBG_ENABLE_ASSERTS FALSE #define CH_DBG_ENABLE_ASSERTS TRUE
#endif #endif
/** /**
@ -402,7 +402,7 @@
* @note The default is @p FALSE. * @note The default is @p FALSE.
*/ */
#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) #if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__)
#define CH_DBG_ENABLE_TRACE FALSE #define CH_DBG_ENABLE_TRACE TRUE
#endif #endif
/** /**
@ -416,7 +416,7 @@
* @p panic_msg variable set to @p NULL. * @p panic_msg variable set to @p NULL.
*/ */
#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) #if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
#define CH_DBG_ENABLE_STACK_CHECK FALSE #define CH_DBG_ENABLE_STACK_CHECK TRUE
#endif #endif
/** /**
@ -428,7 +428,7 @@
* @note The default is @p FALSE. * @note The default is @p FALSE.
*/ */
#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) #if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__)
#define CH_DBG_FILL_THREADS FALSE #define CH_DBG_FILL_THREADS TRUE
#endif #endif
/** /**
@ -441,7 +441,7 @@
* tickless mode. * tickless mode.
*/ */
#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) #if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__)
#define CH_DBG_THREADS_PROFILING FALSE #define CH_DBG_THREADS_PROFILING TRUE
#endif #endif
/** @} */ /** @} */

View File

@ -111,8 +111,8 @@ typedef struct virtual_timer virtual_timer_t;
#include "chcore.h" #include "chcore.h"
#include "chtm.h" #include "chtm.h"
#include "chstats.h" #include "chstats.h"
#include "chglobal.h"
#include "chsys.h" #include "chsys.h"
#include "chglobal.h"
#include "chvt.h" #include "chvt.h"
#include "chthreads.h" #include "chthreads.h"
#include "chlists.h" #include "chlists.h"

View File

@ -29,34 +29,30 @@
#ifndef _CHDEBUG_H_ #ifndef _CHDEBUG_H_
#define _CHDEBUG_H_ #define _CHDEBUG_H_
#if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || \ /*===========================================================================*/
CH_DBG_ENABLE_STACK_CHECK || CH_DBG_SYSTEM_STATE_CHECK /* Module constants. */
#define CH_DBG_ENABLED TRUE /*===========================================================================*/
#else
#define CH_DBG_ENABLED FALSE
#endif
#define __QUOTE_THIS(p) #p
/*===========================================================================*/ /*===========================================================================*/
/* Module pre-compile time settings. */
/*===========================================================================*/
/** /**
* @name Debug related settings * @name Debug related settings
* @{ * @{
*/ */
/*===========================================================================*/
/** /**
* @brief Trace buffer entries. * @brief Trace buffer entries.
*/ */
#ifndef CH_TRACE_BUFFER_SIZE #ifndef CH_DBG_TRACE_BUFFER_SIZE
#define CH_TRACE_BUFFER_SIZE 64 #define CH_DBG_TRACE_BUFFER_SIZE 64
#endif #endif
/** /**
* @brief Fill value for thread stack area in debug mode. * @brief Fill value for thread stack area in debug mode.
*/ */
#ifndef CH_STACK_FILL_VALUE #ifndef CH_DBG_STACK_FILL_VALUE
#define CH_STACK_FILL_VALUE 0x55 #define CH_DBG_STACK_FILL_VALUE 0x55
#endif #endif
/** /**
@ -66,37 +62,24 @@
* a debugger. A uninitialized field is not an error in itself but it * a debugger. A uninitialized field is not an error in itself but it
* better to know it. * better to know it.
*/ */
#ifndef CH_THREAD_FILL_VALUE #ifndef CH_DBG_THREAD_FILL_VALUE
#define CH_THREAD_FILL_VALUE 0xFF #define CH_DBG_THREAD_FILL_VALUE 0xFF
#endif #endif
/** @} */ /** @} */
/*===========================================================================*/ /*===========================================================================*/
/* System state checker related code and variables. */ /* Derived constants and error checks. */
/*===========================================================================*/ /*===========================================================================*/
#if !CH_DBG_SYSTEM_STATE_CHECK #if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || \
#define dbg_enter_lock() CH_DBG_ENABLE_STACK_CHECK || CH_DBG_SYSTEM_STATE_CHECK
#define dbg_leave_lock() #define CH_DBG_ENABLED TRUE
#define dbg_check_disable()
#define dbg_check_suspend()
#define dbg_check_enable()
#define dbg_check_lock()
#define dbg_check_unlock()
#define dbg_check_lock_from_isr()
#define dbg_check_unlock_from_isr()
#define dbg_check_enter_isr()
#define dbg_check_leave_isr()
#define chDbgCheckClassI();
#define chDbgCheckClassS();
#else #else
#define dbg_enter_lock() (dbg_lock_cnt = 1) #define CH_DBG_ENABLED FALSE
#define dbg_leave_lock() (dbg_lock_cnt = 0)
#endif #endif
/*===========================================================================*/ /*===========================================================================*/
/* Trace related structures and macros. */ /* Module data structures and types. */
/*===========================================================================*/ /*===========================================================================*/
#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) #if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__)
@ -104,43 +87,89 @@
* @brief Trace buffer record. * @brief Trace buffer record.
*/ */
typedef struct { typedef struct {
systime_t se_time; /**< @brief Time of the switch event. */ /**
thread_t *se_tp; /**< @brief Switched in thread. */ * @brief Time of the switch event.
void *se_wtobjp; /**< @brief Object where going to sleep.*/ */
uint8_t se_state; /**< @brief Switched out thread state. */ systime_t se_time;
/**
* @brief Switched in thread.
*/
thread_t *se_tp;
/**
* @brief Object where going to sleep.
*/
void *se_wtobjp;
/**
* @brief Switched out thread state.
*/
uint8_t se_state;
} ch_swc_event_t; } ch_swc_event_t;
/** /**
* @brief Trace buffer header. * @brief Trace buffer header.
*/ */
typedef struct { typedef struct {
unsigned tb_size; /**< @brief Trace buffer size (entries).*/ /**
ch_swc_event_t *tb_ptr; /**< @brief Pointer to the buffer front.*/ * @brief Trace buffer size (entries).
/** @brief Ring buffer.*/ */
ch_swc_event_t tb_buffer[CH_TRACE_BUFFER_SIZE]; unsigned tb_size;
/**
* @brief Pointer to the buffer front.
*/
ch_swc_event_t *tb_ptr;
/**
* @brief Ring buffer.
*/
ch_swc_event_t tb_buffer[CH_DBG_TRACE_BUFFER_SIZE];
} ch_trace_buffer_t; } ch_trace_buffer_t;
#if !defined(__DOXYGEN__)
extern ch_trace_buffer_t dbg_trace_buffer;
#endif
#endif /* CH_DBG_ENABLE_TRACE */ #endif /* CH_DBG_ENABLE_TRACE */
#if !CH_DBG_ENABLE_TRACE /*===========================================================================*/
/* When the trace feature is disabled this function is replaced by an empty /* Module macros. */
macro.*/ /*===========================================================================*/
#define dbg_trace(otp)
#define __QUOTE_THIS(p) #p
#if CH_DBG_SYSTEM_STATE_CHECK
#define _dbg_enter_lock() (ch.dbg_lock_cnt = 1)
#define _dbg_leave_lock() (ch.dbg_lock_cnt = 0)
#endif #endif
/*===========================================================================*/ /* When the state checker feature is disabled then the following functions
/* Parameters checking related macros. */ are replaced by an empty macro.*/
/*===========================================================================*/ #if !CH_DBG_SYSTEM_STATE_CHECK
#define _dbg_enter_lock()
#define _dbg_leave_lock()
#define _dbg_check_disable()
#define _dbg_check_suspend()
#define _dbg_check_enable()
#define _dbg_check_lock()
#define _dbg_check_unlock()
#define _dbg_check_lock_from_isr()
#define _dbg_check_unlock_from_isr()
#define _dbg_check_enter_isr()
#define _dbg_check_leave_isr()
#define chDbgCheckClassI()
#define chDbgCheckClassS()
#endif
/* When the trace feature is disabled this function is replaced by an empty
macro.*/
#if !CH_DBG_ENABLE_TRACE
#define _dbg_trace(otp)
#endif
/* When the debug features are disabled this function is replaced by an empty
macro.*/
#if !CH_DBG_ENABLED
#define chDbgPanic(msg) {}
#endif
#if CH_DBG_ENABLE_CHECKS || defined(__DOXYGEN__)
/** /**
* @name Macro Functions * @name Macro Functions
* @{ * @{
*/ */
#if CH_DBG_ENABLE_CHECKS || defined(__DOXYGEN__)
/** /**
* @brief Function parameters check. * @brief Function parameters check.
* @details If the condition check fails then the kernel panics and halts. * @details If the condition check fails then the kernel panics and halts.
@ -158,22 +187,14 @@ extern ch_trace_buffer_t dbg_trace_buffer;
chDbgPanic(__QUOTE_THIS(func)"()"); \ chDbgPanic(__QUOTE_THIS(func)"()"); \
} }
#endif /* !defined(chDbgCheck) */ #endif /* !defined(chDbgCheck) */
/** @} */
#else /* !CH_DBG_ENABLE_CHECKS */ #else /* !CH_DBG_ENABLE_CHECKS */
#define chDbgCheck(c, func) { \ #define chDbgCheck(c, func) { \
(void)(c), (void)__QUOTE_THIS(func)"()"; \ (void)(c), (void)__QUOTE_THIS(func)"()"; \
} }
#endif /* !CH_DBG_ENABLE_CHECKS */ #endif /* !CH_DBG_ENABLE_CHECKS */
/*===========================================================================*/
/* Assertions related macros. */
/*===========================================================================*/
#if CH_DBG_ENABLE_ASSERTS || defined(__DOXYGEN__) #if CH_DBG_ENABLE_ASSERTS || defined(__DOXYGEN__)
/**
* @name Macro Functions
* @{
*/
/** /**
* @brief Condition assertion. * @brief Condition assertion.
* @details If the condition check fails then the kernel panics with the * @details If the condition check fails then the kernel panics with the
@ -197,51 +218,46 @@ extern ch_trace_buffer_t dbg_trace_buffer;
chDbgPanic(m); \ chDbgPanic(m); \
} }
#endif /* !defined(chDbgAssert) */ #endif /* !defined(chDbgAssert) */
/** @} */
#else /* !CH_DBG_ENABLE_ASSERTS */ #else /* !CH_DBG_ENABLE_ASSERTS */
#define chDbgAssert(c, m, r) {(void)(c);} #define chDbgAssert(c, m, r) {(void)(c);}
#endif /* !CH_DBG_ENABLE_ASSERTS */ #endif /* !CH_DBG_ENABLE_ASSERTS */
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Panic related macros. */ /* External declarations. */
/*===========================================================================*/ /*===========================================================================*/
#if !CH_DBG_ENABLED
/* When the debug features are disabled this function is replaced by an empty
macro.*/
#define chDbgPanic(msg) {}
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#if CH_DBG_SYSTEM_STATE_CHECK #if CH_DBG_SYSTEM_STATE_CHECK
extern cnt_t dbg_isr_cnt; void _dbg_check_disable(void);
extern cnt_t dbg_lock_cnt; void _dbg_check_suspend(void);
void dbg_check_disable(void); void _dbg_check_enable(void);
void dbg_check_suspend(void); void _dbg_check_lock(void);
void dbg_check_enable(void); void _dbg_check_unlock(void);
void dbg_check_lock(void); void _dbg_check_lock_from_isr(void);
void dbg_check_unlock(void); void _dbg_check_unlock_from_isr(void);
void dbg_check_lock_from_isr(void); void _dbg_check_enter_isr(void);
void dbg_check_unlock_from_isr(void); void _dbg_check_leave_isr(void);
void dbg_check_enter_isr(void);
void dbg_check_leave_isr(void);
void chDbgCheckClassI(void); void chDbgCheckClassI(void);
void chDbgCheckClassS(void); void chDbgCheckClassS(void);
#endif #endif
#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) #if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__)
void _trace_init(void); void _trace_init(void);
void dbg_trace(thread_t *otp); void _dbg_trace(thread_t *otp);
#endif #endif
#if CH_DBG_ENABLED #if CH_DBG_ENABLED
extern const char *dbg_panic_msg;
void chDbgPanic(const char *msg); void chDbgPanic(const char *msg);
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
/*===========================================================================*/
/* Module inline functions. */
/*===========================================================================*/
#endif /* _CHDEBUG_H_ */ #endif /* _CHDEBUG_H_ */
/** @} */ /** @} */

View File

@ -120,6 +120,30 @@ typedef struct ch_system {
* @brief Virtual timers delta list header. * @brief Virtual timers delta list header.
*/ */
virtual_timers_list_t vtlist; virtual_timers_list_t vtlist;
#if CH_DBG_ENABLED || defined(__DOXYGEN__)
/**
* @brief Pointer to the panic message.
* @details This pointer is meant to be accessed through the debugger, it is
* written once and then the system is halted.
*/
const char *dbg_panic_msg;
#endif
#if CH_DBG_SYSTEM_STATE_CHECK || defined(__DOXYGEN__)
/**
* @brief ISR nesting level.
*/
cnt_t dbg_isr_cnt;
/**
* @brief Lock nesting level.
*/
cnt_t dbg_lock_cnt;
#endif
#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__)
/**
* @brief Public trace buffer.
*/
ch_trace_buffer_t dbg_trace_buffer;
#endif
} ch_system_t; } ch_system_t;
/*===========================================================================*/ /*===========================================================================*/

View File

@ -62,7 +62,7 @@
#define CH_IRQ_PROLOGUE() \ #define CH_IRQ_PROLOGUE() \
PORT_IRQ_PROLOGUE(); \ PORT_IRQ_PROLOGUE(); \
_stats_increase_irq(); \ _stats_increase_irq(); \
dbg_check_enter_isr() _dbg_check_enter_isr()
/** /**
* @brief IRQ handler exit code. * @brief IRQ handler exit code.
@ -73,7 +73,7 @@
* @special * @special
*/ */
#define CH_IRQ_EPILOGUE() \ #define CH_IRQ_EPILOGUE() \
dbg_check_leave_isr(); \ _dbg_check_leave_isr(); \
PORT_IRQ_EPILOGUE() PORT_IRQ_EPILOGUE()
/** /**
@ -202,7 +202,7 @@
*/ */
#define chSysSwitch(ntp, otp) { \ #define chSysSwitch(ntp, otp) { \
\ \
dbg_trace(otp); \ _dbg_trace(otp); \
_stats_ctxswc(ntp, otp); \ _stats_ctxswc(ntp, otp); \
CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp); \ CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp); \
port_switch(ntp, otp); \ port_switch(ntp, otp); \
@ -243,7 +243,7 @@ extern "C" {
static inline void chSysDisable(void) { static inline void chSysDisable(void) {
port_disable(); port_disable();
dbg_check_disable(); _dbg_check_disable();
} }
/** /**
@ -260,7 +260,7 @@ static inline void chSysDisable(void) {
static inline void chSysSuspend(void) { static inline void chSysSuspend(void) {
port_suspend(); port_suspend();
dbg_check_suspend(); _dbg_check_suspend();
} }
/** /**
@ -274,7 +274,7 @@ static inline void chSysSuspend(void) {
*/ */
static inline void chSysEnable(void) { static inline void chSysEnable(void) {
dbg_check_enable(); _dbg_check_enable();
port_enable(); port_enable();
} }
@ -287,7 +287,7 @@ static inline void chSysLock(void) {
port_lock(); port_lock();
_stats_start_measure_crit_thd(); _stats_start_measure_crit_thd();
dbg_check_lock(); _dbg_check_lock();
} }
/** /**
@ -297,7 +297,7 @@ static inline void chSysLock(void) {
*/ */
static inline void chSysUnlock(void) { static inline void chSysUnlock(void) {
dbg_check_unlock(); _dbg_check_unlock();
_stats_stop_measure_crit_thd(); _stats_stop_measure_crit_thd();
port_unlock(); port_unlock();
} }
@ -318,7 +318,7 @@ static inline void chSysLockFromISR(void) {
port_lock_from_isr(); port_lock_from_isr();
_stats_start_measure_crit_isr(); _stats_start_measure_crit_isr();
dbg_check_lock_from_isr(); _dbg_check_lock_from_isr();
} }
/** /**
@ -336,7 +336,7 @@ static inline void chSysLockFromISR(void) {
*/ */
static inline void chSysUnlockFromISR(void) { static inline void chSysUnlockFromISR(void) {
dbg_check_unlock_from_isr(); _dbg_check_unlock_from_isr();
_stats_stop_measure_crit_isr(); _stats_stop_measure_crit_isr();
port_unlock_from_isr(); port_unlock_from_isr();
} }

View File

@ -371,7 +371,7 @@ struct context {
#define port_switch(ntp, otp) _port_switch(ntp, otp) #define port_switch(ntp, otp) _port_switch(ntp, otp)
#else #else
#define port_switch(ntp, otp) { \ #define port_switch(ntp, otp) { \
struct intctx *r13 = __get_PSP(); \ struct intctx *r13 = (struct intctx *)__get_PSP(); \
if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \ if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \
chDbgPanic("stack overflow"); \ chDbgPanic("stack overflow"); \
_port_switch(ntp, otp); \ _port_switch(ntp, otp); \

View File

@ -85,7 +85,7 @@ _port_switch:
.globl _port_thread_start .globl _port_thread_start
_port_thread_start: _port_thread_start:
#if CH_DBG_SYSTEM_STATE_CHECK #if CH_DBG_SYSTEM_STATE_CHECK
bl dbg_check_unlock bl _dbg_check_unlock
#endif #endif
#if CH_DBG_STATISTICS #if CH_DBG_STATISTICS
bl _stats_stop_measure_crit_thd bl _stats_stop_measure_crit_thd
@ -112,11 +112,11 @@ _port_switch_from_isr:
bl _stats_start_measure_crit_thd bl _stats_start_measure_crit_thd
#endif #endif
#if CH_DBG_SYSTEM_STATE_CHECK #if CH_DBG_SYSTEM_STATE_CHECK
bl dbg_check_lock bl _dbg_check_lock
#endif #endif
bl chSchDoReschedule bl chSchDoReschedule
#if CH_DBG_SYSTEM_STATE_CHECK #if CH_DBG_SYSTEM_STATE_CHECK
bl dbg_check_unlock bl _dbg_check_unlock
#endif #endif
#if CH_DBG_STATISTICS #if CH_DBG_STATISTICS
bl _stats_stop_measure_crit_thd bl _stats_stop_measure_crit_thd

View File

@ -51,29 +51,38 @@
#include "ch.h" #include "ch.h"
/*===========================================================================*/ /*===========================================================================*/
/* System state checker related code and variables. */ /* Module local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local types. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/ /*===========================================================================*/
#if CH_DBG_SYSTEM_STATE_CHECK || defined(__DOXYGEN__) #if CH_DBG_SYSTEM_STATE_CHECK || defined(__DOXYGEN__)
/**
* @brief ISR nesting level.
*/
cnt_t dbg_isr_cnt;
/**
* @brief Lock nesting level.
*/
cnt_t dbg_lock_cnt;
/** /**
* @brief Guard code for @p chSysDisable(). * @brief Guard code for @p chSysDisable().
* *
* @notapi * @notapi
*/ */
void dbg_check_disable(void) { void _dbg_check_disable(void) {
if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#1"); chDbgPanic("SV#1");
} }
@ -82,9 +91,9 @@ void dbg_check_disable(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_suspend(void) { void _dbg_check_suspend(void) {
if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#2"); chDbgPanic("SV#2");
} }
@ -93,9 +102,9 @@ void dbg_check_suspend(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_enable(void) { void _dbg_check_enable(void) {
if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#3"); chDbgPanic("SV#3");
} }
@ -104,11 +113,11 @@ void dbg_check_enable(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_lock(void) { void _dbg_check_lock(void) {
if ((dbg_isr_cnt != 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#4"); chDbgPanic("SV#4");
dbg_enter_lock(); _dbg_enter_lock();
} }
/** /**
@ -116,11 +125,11 @@ void dbg_check_lock(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_unlock(void) { void _dbg_check_unlock(void) {
if ((dbg_isr_cnt != 0) || (dbg_lock_cnt <= 0)) if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0))
chDbgPanic("SV#5"); chDbgPanic("SV#5");
dbg_leave_lock(); _dbg_leave_lock();
} }
/** /**
@ -128,11 +137,11 @@ void dbg_check_unlock(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_lock_from_isr(void) { void _dbg_check_lock_from_isr(void) {
if ((dbg_isr_cnt <= 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#6"); chDbgPanic("SV#6");
dbg_enter_lock(); _dbg_enter_lock();
} }
/** /**
@ -140,11 +149,11 @@ void dbg_check_lock_from_isr(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_unlock_from_isr(void) { void _dbg_check_unlock_from_isr(void) {
if ((dbg_isr_cnt <= 0) || (dbg_lock_cnt <= 0)) if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt <= 0))
chDbgPanic("SV#7"); chDbgPanic("SV#7");
dbg_leave_lock(); _dbg_leave_lock();
} }
/** /**
@ -152,12 +161,12 @@ void dbg_check_unlock_from_isr(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_enter_isr(void) { void _dbg_check_enter_isr(void) {
port_lock_from_isr(); port_lock_from_isr();
if ((dbg_isr_cnt < 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#8"); chDbgPanic("SV#8");
dbg_isr_cnt++; ch.dbg_isr_cnt++;
port_unlock_from_isr(); port_unlock_from_isr();
} }
@ -166,12 +175,12 @@ void dbg_check_enter_isr(void) {
* *
* @notapi * @notapi
*/ */
void dbg_check_leave_isr(void) { void _dbg_check_leave_isr(void) {
port_lock_from_isr(); port_lock_from_isr();
if ((dbg_isr_cnt <= 0) || (dbg_lock_cnt != 0)) if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0))
chDbgPanic("SV#9"); chDbgPanic("SV#9");
dbg_isr_cnt--; ch.dbg_isr_cnt--;
port_unlock_from_isr(); port_unlock_from_isr();
} }
@ -185,7 +194,7 @@ void dbg_check_leave_isr(void) {
*/ */
void chDbgCheckClassI(void) { void chDbgCheckClassI(void) {
if ((dbg_isr_cnt < 0) || (dbg_lock_cnt <= 0)) if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt <= 0))
chDbgPanic("SV#10"); chDbgPanic("SV#10");
} }
@ -199,30 +208,21 @@ void chDbgCheckClassI(void) {
*/ */
void chDbgCheckClassS(void) { void chDbgCheckClassS(void) {
if ((dbg_isr_cnt != 0) || (dbg_lock_cnt <= 0)) if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0))
chDbgPanic("SV#11"); chDbgPanic("SV#11");
} }
#endif /* CH_DBG_SYSTEM_STATE_CHECK */ #endif /* CH_DBG_SYSTEM_STATE_CHECK */
/*===========================================================================*/
/* Trace related code and variables. */
/*===========================================================================*/
#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) #if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__)
/**
* @brief Public trace buffer.
*/
ch_trace_buffer_t dbg_trace_buffer;
/** /**
* @brief Trace circular buffer subsystem initialization. * @brief Trace circular buffer subsystem initialization.
* @note Internal use only. * @note Internal use only.
*/ */
void _trace_init(void) { void _trace_init(void) {
dbg_trace_buffer.tb_size = CH_TRACE_BUFFER_SIZE; ch.dbg_trace_buffer.tb_size = CH_DBG_TRACE_BUFFER_SIZE;
dbg_trace_buffer.tb_ptr = &dbg_trace_buffer.tb_buffer[0]; ch.dbg_trace_buffer.tb_ptr = &ch.dbg_trace_buffer.tb_buffer[0];
} }
/** /**
@ -232,30 +232,19 @@ void _trace_init(void) {
* *
* @notapi * @notapi
*/ */
void dbg_trace(thread_t *otp) { void _dbg_trace(thread_t *otp) {
dbg_trace_buffer.tb_ptr->se_time = chVTGetSystemTimeX(); ch.dbg_trace_buffer.tb_ptr->se_time = chVTGetSystemTimeX();
dbg_trace_buffer.tb_ptr->se_tp = currp; ch.dbg_trace_buffer.tb_ptr->se_tp = currp;
dbg_trace_buffer.tb_ptr->se_wtobjp = otp->p_u.wtobjp; ch.dbg_trace_buffer.tb_ptr->se_wtobjp = otp->p_u.wtobjp;
dbg_trace_buffer.tb_ptr->se_state = (uint8_t)otp->p_state; ch.dbg_trace_buffer.tb_ptr->se_state = (uint8_t)otp->p_state;
if (++dbg_trace_buffer.tb_ptr >= if (++ch.dbg_trace_buffer.tb_ptr >=
&dbg_trace_buffer.tb_buffer[CH_TRACE_BUFFER_SIZE]) &ch.dbg_trace_buffer.tb_buffer[CH_DBG_TRACE_BUFFER_SIZE])
dbg_trace_buffer.tb_ptr = &dbg_trace_buffer.tb_buffer[0]; ch.dbg_trace_buffer.tb_ptr = &ch.dbg_trace_buffer.tb_buffer[0];
} }
#endif /* CH_DBG_ENABLE_TRACE */ #endif /* CH_DBG_ENABLE_TRACE */
/*===========================================================================*/
/* Panic related code and variables. */
/*===========================================================================*/
#if CH_DBG_ENABLED || defined(__DOXYGEN__) #if CH_DBG_ENABLED || defined(__DOXYGEN__)
/**
* @brief Pointer to the panic message.
* @details This pointer is meant to be accessed through the debugger, it is
* written once and then the system is halted.
*/
const char *dbg_panic_msg;
/** /**
* @brief Prints a panic message on the console and then halts the system. * @brief Prints a panic message on the console and then halts the system.
* *
@ -263,7 +252,7 @@ const char *dbg_panic_msg;
*/ */
void chDbgPanic(const char *msg) { void chDbgPanic(const char *msg) {
dbg_panic_msg = msg; ch.dbg_panic_msg = msg;
chSysHalt(); chSysHalt();
} }
#endif /* CH_DBG_ENABLED */ #endif /* CH_DBG_ENABLED */

View File

@ -156,10 +156,10 @@ thread_t *chThdCreateFromHeap(memory_heap_t *heapp, size_t size,
#if CH_DBG_FILL_THREADS #if CH_DBG_FILL_THREADS
_thread_memfill((uint8_t *)wsp, _thread_memfill((uint8_t *)wsp,
(uint8_t *)wsp + sizeof(thread_t), (uint8_t *)wsp + sizeof(thread_t),
CH_THREAD_FILL_VALUE); CH_DBG_THREAD_FILL_VALUE);
_thread_memfill((uint8_t *)wsp + sizeof(thread_t), _thread_memfill((uint8_t *)wsp + sizeof(thread_t),
(uint8_t *)wsp + size, (uint8_t *)wsp + size,
CH_STACK_FILL_VALUE); CH_DBG_STACK_FILL_VALUE);
#endif #endif
chSysLock(); chSysLock();
@ -207,10 +207,10 @@ thread_t *chThdCreateFromMemoryPool(memory_pool_t *mp, tprio_t prio,
#if CH_DBG_FILL_THREADS #if CH_DBG_FILL_THREADS
_thread_memfill((uint8_t *)wsp, _thread_memfill((uint8_t *)wsp,
(uint8_t *)wsp + sizeof(thread_t), (uint8_t *)wsp + sizeof(thread_t),
CH_THREAD_FILL_VALUE); CH_DBG_THREAD_FILL_VALUE);
_thread_memfill((uint8_t *)wsp + sizeof(thread_t), _thread_memfill((uint8_t *)wsp + sizeof(thread_t),
(uint8_t *)wsp + mp->mp_object_size, (uint8_t *)wsp + mp->mp_object_size,
CH_STACK_FILL_VALUE); CH_DBG_STACK_FILL_VALUE);
#endif #endif
chSysLock(); chSysLock();

View File

@ -212,10 +212,10 @@ thread_t *chThdCreateStatic(void *wsp, size_t size,
#if CH_DBG_FILL_THREADS #if CH_DBG_FILL_THREADS
_thread_memfill((uint8_t *)wsp, _thread_memfill((uint8_t *)wsp,
(uint8_t *)wsp + sizeof(thread_t), (uint8_t *)wsp + sizeof(thread_t),
CH_THREAD_FILL_VALUE); CH_DBG_THREAD_FILL_VALUE);
_thread_memfill((uint8_t *)wsp + sizeof(thread_t), _thread_memfill((uint8_t *)wsp + sizeof(thread_t),
(uint8_t *)wsp + size, (uint8_t *)wsp + size,
CH_STACK_FILL_VALUE); CH_DBG_STACK_FILL_VALUE);
#endif #endif
chSysLock(); chSysLock();
chSchWakeupS(tp = chThdCreateI(wsp, size, prio, pf, arg), RDY_OK); chSchWakeupS(tp = chThdCreateI(wsp, size, prio, pf, arg), RDY_OK);