git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6038 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2013-07-29 13:36:19 +00:00
parent 61f841306a
commit 1ae1099ef0
7 changed files with 200 additions and 40 deletions

View File

@ -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
/**

View File

@ -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"

105
os/kernel/include/chstats.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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_ */
/** @} */

View File

@ -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_ */
/** @} */

View File

@ -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 \

65
os/kernel/src/chstats.c Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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 */
/** @} */

View File

@ -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.
*
* <h2>Operation mode</h2>
* 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.
*
* <h2>Notes</h2>
* 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 */
/** @} */