git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7507 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2014-11-14 11:07:04 +00:00
parent 79a1586513
commit 1409bd15bd
8 changed files with 85 additions and 73 deletions

View File

@ -264,8 +264,6 @@ else
@$(OD) $(ODFLAGS) $< > $@
@echo
@$(SZ) $<
@echo
@echo Done
endif
%.list: %.elf $(LDSCRIPT)
@ -274,6 +272,7 @@ ifeq ($(USE_VERBOSE_COMPILE),yes)
else
@echo Creating $@
@$(OD) -S $< > $@
@echo
@echo Done
endif

View File

@ -71,13 +71,6 @@
/* Derived constants and error checks. */
/*===========================================================================*/
#if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || \
CH_DBG_ENABLE_STACK_CHECK || CH_DBG_SYSTEM_STATE_CHECK
#define CH_DBG_ENABLED TRUE
#else
#define CH_DBG_ENABLED FALSE
#endif
/*===========================================================================*/
/* Module data structures and types. */
/*===========================================================================*/
@ -129,8 +122,8 @@ typedef struct {
/*===========================================================================*/
#if CH_DBG_SYSTEM_STATE_CHECK
#define _dbg_enter_lock() (ch.dbg_lock_cnt = 1)
#define _dbg_leave_lock() (ch.dbg_lock_cnt = 0)
#define _dbg_enter_lock() (ch.dbg.lock_cnt = 1)
#define _dbg_leave_lock() (ch.dbg.lock_cnt = 0)
#endif
/* When the state checker feature is disabled then the following functions
@ -221,7 +214,7 @@ extern "C" {
void chDbgCheckClassS(void);
#endif
#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__)
void _trace_init(void);
void _dbg_trace_init(void);
void _dbg_trace(thread_t *otp);
#endif
#ifdef __cplusplus

View File

@ -284,6 +284,36 @@ struct ch_ready_list {
thread. */
};
/**
* @brief System debug data structure.
*/
struct ch_system_debug {
/**
* @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.
* @note Accesses to this pointer must never be optimized out so the
* field itself is declared volatile.
*/
const char * volatile panic_msg;
#if CH_DBG_SYSTEM_STATE_CHECK || defined(__DOXYGEN__)
/**
* @brief ISR nesting level.
*/
cnt_t isr_cnt;
/**
* @brief Lock nesting level.
*/
cnt_t lock_cnt;
#endif
#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__)
/**
* @brief Public trace buffer.
*/
ch_trace_buffer_t trace_buffer;
#endif
};
/**
* @brief System data structure.
* @note This structure contain all the data areas used by the OS except
@ -298,11 +328,15 @@ struct ch_system {
* @brief Virtual timers delta list header.
*/
virtual_timers_list_t vtlist;
/**
* @brief System debug.
*/
system_debug_t dbg;
#if CH_CFG_USE_TM || defined(__DOXYGEN__)
/**
* @brief Measurement calibration value.
* @brief Time measurement calibration data.
*/
rtcnt_t measurement_offset;
tm_calibration_t tm;
#endif
#if CH_DBG_STATISTICS || defined(__DOXYGEN__)
/**
@ -310,32 +344,6 @@ struct ch_system {
*/
kernel_stats_t kernel_stats;
#endif
#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.
* @note Accesses to this pointer must never be optimized out so the
* field itself is declared volatile.
*/
const char * volatile 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
};
/*===========================================================================*/

View File

@ -97,6 +97,11 @@ typedef struct ch_virtual_timer virtual_timer_t;
*/
typedef struct ch_virtual_timers_list virtual_timers_list_t;
/**
* @brief Type of a system debug structure.
*/
typedef struct ch_system_debug system_debug_t;
/**
* @brief Type of system data structure.
*/

View File

