From b529e1b88e7e187c14268d4facc6542d3b499f6b Mon Sep 17 00:00:00 2001
From: Giovanni Di Sirio <gdisirio@gmail.com>
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 ++++++++++++++++++++++++++++++++++++++++++++++
 os/rt/rt.mk              |   1 +
 os/rt/src/chdebug.c      | 221 +--------------------------------------
 os/rt/src/chtrace.c      | 262 +++++++++++++++++++++++++++++++++++++++++++++++
 os/rt/templates/chconf.h |   7 +-
 7 files changed, 526 insertions(+), 424 deletions(-)
 create mode 100644 os/rt/include/chtrace.h
 create mode 100644 os/rt/src/chtrace.c

(limited to 'os')

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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @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 */
+
+/** @} */
diff --git a/os/rt/rt.mk b/os/rt/rt.mk
index 5d01736c2..f1a8afe07 100644
--- a/os/rt/rt.mk
+++ b/os/rt/rt.mk
@@ -5,6 +5,7 @@ CHCONF := $(strip $(shell cat chconf.h | egrep -e "\#define"))
 
 KERNSRC := $(CHIBIOS)/os/rt/src/chsys.c \
            $(CHIBIOS)/os/rt/src/chdebug.c \
+           $(CHIBIOS)/os/rt/src/chtrace.c \
            $(CHIBIOS)/os/rt/src/chvt.c \
            $(CHIBIOS)/os/rt/src/chschd.c \
            $(CHIBIOS)/os/rt/src/chthreads.c
diff --git a/os/rt/src/chdebug.c b/os/rt/src/chdebug.c
index fd6b3c92b..6f83beed6 100644
--- a/os/rt/src/chdebug.c
+++ b/os/rt/src/chdebug.c
@@ -19,7 +19,7 @@
 
 /**
  * @file    chdebug.c
- * @brief   ChibiOS/RT Debug code.
+ * @brief   Debug support code.
  *
  * @addtogroup debug
  * @details Debug APIs and services:
@@ -101,31 +101,6 @@
 /* Module local functions.                                                   */
 /*===========================================================================*/
 
-#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE) || defined(__DOXYGEN__)
-/**
- * @brief   Writes a time stamp and increases the trace buffer pointer.
- *
- * @notapi
- */
-static NOINLINE void trace_next(void) {
-
-  ch.dbg.trace_buffer.ptr->time    = chVTGetSystemTimeX();
-#if PORT_SUPPORTS_RT == TRUE
-  ch.dbg.trace_buffer.ptr->rtstamp = chSysGetRealtimeCounterX();
-#else
-  ch.dbg.trace_buffer.ptr->rtstamp = (rtcnt_t)0;
-#endif
-
-  /* Trace hook, useful in order to interface debug tools.*/
-  CH_CFG_TRACE_HOOK(ch.dbg.trace_buffer.ptr);
-
-  if (++ch.dbg.trace_buffer.ptr >=
-      &ch.dbg.trace_buffer.buffer[CH_DBG_TRACE_BUFFER_SIZE]) {
-    ch.dbg.trace_buffer.ptr = &ch.dbg.trace_buffer.buffer[0];
-  }
-}
-#endif
-
 /*===========================================================================*/
 /* Module exported functions.                                                */
 /*===========================================================================*/
