From b529e1b88e7e187c14268d4facc6542d3b499f6b Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Tue, 5 Apr 2016 07:36:15 +0000 Subject: Separate trace module, simplified tracer configuration. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9239 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/include/ch.h | 1 + os/rt/include/chdebug.h | 201 +------------------------------------ os/rt/include/chtrace.h | 257 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 259 insertions(+), 200 deletions(-) create mode 100644 os/rt/include/chtrace.h (limited to 'os/rt/include') diff --git a/os/rt/include/ch.h b/os/rt/include/ch.h index e8407592a..a19f812b5 100644 --- a/os/rt/include/ch.h +++ b/os/rt/include/ch.h @@ -79,6 +79,7 @@ #include "chalign.h" #include "chcore.h" #include "chdebug.h" +#include "chtrace.h" #include "chtm.h" #include "chstats.h" #include "chschd.h" diff --git a/os/rt/include/chdebug.h b/os/rt/include/chdebug.h index c1e10b939..75d65be50 100644 --- a/os/rt/include/chdebug.h +++ b/os/rt/include/chdebug.h @@ -19,7 +19,7 @@ /** * @file chdebug.h - * @brief Debug macros and structures. + * @brief Debug support macros and structures. * * @addtogroup debug * @{ @@ -32,51 +32,6 @@ /* Module constants. */ /*===========================================================================*/ -/** - * @name Trace record types - * @{ - */ -#define CH_TRACE_TYPE_UNUSED 0U -#define CH_TRACE_TYPE_SWITCH 1U -#define CH_TRACE_TYPE_ISR_ENTER 2U -#define CH_TRACE_TYPE_ISR_LEAVE 3U -#define CH_TRACE_TYPE_HALT 4U -#define CH_TRACE_TYPE_USER 5U -/** @} */ - -/** - * @name Trace suspend masks - * @{ - */ -#define CH_TRACE_SUSPEND_NONE 0U -#define CH_TRACE_SUSPEND_SWITCH 1U -#define CH_TRACE_SUSPEND_ISR_ENTER 2U -#define CH_TRACE_SUSPEND_ISR_LEAVE 4U -#define CH_TRACE_SUSPEND_HALT 8U -#define CH_TRACE_SUSPEND_USER 16U -#define CH_TRACE_SUSPEND_ALL (CH_TRACE_SUSPEND_SWITCH | \ - CH_TRACE_SUSPEND_ISR_ENTER | \ - CH_TRACE_SUSPEND_ISR_LEAVE | \ - CH_TRACE_SUSPEND_HALT | \ - CH_TRACE_SUSPEND_USER) - -/** @} */ - -/** - * @name Events to trace - * @{ - */ -#define CH_DBG_TRACE_MASK_NONE 0U -#define CH_DBG_TRACE_MASK_SWITCH 1U -#define CH_DBG_TRACE_MASK_ISR 2U -#define CH_DBG_TRACE_MASK_HALT 8U -#define CH_DBG_TRACE_MASK_USER 16U -#define CH_DBG_TRACE_MASK_ALL (CH_DBG_TRACE_MASK_SWITCH | \ - CH_DBG_TRACE_MASK_ISR | \ - CH_DBG_TRACE_MASK_HALT | \ - CH_DBG_TRACE_MASK_USER) -/** @} */ - /*===========================================================================*/ /* Module pre-compile time settings. */ /*===========================================================================*/ @@ -85,22 +40,6 @@ * @name Debug related settings * @{ */ -/** - * @brief Trace buffer entries. - */ -#if !defined(CH_DBG_TRACE_MASK) || defined(__DOXYGEN__) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_NONE. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) || defined(__DOXYGEN__) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - /** * @brief Fill value for thread stack area in debug mode. */ @@ -113,110 +52,10 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if !defined(CH_CFG_TRACE_HOOK) -#error "CH_CFG_TRACE_HOOK not defined in chconf.h" -#endif - /*===========================================================================*/ /* Module data structures and types. */ /*===========================================================================*/ -#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE) || defined(__DOXYGEN__) -/*lint -save -e46 [6.1] An uint32_t is required.*/ -/** - * @brief Trace buffer record. - */ -typedef struct { - /** - * @brief Record type. - */ - uint32_t type:3; - /** - * @brief Switched out thread state. - */ - uint32_t state:5; - /** - * @brief Accurate time stamp. - * @note This field only available if the post supports - * @p PORT_SUPPORTS_RT else it is set to zero. - */ - uint32_t rtstamp:24; - /** - * @brief System time stamp of the switch event. - */ - systime_t time; - union { - /** - * @brief Structure representing a context switch. - */ - struct { - /** - * @brief Switched in thread. - */ - thread_t *ntp; - /** - * @brief Object where going to sleep. - */ - void *wtobjp; - } sw; - /** - * @brief Structure representing an ISR enter. - */ - struct { - /** - * @brief ISR function name taken using @p __func__. - */ - const char *name; - } isr; - /** - * @brief Structure representing an halt. - */ - struct { - /** - * @brief Halt error string. - */ - const char *reason; - } halt; - /** - * @brief User trace structure. - */ - struct { - /** - * @brief Trace user parameter 1. - */ - void *up1; - /** - * @brief Trace user parameter 2. - */ - void *up2; - } user; - } u; -} ch_trace_event_t; -/*lint -restore*/ - -/** - * @brief Trace buffer header. - */ -typedef struct { - /** - * @brief Suspended trace sources mask. - */ - uint16_t suspended; - /** - * @brief Trace buffer size (entries). - */ - uint16_t size; - /** - * @brief Pointer to the buffer front. - */ - ch_trace_event_t *ptr; - /** - * @brief Ring buffer. - */ - ch_trace_event_t buffer[CH_DBG_TRACE_BUFFER_SIZE]; -} ch_trace_buffer_t; -#endif /* CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE */ - /*===========================================================================*/ /* Module macros. */ /*===========================================================================*/ @@ -244,23 +83,6 @@ typedef struct { #define chDbgCheckClassS() #endif -/* When a trace feature is disabled the associated functions are replaced by - an empty macro.*/ -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) == 0U -#define _dbg_trace_switch(otp) -#endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) == 0U -#define _dbg_trace_isr_enter(isr) -#define _dbg_trace_isr_leave(isr) -#endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) == 0U -#define _dbg_trace_halt(reason) -#endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) == 0U -#define chDbgWriteTraceI(up1, up2) -#define chDbgWriteTrace(up1, up2) -#endif - /** * @name Macro Functions * @{ @@ -334,27 +156,6 @@ extern "C" { void chDbgCheckClassI(void); void chDbgCheckClassS(void); #endif -#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE) || defined(__DOXYGEN__) - void _dbg_trace_init(void); -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) != 0U - void _dbg_trace_switch(thread_t *otp); -#endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) != 0U - void _dbg_trace_isr_enter(const char *isr); - void _dbg_trace_isr_leave(const char *isr); -#endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) != 0U - void _dbg_trace_halt(const char *reason); -#endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) != 0U - void chDbgWriteTraceI(void *up1, void *up2); - void chDbgWriteTrace(void *up1, void *up2); - void chDbgSuspendTraceI(uint16_t mask); - void chDbgSuspendTrace(uint16_t mask); - void chDbgResumeTraceI(uint16_t mask); - void chDbgResumeTrace(uint16_t mask); -#endif -#endif /* CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE */ #ifdef __cplusplus } #endif diff --git a/os/rt/include/chtrace.h b/os/rt/include/chtrace.h new file mode 100644 index 000000000..2b1afcb4c --- /dev/null +++ b/os/rt/include/chtrace.h @@ -0,0 +1,257 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS 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 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 chtrace.h + * @brief Tracer macros and structures. + * + * @addtogroup trace + * @{ + */ + +#ifndef CHTRACE_H +#define CHTRACE_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/** + * @name Trace record types + * @{ + */ +#define CH_TRACE_TYPE_UNUSED 0U +#define CH_TRACE_TYPE_SWITCH 1U +#define CH_TRACE_TYPE_ISR_ENTER 2U +#define CH_TRACE_TYPE_ISR_LEAVE 3U +#define CH_TRACE_TYPE_HALT 4U +#define CH_TRACE_TYPE_USER 5U +/** @} */ + +/** + * @name Events to trace + * @{ + */ +#define CH_DBG_TRACE_MASK_DISABLED -1 +#define CH_DBG_TRACE_MASK_NONE 0U +#define CH_DBG_TRACE_MASK_SWITCH 1U +#define CH_DBG_TRACE_MASK_ISR 2U +#define CH_DBG_TRACE_MASK_HALT 4U +#define CH_DBG_TRACE_MASK_USER 8U +#define CH_DBG_TRACE_MASK_ALL (CH_DBG_TRACE_MASK_SWITCH | \ + CH_DBG_TRACE_MASK_ISR | \ + CH_DBG_TRACE_MASK_HALT | \ + CH_DBG_TRACE_MASK_USER) +/** @} */ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name Debug related settings + * @{ + */ +/** + * @brief Trace buffer entries. + */ +#if !defined(CH_DBG_TRACE_MASK) || defined(__DOXYGEN__) +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED +#endif + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_NONE. + */ +#if !defined(CH_DBG_TRACE_BUFFER_SIZE) || defined(__DOXYGEN__) +#define CH_DBG_TRACE_BUFFER_SIZE 128 +#endif +/** @} */ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if !defined(CH_CFG_TRACE_HOOK) +#error "CH_CFG_TRACE_HOOK not defined in chconf.h" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE) || defined(__DOXYGEN__) +/*lint -save -e46 [6.1] An uint32_t is required.*/ +/** + * @brief Trace buffer record. + */ +typedef struct { + /** + * @brief Record type. + */ + uint32_t type:3; + /** + * @brief Switched out thread state. + */ + uint32_t state:5; + /** + * @brief Accurate time stamp. + * @note This field only available if the post supports + * @p PORT_SUPPORTS_RT else it is set to zero. + */ + uint32_t rtstamp:24; + /** + * @brief System time stamp of the switch event. + */ + systime_t time; + union { + /** + * @brief Structure representing a context switch. + */ + struct { + /** + * @brief Switched in thread. + */ + thread_t *ntp; + /** + * @brief Object where going to sleep. + */ + void *wtobjp; + } sw; + /** + * @brief Structure representing an ISR enter. + */ + struct { + /** + * @brief ISR function name taken using @p __func__. + */ + const char *name; + } isr; + /** + * @brief Structure representing an halt. + */ + struct { + /** + * @brief Halt error string. + */ + const char *reason; + } halt; + /** + * @brief User trace structure. + */ + struct { + /** + * @brief Trace user parameter 1. + */ + void *up1; + /** + * @brief Trace user parameter 2. + */ + void *up2; + } user; + } u; +} ch_trace_event_t; +/*lint -restore*/ + +/** + * @brief Trace buffer header. + */ +typedef struct { + /** + * @brief Suspended trace sources mask. + */ + uint16_t suspended; + /** + * @brief Trace buffer size (entries). + */ + uint16_t size; + /** + * @brief Pointer to the buffer front. + */ + ch_trace_event_t *ptr; + /** + * @brief Ring buffer. + */ + ch_trace_event_t buffer[CH_DBG_TRACE_BUFFER_SIZE]; +} ch_trace_buffer_t; +#endif /* CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE */ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/* When a trace feature is disabled the associated functions are replaced by + an empty macro. Note that the macros can be externally redefined in + order to interface 3rd parties tracing tools.*/ +#if CH_DBG_TRACE_MASK == CH_DBG_TRACE_MASK_DISABLED +#if !defined(_dbg_trace_init) +#define _dbg_trace_init() +#endif +#if !defined(_dbg_trace_switch) +#define _dbg_trace_switch(otp) +#endif +#if !defined(_dbg_trace_isr_enter) +#define _dbg_trace_isr_enter(isr) +#endif +#if !defined(_dbg_trace_isr_leave) +#define _dbg_trace_isr_leave(isr) +#endif +#if !defined(_dbg_trace_halt) +#define _dbg_trace_halt(reason) +#endif +#if !defined(chDbgWriteTraceI) +#define chDbgWriteTraceI(up1, up2) +#endif +#if !defined(chDbgWriteTrace) +#define chDbgWriteTrace(up1, up2) +#endif +#endif /* CH_DBG_TRACE_MASK == CH_DBG_TRACE_MASK_DISABLED */ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif +#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_DISABLED) || defined(__DOXYGEN__) + void _dbg_trace_init(void); + void _dbg_trace_switch(thread_t *otp); + void _dbg_trace_isr_enter(const char *isr); + void _dbg_trace_isr_leave(const char *isr); + void _dbg_trace_halt(const char *reason); + void chDbgWriteTraceI(void *up1, void *up2); + void chDbgWriteTrace(void *up1, void *up2); + void chDbgSuspendTraceI(uint16_t mask); + void chDbgSuspendTrace(uint16_t mask); + void chDbgResumeTraceI(uint16_t mask); + void chDbgResumeTrace(uint16_t mask); +#endif /* CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_DISABLED */ +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* CHTRACE_H */ + +/** @} */ -- cgit v1.2.3