@ -51,6 +51,16 @@
/* Module data structures and types. */
/*===========================================================================*/
/**
* @brief Type of a time measurement calibration data.
*/
typedef struct {
/**
* @brief Measurement calibration value.
*/
rtcnt_t offset;
} tm_calibration_t;
/**
* @brief Type of a Time Measurement object.
* @note The maximum measurable time period depends on the implementation

View File

@ -114,7 +114,7 @@
*/
void _dbg_check_disable(void) {
if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt != 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#1");
}
@ -125,7 +125,7 @@ void _dbg_check_disable(void) {
*/
void _dbg_check_suspend(void) {
if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt != 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#2");
}
@ -136,7 +136,7 @@ void _dbg_check_suspend(void) {
*/
void _dbg_check_enable(void) {
if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt != 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#3");
}
@ -147,7 +147,7 @@ void _dbg_check_enable(void) {
*/
void _dbg_check_lock(void) {
if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt != 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#4");
_dbg_enter_lock();
}
@ -159,7 +159,7 @@ void _dbg_check_lock(void) {
*/
void _dbg_check_unlock(void) {
if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0))
if ((ch.dbg.isr_cnt != 0) || (ch.dbg.lock_cnt <= 0))
chSysHalt("SV#5");
_dbg_leave_lock();
}
@ -171,7 +171,7 @@ void _dbg_check_unlock(void) {
*/
void _dbg_check_lock_from_isr(void) {
if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt <= 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#6");
_dbg_enter_lock();
}
@ -183,7 +183,7 @@ void _dbg_check_lock_from_isr(void) {
*/
void _dbg_check_unlock_from_isr(void) {
if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt <= 0))
if ((ch.dbg.isr_cnt <= 0) || (ch.dbg.lock_cnt <= 0))
chSysHalt("SV#7");
_dbg_leave_lock();
}
@ -196,9 +196,9 @@ void _dbg_check_unlock_from_isr(void) {
void _dbg_check_enter_isr(void) {
port_lock_from_isr();
if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt < 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#8");
ch.dbg_isr_cnt++;
ch.dbg.isr_cnt++;
port_unlock_from_isr();
}
@ -210,9 +210,9 @@ void _dbg_check_enter_isr(void) {
void _dbg_check_leave_isr(void) {
port_lock_from_isr();
if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0))
if ((ch.dbg.isr_cnt <= 0) || (ch.dbg.lock_cnt != 0))
chSysHalt("SV#9");
ch.dbg_isr_cnt--;
ch.dbg.isr_cnt--;
port_unlock_from_isr();
}
@ -226,7 +226,7 @@ void _dbg_check_leave_isr(void) {
*/
void chDbgCheckClassI(void) {
if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt <= 0))
if ((ch.dbg.isr_cnt < 0) || (ch.dbg.lock_cnt <= 0))
chSysHalt("SV#10");
}
@ -240,7 +240,7 @@ void chDbgCheckClassI(void) {
*/
void chDbgCheckClassS(void) {
if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0))
if ((ch.dbg.isr_cnt != 0) || (ch.dbg.lock_cnt <= 0))
chSysHalt("SV#11");
}
@ -251,10 +251,10 @@ void chDbgCheckClassS(void) {
* @brief Trace circular buffer subsystem initialization.
* @note Internal use only.
*/
void _trace_init(void) {
void _dbg_trace_init(void) {
ch.dbg_trace_buffer.tb_size = CH_DBG_TRACE_BUFFER_SIZE;
ch.dbg_trace_buffer.tb_ptr = &ch.dbg_trace_buffer.tb_buffer[0];
ch.dbg.trace_buffer.tb_size = CH_DBG_TRACE_BUFFER_SIZE;
ch.dbg.trace_buffer.tb_ptr = &ch.dbg.trace_buffer.tb_buffer[0];
}
/**
@ -266,13 +266,13 @@ void _trace_init(void) {
*/
void _dbg_trace(thread_t *otp) {
ch.dbg_trace_buffer.tb_ptr->se_time = chVTGetSystemTimeX();
ch.dbg_trace_buffer.tb_ptr->se_tp = currp;
ch.dbg_trace_buffer.tb_ptr->se_wtobjp = otp->p_u.wtobjp;
ch.dbg_trace_buffer.tb_ptr->se_state = (uint8_t)otp->p_state;
if (++ch.dbg_trace_buffer.tb_ptr >=
&ch.dbg_trace_buffer.tb_buffer[CH_DBG_TRACE_BUFFER_SIZE])
ch.dbg_trace_buffer.tb_ptr = &ch.dbg_trace_buffer.tb_buffer[0];
ch.dbg.trace_buffer.tb_ptr->se_time = chVTGetSystemTimeX();
ch.dbg.trace_buffer.tb_ptr->se_tp = currp;
ch.dbg.trace_buffer.tb_ptr->se_wtobjp = otp->p_u.wtobjp;
ch.dbg.trace_buffer.tb_ptr->se_state = (uint8_t)otp->p_state;
if (++ch.dbg.trace_buffer.tb_ptr >=
&ch.dbg.trace_buffer.tb_buffer[CH_DBG_TRACE_BUFFER_SIZE])
ch.dbg.trace_buffer.tb_ptr = &ch.dbg.trace_buffer.tb_buffer[0];
}
#endif /* CH_DBG_ENABLE_TRACE */

View File

@ -119,7 +119,7 @@ void chSysInit(void) {
_stats_init();
#endif
#if CH_DBG_ENABLE_TRACE
_trace_init();
_dbg_trace_init();
#endif
#if !CH_CFG_NO_IDLE_THREAD
@ -165,16 +165,13 @@ void chSysHalt(const char *reason) {
port_disable();
#if CH_DBG_ENABLED
ch.dbg_panic_msg = reason;
#else
(void)reason;
#endif
#if defined(CH_CFG_SYSTEM_HALT_HOOK) || defined(__DOXYGEN__)
CH_CFG_SYSTEM_HALT_HOOK(reason);
#endif
/* Pointing to the passed message.*/
ch.dbg.panic_msg = reason;
/* Harmless infinite loop.*/
while (true)
;

View File

@ -79,11 +79,11 @@ void _tm_init(void) {
/* Time Measurement subsystem calibration, it does a null measurement
and calculates the call overhead which is subtracted to real
measurements.*/
ch.measurement_offset = 0;
ch.tm.offset = 0;
chTMObjectInit(&tm);
chTMStartMeasurementX(&tm);
chTMStopMeasurementX(&tm);
ch.measurement_offset = tm.last;
ch.tm.offset = tm.last;
}
/**
@ -125,7 +125,7 @@ NOINLINE void chTMStartMeasurementX(time_measurement_t *tmp) {
*/
NOINLINE void chTMStopMeasurementX(time_measurement_t *tmp) {
tm_stop(tmp, chSysGetRealtimeCounterX(), ch.measurement_offset);
tm_stop(tmp, chSysGetRealtimeCounterX(), ch.tm.offset);
}
/**