From a1435e018bfc9919cb76b1356509ecc883767fb4 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 10 Aug 2013 14:51:16 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6123 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/src/chdebug.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 os/rt/src/chdebug.c (limited to 'os/rt/src/chdebug.c') diff --git a/os/rt/src/chdebug.c b/os/rt/src/chdebug.c new file mode 100644 index 000000000..05b746357 --- /dev/null +++ b/os/rt/src/chdebug.c @@ -0,0 +1,260 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012,2013 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file chdebug.c + * @brief ChibiOS/RT Debug code. + * + * @addtogroup debug + * @details Debug APIs and services: + * - Runtime system state and call protocol check. The following + * panic messages can be generated: + * - SV#1, misplaced @p chSysDisable(). + * - SV#2, misplaced @p chSysSuspend() + * - SV#3, misplaced @p chSysEnable(). + * - SV#4, misplaced @p chSysLock(). + * - SV#5, misplaced @p chSysUnlock(). + * - SV#6, misplaced @p chSysLockFromIsr(). + * - SV#7, misplaced @p chSysUnlockFromIsr(). + * - SV#8, misplaced @p CH_IRQ_PROLOGUE(). + * - SV#9, misplaced @p CH_IRQ_EPILOGUE(). + * - SV#10, misplaced I-class function. + * - SV#11, misplaced S-class function. + * . + * - Trace buffer. + * - Parameters check. + * - Kernel assertions. + * - Kernel panics. + * . + * @note Stack checks are not implemented in this module but in the port + * layer in an architecture-dependent way. + * @{ + */ + +#include "ch.h" + +/*===========================================================================*/ +/* 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__) +/** + * @brief Guard code for @p chSysDisable(). + * + * @notapi + */ +void _dbg_check_disable(void) { + + if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#1"); +} + +/** + * @brief Guard code for @p chSysSuspend(). + * + * @notapi + */ +void _dbg_check_suspend(void) { + + if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#2"); +} + +/** + * @brief Guard code for @p chSysEnable(). + * + * @notapi + */ +void _dbg_check_enable(void) { + + if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#3"); +} + +/** + * @brief Guard code for @p chSysLock(). + * + * @notapi + */ +void _dbg_check_lock(void) { + + if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#4"); + _dbg_enter_lock(); +} + +/** + * @brief Guard code for @p chSysUnlock(). + * + * @notapi + */ +void _dbg_check_unlock(void) { + + if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0)) + chDbgPanic("SV#5"); + _dbg_leave_lock(); +} + +/** + * @brief Guard code for @p chSysLockFromIsr(). + * + * @notapi + */ +void _dbg_check_lock_from_isr(void) { + + if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#6"); + _dbg_enter_lock(); +} + +/** + * @brief Guard code for @p chSysUnlockFromIsr(). + * + * @notapi + */ +void _dbg_check_unlock_from_isr(void) { + + if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt <= 0)) + chDbgPanic("SV#7"); + _dbg_leave_lock(); +} + +/** + * @brief Guard code for @p CH_IRQ_PROLOGUE(). + * + * @notapi + */ +void _dbg_check_enter_isr(void) { + + port_lock_from_isr(); + if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#8"); + ch.dbg_isr_cnt++; + port_unlock_from_isr(); +} + +/** + * @brief Guard code for @p CH_IRQ_EPILOGUE(). + * + * @notapi + */ +void _dbg_check_leave_isr(void) { + + port_lock_from_isr(); + if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0)) + chDbgPanic("SV#9"); + ch.dbg_isr_cnt--; + port_unlock_from_isr(); +} + +/** + * @brief I-class functions context check. + * @details Verifies that the system is in an appropriate state for invoking + * an I-class API function. A panic is generated if the state is + * not compatible. + * + * @api + */ +void chDbgCheckClassI(void) { + + if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt <= 0)) + chDbgPanic("SV#10"); +} + +/** + * @brief S-class functions context check. + * @details Verifies that the system is in an appropriate state for invoking + * an S-class API function. A panic is generated if the state is + * not compatible. + * + * @api + */ +void chDbgCheckClassS(void) { + + if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0)) + chDbgPanic("SV#11"); +} + +#endif /* CH_DBG_SYSTEM_STATE_CHECK */ + +#if CH_DBG_ENABLE_TRACE || defined(__DOXYGEN__) +/** + * @brief Trace circular buffer subsystem initialization. + * @note Internal use only. + */ +void _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]; +} + +/** + * @brief Inserts in the circular debug trace buffer a context switch record. + * + * @param[in] otp the thread being switched out + * + * @notapi + */ +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]; +} +#endif /* CH_DBG_ENABLE_TRACE */ + +#if CH_DBG_ENABLED || defined(__DOXYGEN__) +/** + * @brief Prints a panic message on the console and then halts the system. + * + * @param[in] msg the pointer to the panic message string + */ +void chDbgPanic(const char *msg) { + + ch.dbg_panic_msg = msg; + chSysHalt(); +} +#endif /* CH_DBG_ENABLED */ + +/** @} */ -- cgit v1.2.3 From 155ef8ed75b12442fde1d80e4ca880d0e7f7c1f1 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 17 Aug 2013 11:52:50 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6169 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/src/chdebug.c | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) (limited to 'os/rt/src/chdebug.c') diff --git a/os/rt/src/chdebug.c b/os/rt/src/chdebug.c index 05b746357..696a293cd 100644 --- a/os/rt/src/chdebug.c +++ b/os/rt/src/chdebug.c @@ -83,7 +83,7 @@ void _dbg_check_disable(void) { if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#1"); + chSysHalt("SV#1"); } /** @@ -94,7 +94,7 @@ void _dbg_check_disable(void) { void _dbg_check_suspend(void) { if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#2"); + chSysHalt("SV#2"); } /** @@ -105,7 +105,7 @@ void _dbg_check_suspend(void) { void _dbg_check_enable(void) { if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#3"); + chSysHalt("SV#3"); } /** @@ -116,7 +116,7 @@ void _dbg_check_enable(void) { void _dbg_check_lock(void) { if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#4"); + chSysHalt("SV#4"); _dbg_enter_lock(); } @@ -128,7 +128,7 @@ void _dbg_check_lock(void) { void _dbg_check_unlock(void) { if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0)) - chDbgPanic("SV#5"); + chSysHalt("SV#5"); _dbg_leave_lock(); } @@ -140,7 +140,7 @@ void _dbg_check_unlock(void) { void _dbg_check_lock_from_isr(void) { if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#6"); + chSysHalt("SV#6"); _dbg_enter_lock(); } @@ -152,7 +152,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)) - chDbgPanic("SV#7"); + chSysHalt("SV#7"); _dbg_leave_lock(); } @@ -165,7 +165,7 @@ void _dbg_check_enter_isr(void) { port_lock_from_isr(); if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#8"); + chSysHalt("SV#8"); ch.dbg_isr_cnt++; port_unlock_from_isr(); } @@ -179,7 +179,7 @@ void _dbg_check_leave_isr(void) { port_lock_from_isr(); if ((ch.dbg_isr_cnt <= 0) || (ch.dbg_lock_cnt != 0)) - chDbgPanic("SV#9"); + chSysHalt("SV#9"); ch.dbg_isr_cnt--; port_unlock_from_isr(); } @@ -195,7 +195,7 @@ void _dbg_check_leave_isr(void) { void chDbgCheckClassI(void) { if ((ch.dbg_isr_cnt < 0) || (ch.dbg_lock_cnt <= 0)) - chDbgPanic("SV#10"); + chSysHalt("SV#10"); } /** @@ -209,7 +209,7 @@ void chDbgCheckClassI(void) { void chDbgCheckClassS(void) { if ((ch.dbg_isr_cnt != 0) || (ch.dbg_lock_cnt <= 0)) - chDbgPanic("SV#11"); + chSysHalt("SV#11"); } #endif /* CH_DBG_SYSTEM_STATE_CHECK */ @@ -244,17 +244,4 @@ void _dbg_trace(thread_t *otp) { } #endif /* CH_DBG_ENABLE_TRACE */ -#if CH_DBG_ENABLED || defined(__DOXYGEN__) -/** - * @brief Prints a panic message on the console and then halts the system. - * - * @param[in] msg the pointer to the panic message string - */ -void chDbgPanic(const char *msg) { - - ch.dbg_panic_msg = msg; - chSysHalt(); -} -#endif /* CH_DBG_ENABLED */ - /** @} */ -- cgit v1.2.3