@@ -281,198 +256,4 @@ void chDbgCheckClassS(void) {
 
 #endif /* CH_DBG_SYSTEM_STATE_CHECK == TRUE */
 
-#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE) || defined(__DOXYGEN__)
-/**
- * @brief   Trace circular buffer subsystem initialization.
- * @note    Internal use only.
- */
-void _dbg_trace_init(void) {
-  unsigned i;
-
-  ch.dbg.trace_buffer.suspended = 0U;
-  ch.dbg.trace_buffer.size      = CH_DBG_TRACE_BUFFER_SIZE;
-  ch.dbg.trace_buffer.ptr       = &ch.dbg.trace_buffer.buffer[0];
-  for (i = 0U; i < (unsigned)CH_DBG_TRACE_BUFFER_SIZE; i++) {
-    ch.dbg.trace_buffer.buffer[i].type = CH_TRACE_TYPE_UNUSED;
-  }
-}
-
-#if ((CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) != 0U) ||               \
-    defined(__DOXYGEN__)
-/**
- * @brief   Inserts in the circular debug trace buffer a context switch record.
- *
- * @param[in] otp       the thread being switched out
- *
- * @notapi
- */
-void _dbg_trace_switch(thread_t *otp) {
-
-  if ((ch.dbg.trace_buffer.suspended & CH_TRACE_SUSPEND_SWITCH) == 0U) {
-    ch.dbg.trace_buffer.ptr->type        = CH_TRACE_TYPE_SWITCH;
-    ch.dbg.trace_buffer.ptr->state       = (uint8_t)otp->state;
-    ch.dbg.trace_buffer.ptr->u.sw.ntp    = currp;
-    ch.dbg.trace_buffer.ptr->u.sw.wtobjp = otp->u.wtobjp;
-    trace_next();
-  }
-}
-#endif /* (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) != 0U */
-
-#if ((CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) != 0U) ||                  \
-    defined(__DOXYGEN__)
-/**
- * @brief   Inserts in the circular debug trace buffer an ISR-enter record.
- *
- * @param[in] isr       name of the isr
- *
- * @notapi
- */
-void _dbg_trace_isr_enter(const char *isr) {
-
-  if ((ch.dbg.trace_buffer.suspended & CH_TRACE_SUSPEND_ISR_ENTER) == 0U) {
-    port_lock_from_isr();
-    ch.dbg.trace_buffer.ptr->type        = CH_TRACE_TYPE_ISR_ENTER;
-    ch.dbg.trace_buffer.ptr->state       = 0U;
-    ch.dbg.trace_buffer.ptr->u.isr.name  = isr;
-    trace_next();
-    port_unlock_from_isr();
-  }
-}
-
-/**
- * @brief   Inserts in the circular debug trace buffer an ISR-leave record.
- *
- * @param[in] isr       name of the isr
- *
- * @notapi
- */
-void _dbg_trace_isr_leave(const char *isr) {
-
-  if ((ch.dbg.trace_buffer.suspended & CH_TRACE_SUSPEND_ISR_LEAVE) == 0U) {
-    port_lock_from_isr();
-    ch.dbg.trace_buffer.ptr->type        = CH_TRACE_TYPE_ISR_LEAVE;
-    ch.dbg.trace_buffer.ptr->state       = 0U;
-    ch.dbg.trace_buffer.ptr->u.isr.name  = isr;
-    trace_next();
-    port_unlock_from_isr();
-  }
-}
-#endif /* (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) != 0U */
-
-#if ((CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) != 0U) ||                 \
-    defined(__DOXYGEN__)
-/**
- * @brief   Inserts in the circular debug trace buffer an halt record.
- *
- * @param[in] reason    the halt error string
- *
- * @notapi
- */
-void _dbg_trace_halt(const char *reason) {
-
-  if ((ch.dbg.trace_buffer.suspended & CH_TRACE_SUSPEND_HALT) == 0U) {
-    ch.dbg.trace_buffer.ptr->type          = CH_TRACE_TYPE_HALT;
-    ch.dbg.trace_buffer.ptr->state         = 0;
-    ch.dbg.trace_buffer.ptr->u.halt.reason = reason;
-    trace_next();
-  }
-}
-#endif /* (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) != 0U */
-
-#if ((CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) != 0U) ||                 \
-    defined(__DOXYGEN__)
-/**
- * @brief   Adds an user trace record to the trace buffer.
- *
- * @param[in] up1       user parameter 1
- * @param[in] up2       user parameter 2
- *
- * @iclass
- */
-void chDbgWriteTraceI(void *up1, void *up2) {
-
-  chDbgCheckClassI();
-
-  if ((ch.dbg.trace_buffer.suspended & CH_TRACE_SUSPEND_SWITCH) == 0U) {
-    ch.dbg.trace_buffer.ptr->type       = CH_TRACE_TYPE_USER;
-    ch.dbg.trace_buffer.ptr->state      = 0;
-    ch.dbg.trace_buffer.ptr->u.user.up1 = up1;
-    ch.dbg.trace_buffer.ptr->u.user.up2 = up2;
-    trace_next();
-  }
-}
-
-/**
- * @brief   Adds an user trace record to the trace buffer.
- *
- * @param[in] up1       user parameter 1
- * @param[in] up2       user parameter 2
- *
- * @api
- */
-void chDbgWriteTrace(void *up1, void *up2) {
-
-  chSysLock();
-  chDbgWriteTraceI(up1, up2);
-  chSysUnlock();
-}
-#endif /* (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) != 0U */
-
-/**
- * @brief   Suspends one or more trace events.
- *
- * @paramin mask        mask of the trace events to be suspended
- *
- * @iclass
- */
-void chDbgSuspendTraceI(uint16_t mask) {
-
-  chDbgCheckClassI();
-
-  ch.dbg.trace_buffer.suspended |= mask;
-}
-
-/**
- * @brief   Suspends one or more trace events.
- *
- * @paramin mask        mask of the trace events to be suspended
- *
- * @api
- */
-void chDbgSuspendTrace(uint16_t mask) {
-
-  chSysLock();
-  chDbgSuspendTraceI(mask);
-  chSysUnlock();
-}
-
-/**
- * @brief   Resumes one or more trace events.
- *
- * @paramin mask        mask of the trace events to be resumed
- *
- * @iclass
- */
-void chDbgResumeTraceI(uint16_t mask) {
-
-  chDbgCheckClassI();
-
-  ch.dbg.trace_buffer.suspended &= ~mask;
-}
-
-/**
- * @brief   Resumes one or more trace events.
- *
- * @paramin mask        mask of the trace events to be resumed
- *
- * @api
- */
-void chDbgResumeTrace(uint16_t mask) {
-
-  chSysLock();
-  chDbgResumeTraceI(mask);
-  chSysUnlock();
-}
-#endif /* CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE */
-
 /** @} */
diff --git a/os/rt/src/chtrace.c b/os/rt/src/chtrace.c
new file mode 100644
index 000000000..e6f13c6e7
--- /dev/null
+++ b/os/rt/src/chtrace.c
@@ -0,0 +1,262 @@
+/*
+    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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file    chtrace.c
+ * @brief   Tracer code.
+ *
+ * @addtogroup trace
+ * @details System events tracing service.
+ * @{
+ */
+
+#include "ch.h"
+
+/*===========================================================================*/
+/* Module local definitions.                                                 */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module exported variables.                                                */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local types.                                                       */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local variables.                                                   */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local functions.                                                   */
+/*===========================================================================*/
+
+#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_DISABLED) || defined(__DOXYGEN__)
+/**
+ * @brief   Writes a time stamp and increases the trace buffer pointer.
+ *
+ * @notapi
+ */
+static NOINLINE void trace_next(void) {
+
+  ch.dbg.trace_buffer.ptr->time    = chVTGetSystemTimeX();
+#if PORT_SUPPORTS_RT == TRUE
+  ch.dbg.trace_buffer.ptr->rtstamp = chSysGetRealtimeCounterX();
+#else
+  ch.dbg.trace_buffer.ptr->rtstamp = (rtcnt_t)0;
+#endif
+
+  /* Trace hook, useful in order to interface debug tools.*/
+  CH_CFG_TRACE_HOOK(ch.dbg.trace_buffer.ptr);
+
+  if (++ch.dbg.trace_buffer.ptr >=
+      &ch.dbg.trace_buffer.buffer[CH_DBG_TRACE_BUFFER_SIZE]) {
+    ch.dbg.trace_buffer.ptr = &ch.dbg.trace_buffer.buffer[0];
+  }
+}
+#endif
+
+/*===========================================================================*/
+/* Module exported functions.                                                */
+/*===========================================================================*/
+
+#if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_DISABLED) || defined(__DOXYGEN__)
+/**
+ * @brief   Trace circular buffer subsystem initialization.
+ * @note    Internal use only.
+ */
+void _dbg_trace_init(void) {
+  unsigned i;
+
+  ch.dbg.trace_buffer.suspended = CH_DBG_TRACE_MASK;
+  ch.dbg.trace_buffer.size      = CH_DBG_TRACE_BUFFER_SIZE;
+  ch.dbg.trace_buffer.ptr       = &ch.dbg.trace_buffer.buffer[0];
+  for (i = 0U; i < (unsigned)CH_DBG_TRACE_BUFFER_SIZE; i++) {
+    ch.dbg.trace_buffer.buffer[i].type = CH_TRACE_TYPE_UNUSED;
+  }
+}
+
+/**
+ * @brief   Inserts in the circular debug trace buffer a context switch record.
+ *
+ * @param[in] otp       the thread being switched out
+ *
+ * @notapi
+ */
+void _dbg_trace_switch(thread_t *otp) {
+
+  if ((ch.dbg.trace_buffer.suspended & CH_DBG_TRACE_MASK_SWITCH) == 0U) {
+    ch.dbg.trace_buffer.ptr->type        = CH_TRACE_TYPE_SWITCH;
+    ch.dbg.trace_buffer.ptr->state       = (uint8_t)otp->state;
+    ch.dbg.trace_buffer.ptr->u.sw.ntp    = currp;
+    ch.dbg.trace_buffer.ptr->u.sw.wtobjp = otp->u.wtobjp;
+    trace_next();
+  }
+}
+
+/**
+ * @brief   Inserts in the circular debug trace buffer an ISR-enter record.
+ *
+ * @param[in] isr       name of the isr
+ *
+ * @notapi
+ */
+void _dbg_trace_isr_enter(const char *isr) {
+
+  if ((ch.dbg.trace_buffer.suspended & CH_DBG_TRACE_MASK_ISR) == 0U) {
+    port_lock_from_isr();
+    ch.dbg.trace_buffer.ptr->type        = CH_TRACE_TYPE_ISR_ENTER;
+    ch.dbg.trace_buffer.ptr->state       = 0U;
+    ch.dbg.trace_buffer.ptr->u.isr.name  = isr;
+    trace_next();
+    port_unlock_from_isr();
+  }
+}
+
+/**
+ * @brief   Inserts in the circular debug trace buffer an ISR-leave record.
+ *
+ * @param[in] isr       name of the isr
+ *
+ * @notapi
+ */
+void _dbg_trace_isr_leave(const char *isr) {
+
+  if ((ch.dbg.trace_buffer.suspended & CH_DBG_TRACE_MASK_ISR) == 0U) {
+    port_lock_from_isr();
+    ch.dbg.trace_buffer.ptr->type        = CH_TRACE_TYPE_ISR_LEAVE;
+    ch.dbg.trace_buffer.ptr->state       = 0U;
+    ch.dbg.trace_buffer.ptr->u.isr.name  = isr;
+    trace_next();
+    port_unlock_from_isr();
+  }
+}
+
+/**
+ * @brief   Inserts in the circular debug trace buffer an halt record.
+ *
+ * @param[in] reason    the halt error string
+ *
+ * @notapi
+ */
+void _dbg_trace_halt(const char *reason) {
+
+  if ((ch.dbg.trace_buffer.suspended & CH_DBG_TRACE_MASK_HALT) == 0U) {
+    ch.dbg.trace_buffer.ptr->type          = CH_TRACE_TYPE_HALT;
+    ch.dbg.trace_buffer.ptr->state         = 0;
+    ch.dbg.trace_buffer.ptr->u.halt.reason = reason;
+    trace_next();
+  }
+}
+
+/**
+ * @brief   Adds an user trace record to the trace buffer.
+ *
+ * @param[in] up1       user parameter 1
+ * @param[in] up2       user parameter 2
+ *
+ * @iclass
+ */
+void chDbgWriteTraceI(void *up1, void *up2) {
+
+  chDbgCheckClassI();
+
+  if ((ch.dbg.trace_buffer.suspended & CH_DBG_TRACE_MASK_USER) == 0U) {
+    ch.dbg.trace_buffer.ptr->type       = CH_TRACE_TYPE_USER;
+    ch.dbg.trace_buffer.ptr->state      = 0;
+    ch.dbg.trace_buffer.ptr->u.user.up1 = up1;
+    ch.dbg.trace_buffer.ptr->u.user.up2 = up2;
+    trace_next();
+  }
+}
+
+/**
+ * @brief   Adds an user trace record to the trace buffer.
+ *
+ * @param[in] up1       user parameter 1
+ * @param[in] up2       user parameter 2
+ *
+ * @api
+ */
+void chDbgWriteTrace(void *up1, void *up2) {
+
+  chSysLock();
+  chDbgWriteTraceI(up1, up2);
+  chSysUnlock();
+}
+
+/**
+ * @brief   Suspends one or more trace events.
+ *
+ * @paramin mask        mask of the trace events to be suspended
+ *
+ * @iclass
+ */
+void chDbgSuspendTraceI(uint16_t mask) {
+
+  chDbgCheckClassI();
+
+  ch.dbg.trace_buffer.suspended |= mask;
+}
+
+/**
+ * @brief   Suspends one or more trace events.
+ *
+ * @paramin mask        mask of the trace events to be suspended
+ *
+ * @api
+ */
+void chDbgSuspendTrace(uint16_t mask) {
+
+  chSysLock();
+  chDbgSuspendTraceI(mask);
+  chSysUnlock();
+}
+
+/**
+ * @brief   Resumes one or more trace events.
+ *
+ * @paramin mask        mask of the trace events to be resumed
+ *
+ * @iclass
+ */
+void chDbgResumeTraceI(uint16_t mask) {
+
+  chDbgCheckClassI();
+
+  ch.dbg.trace_buffer.suspended &= ~mask;
+}
+
+/**
+ * @brief   Resumes one or more trace events.
+ *
+ * @paramin mask        mask of the trace events to be resumed
+ *
+ * @api
+ */
+void chDbgResumeTrace(uint16_t mask) {
+
+  chSysLock();
+  chDbgResumeTraceI(mask);
+  chSysUnlock();
+}
+#endif /* CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_DISABLED */
+
+/** @} */
diff --git a/os/rt/templates/chconf.h b/os/rt/templates/chconf.h
index a2f49b8bd..724dc0264 100644
--- a/os/rt/templates/chconf.h
+++ b/os/rt/templates/chconf.h
@@ -351,17 +351,16 @@
 
 /**
  * @brief   Debug option, trace buffer.
- * @details If enabled then the context switch circular trace buffer is
- *          activated.
+ * @details If enabled then the trace buffer is activated.
  *
- * @note    The default is @p CH_DBG_TRACE_MASK_NONE.
+ * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.
  */
 #define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_ALL
 
 /**
  * @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.
+ *          different from @p CH_DBG_TRACE_MASK_DISABLED.
  */
 #define CH_DBG_TRACE_BUFFER_SIZE            128
 
-- 
cgit v1.2.3