Cleanup debug module.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6120 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
c3dc5598c3
commit
649decd105
|
@ -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
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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); \
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue