From 1ae1099ef072fd5fa5d1fde1e73c8c1df8d8d2f4 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 29 Jul 2013 13:36:19 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6038 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM4-STM32F303-DISCOVERY/chconf.h | 9 +- os/kernel/include/ch.h | 2 +- os/kernel/include/chstats.h | 105 ++++++++++++++++++++++ os/kernel/include/{chrt.h => chtm.h} | 16 ++-- os/kernel/kernel.mk | 2 +- os/kernel/src/chstats.c | 65 ++++++++++++++ os/kernel/src/{chrt.c => chtm.c} | 41 ++++----- 7 files changed, 200 insertions(+), 40 deletions(-) create mode 100644 os/kernel/include/chstats.h rename os/kernel/include/{chrt.h => chtm.h} (93%) create mode 100644 os/kernel/src/chstats.c rename os/kernel/src/{chrt.c => chtm.c} (79%) diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h index 928186af8..727f9de89 100644 --- a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h +++ b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h @@ -128,13 +128,14 @@ /*===========================================================================*/ /** - * @brief Realtime counter APIs. - * @details If enabled then the RT APIs are included in the kernel. + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. * * @note The default is @p TRUE. */ -#if !defined(CH_CFG_USE_RT) || defined(__DOXYGEN__) -#define CH_CFG_USE_RT TRUE +#if !defined(CH_CFG_USE_TM) || defined(__DOXYGEN__) +#define CH_CFG_USE_TM TRUE #endif /** diff --git a/os/kernel/include/ch.h b/os/kernel/include/ch.h index efade76bf..e30ddd515 100644 --- a/os/kernel/include/ch.h +++ b/os/kernel/include/ch.h @@ -108,7 +108,7 @@ typedef struct thread thread_t; #include "chconf.h" #include "chtypes.h" #include "chdebug.h" -#include "chrt.h" +#include "chtm.h" #include "chstats.h" #include "chcore.h" #include "chsys.h" diff --git a/os/kernel/include/chstats.h b/os/kernel/include/chstats.h new file mode 100644 index 000000000..a94a84814 --- /dev/null +++ b/os/kernel/include/chstats.h @@ -0,0 +1,105 @@ +/* + 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 chstats.h + * @brief Statistics module macros and structures. + * + * @addtogroup statistics + * @{ + */ + +#ifndef _CHSTATS_H_ +#define _CHSTATS_H_ + +#if CH_DBG_STATISTICS || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of a kernel statistics structure. + */ +typedef struct { + ucnt_t nirq; /**< @brief IRQ number. + @note Fast Interrupts are not + accounted for. */ + ucnt_t nctxswc; /**< @brief Context switch number. */ + time_measurement_t critical; /**< @brief Critical zones measurement. */ + time_measurement_t isr; /**< @brief ISR measurement. */ +} kernel_stats_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/** + * @brief Increases the IRQ counter. + */ +#define _stats_increase_irq() kernel_stats.nirq++ + +/** + * @brief Increases the context switch counter. + */ +#define _stats_increase_ctxswc() kernel_stats.nctxswc++ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#if !defined(__DOXYGEN__) +extern kernel_stats_t kernel_stats; +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#else /* !CH_DBG_STATISTICS */ + +/* Stub functions for when the statistics module is disabled. */ +#define _stats_increase_irq() +#define _stats_increase_ctxswc() + +#endif /* !CH_DBG_STATISTICS */ + +#endif /* _CHSTATS_H_ */ + +/** @} */ diff --git a/os/kernel/include/chrt.h b/os/kernel/include/chtm.h similarity index 93% rename from os/kernel/include/chrt.h rename to os/kernel/include/chtm.h index caf27747e..a7500a26b 100644 --- a/os/kernel/include/chrt.h +++ b/os/kernel/include/chtm.h @@ -19,17 +19,17 @@ */ /** - * @file chrt.h - * @brief Real Time Counter and Measurement module macros and structures. + * @file chtm.h + * @brief Time Measurement module macros and structures. * - * @addtogroup realtime_counter + * @addtogroup time_measurement * @{ */ -#ifndef _CHRT_H_ -#define _CHRT_H_ +#ifndef _CHTM_H_ +#define _CHTM_H_ -#if CH_CFG_USE_RT || defined(__DOXYGEN__) +#if CH_CFG_USE_TM || defined(__DOXYGEN__) #define port_rt_get_counter_value() 0 @@ -164,8 +164,8 @@ extern "C" { /* Module inline functions. */ /*===========================================================================*/ -#endif /* CH_CFG_USE_RT */ +#endif /* CH_CFG_USE_TM */ -#endif /* _CHRT_H_ */ +#endif /* _CHTM_H_ */ /** @} */ diff --git a/os/kernel/kernel.mk b/os/kernel/kernel.mk index 6b2dafd55..b82339f5e 100644 --- a/os/kernel/kernel.mk +++ b/os/kernel/kernel.mk @@ -4,7 +4,7 @@ KERNSRC = ${CHIBIOS}/os/kernel/src/chsys.c \ ${CHIBIOS}/os/kernel/src/chdebug.c \ ${CHIBIOS}/os/kernel/src/chlists.c \ ${CHIBIOS}/os/kernel/src/chvt.c \ - ${CHIBIOS}/os/kernel/src/chrt.c \ + ${CHIBIOS}/os/kernel/src/chtm.c \ ${CHIBIOS}/os/kernel/src/chstats.c \ ${CHIBIOS}/os/kernel/src/chschd.c \ ${CHIBIOS}/os/kernel/src/chthreads.c \ diff --git a/os/kernel/src/chstats.c b/os/kernel/src/chstats.c new file mode 100644 index 000000000..1decf8f16 --- /dev/null +++ b/os/kernel/src/chstats.c @@ -0,0 +1,65 @@ +/* + 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 chstats.c + * @brief Real Time Counter and Measurement module code. + * + * @addtogroup realtime_counter + * @details Statistics services. + * @{ + */ + +#include "ch.h" + +#if CH_DBG_STATISTICS || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/** + * @brief Global kernel statistics. + */ +kernel_stats_t kernel_stats; + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +#endif /* CH_DBG_STATISTICS */ + +/** @} */ diff --git a/os/kernel/src/chrt.c b/os/kernel/src/chtm.c similarity index 79% rename from os/kernel/src/chrt.c rename to os/kernel/src/chtm.c index 0a477de39..a42223da3 100644 --- a/os/kernel/src/chrt.c +++ b/os/kernel/src/chtm.c @@ -19,28 +19,17 @@ */ /** - * @file chvt.c - * @brief Real Time Counter and Measurement module code. + * @file chtm.c + * @brief Time Measurement module code. * - * @addtogroup realtime_counter - * @details Realtime Counter APIs and services. - * - *

Operation mode

- * The realtime counter is a fast HW counter that counts upward at - * regular intervals. This counted can be used for small and accurate - * delays, time stamp and time measurement. - * - *

Notes

- * On those architectures where such a counter is not implemented - * the system time counter is used instead. Of course the system - * time counter usually has a much lower resolution than a real - * HW counter. + * @addtogroup time_measurement + * @details Time Measurement APIs and services. * @{ */ #include "ch.h" -#if CH_CFG_USE_RT || defined(__DOXYGEN__) +#if CH_CFG_USE_TM || defined(__DOXYGEN__) /*===========================================================================*/ /* Module local definitions. */ @@ -102,10 +91,10 @@ void _rt_init(void) { * Example of a guarded loop using the realtime counter. The loop implements * a timeout after one second. * @code - * rtcnt_t start = chRTGetCounterValue(); + * rtcnt_t start = chSysGetRealtimeCounterX(); * rtcnt_t timeout = start + S2RTC(RTCCLK, 1); * while (my_condition) { - * if (!chRTIsCounterWithin(start, timeout) + * if (!chTMIsCounterWithin(start, timeout) * return TIMEOUT; * // Do something. * } @@ -115,9 +104,9 @@ void _rt_init(void) { * @par Example 2 * Example of a loop that lasts exactly 50 microseconds. * @code - * rtcnt_t start = chRTGetCounterValue(); + * rtcnt_t start = chSysGetRealtimeCounterX(); * rtcnt_t timeout = start + US2RTC(RTCCLK, 50); - * while (chRTIsCounterWithin(start, timeout)) { + * while (chTMIsCounterWithin(start, timeout)) { * // Do something. * } * // Continue. @@ -130,7 +119,7 @@ void _rt_init(void) { * * @special */ -bool chRTIsCounterWithin(rtcnt_t start, rtcnt_t end) { +bool chTMIsCounterWithin(rtcnt_t start, rtcnt_t end) { rtcnt_t now = chSysGetRealtimeCounterX(); return end > start ? (now >= start) && (now < end) : @@ -147,7 +136,7 @@ bool chRTIsCounterWithin(rtcnt_t start, rtcnt_t end) { * * @special */ -void chRTPolledDelay(rtcnt_t cycles) { +void chTMPolledDelay(rtcnt_t cycles) { rtcnt_t start = chSysGetRealtimeCounterX(); rtcnt_t end = start + cycles; while (chRTIsCounterWithin(start, end)) @@ -161,7 +150,7 @@ void chRTPolledDelay(rtcnt_t cycles) { * * @init */ -void chRTTimeMeasurementObjectInit(time_measurement_t *tmp) { +void chTMObjectInit(time_measurement_t *tmp) { tmp->best = (rtcnt_t)-1; tmp->worst = (rtcnt_t)0; @@ -178,7 +167,7 @@ void chRTTimeMeasurementObjectInit(time_measurement_t *tmp) { * * @special */ -NOINLINE void chRTTimeMeasurementStartX(time_measurement_t *tmp) { +NOINLINE void chTMStartX(time_measurement_t *tmp) { tmp->last = chSysGetRealtimeCounterX(); } @@ -192,7 +181,7 @@ NOINLINE void chRTTimeMeasurementStartX(time_measurement_t *tmp) { * * @special */ -NOINLINE void chRTTimeMeasurementStopX(time_measurement_t *tmp) { +NOINLINE void chTMStopX(time_measurement_t *tmp) { rtcnt_t now = chSysGetRealtimeCounterX(); tmp->last = now - tmp->last - measurement_offset; @@ -203,6 +192,6 @@ NOINLINE void chRTTimeMeasurementStopX(time_measurement_t *tmp) { tmp->best = tmp->last; } -#endif /* CH_CFG_USE_RT */ +#endif /* CH_CFG_USE_TM */ /** @} */