ChibiOS/RT Architecture - Reference Manual - Guides |
00001 /* 00002 ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. 00003 00004 This file is part of ChibiOS/RT. 00005 00006 ChibiOS/RT is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 ChibiOS/RT is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 00019 --- 00020 00021 A special exception to the GPL can be applied should you wish to distribute 00022 a combined work that includes ChibiOS/RT, without being obliged to provide 00023 the source code for any proprietary components. See the file exception.txt 00024 for full details of how and when the exception can be applied. 00025 */ 00026 00027 /** 00028 * @file chdebug.c 00029 * @brief ChibiOS/RT Debug code. 00030 * 00031 * @addtogroup debug 00032 * @details Debug APIs and services: 00033 * - Trace buffer. 00034 * - Parameters check. 00035 * - Kernel assertions. 00036 * . 00037 * @{ 00038 */ 00039 00040 #include "ch.h" 00041 00042 #if CH_DBG_ENABLE_TRACE 00043 /** 00044 * @brief Public trace buffer. 00045 */ 00046 TraceBuffer trace_buffer; 00047 00048 /** 00049 * @brief Trace circular buffer subsystem initialization. 00050 */ 00051 void trace_init(void) { 00052 00053 trace_buffer.tb_size = TRACE_BUFFER_SIZE; 00054 trace_buffer.tb_ptr = &trace_buffer.tb_buffer[0]; 00055 } 00056 00057 /** 00058 * @brief Inserts in the circular debug trace buffer a context switch record. 00059 * 00060 * @param[in] otp the thread being switched out 00061 */ 00062 void chDbgTrace(Thread *otp) { 00063 00064 trace_buffer.tb_ptr->cse_wtobjp = otp->p_u.wtobjp; 00065 trace_buffer.tb_ptr->cse_time = chTimeNow(); 00066 trace_buffer.tb_ptr->cse_state = otp->p_state; 00067 trace_buffer.tb_ptr->cse_tid = (unsigned)currp >> 6; 00068 if (++trace_buffer.tb_ptr >= &trace_buffer.tb_buffer[TRACE_BUFFER_SIZE]) 00069 trace_buffer.tb_ptr = &trace_buffer.tb_buffer[0]; 00070 } 00071 #endif /* CH_DBG_ENABLE_TRACE */ 00072 00073 #if CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || CH_DBG_ENABLE_STACK_CHECK 00074 /** 00075 * @brief Pointer to the panic message. 00076 * @details This pointer is meant to be accessed through the debugger, it is 00077 * written once and then the system is halted. This variable can be 00078 * set to @p NULL if the halt is caused by a stack overflow. 00079 */ 00080 char *panic_msg; 00081 00082 /** 00083 * @brief Prints a panic message on the console and then halts the system. 00084 * 00085 * @param[in] msg the pointer to the panic message string 00086 */ 00087 void chDbgPanic(char *msg) { 00088 00089 panic_msg = msg; 00090 chSysHalt(); 00091 } 00092 #endif /* CH_DBG_ENABLE_ASSERTS || CH_DBG_ENABLE_CHECKS || CH_DBG_ENABLE_STACK_CHECK */ 00093 00094 /** @} */