git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6038 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
61f841306a
commit
1ae1099ef0
|
@ -128,13 +128,14 @@
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Realtime counter APIs.
|
* @brief Time Measurement APIs.
|
||||||
* @details If enabled then the RT APIs are included in the kernel.
|
* @details If enabled then the time measurement APIs are included in
|
||||||
|
* the kernel.
|
||||||
*
|
*
|
||||||
* @note The default is @p TRUE.
|
* @note The default is @p TRUE.
|
||||||
*/
|
*/
|
||||||
#if !defined(CH_CFG_USE_RT) || defined(__DOXYGEN__)
|
#if !defined(CH_CFG_USE_TM) || defined(__DOXYGEN__)
|
||||||
#define CH_CFG_USE_RT TRUE
|
#define CH_CFG_USE_TM TRUE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -108,7 +108,7 @@ typedef struct thread thread_t;
|
||||||
#include "chconf.h"
|
#include "chconf.h"
|
||||||
#include "chtypes.h"
|
#include "chtypes.h"
|
||||||
#include "chdebug.h"
|
#include "chdebug.h"
|
||||||
#include "chrt.h"
|
#include "chtm.h"
|
||||||
#include "chstats.h"
|
#include "chstats.h"
|
||||||
#include "chcore.h"
|
#include "chcore.h"
|
||||||
#include "chsys.h"
|
#include "chsys.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 <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_ */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -19,17 +19,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file chrt.h
|
* @file chtm.h
|
||||||
* @brief Real Time Counter and Measurement module macros and structures.
|
* @brief Time Measurement module macros and structures.
|
||||||
*
|
*
|
||||||
* @addtogroup realtime_counter
|
* @addtogroup time_measurement
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CHRT_H_
|
#ifndef _CHTM_H_
|
||||||
#define _CHRT_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
|
#define port_rt_get_counter_value() 0
|
||||||
|
|
||||||
|
@ -164,8 +164,8 @@ extern "C" {
|
||||||
/* Module inline functions. */
|
/* Module inline functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#endif /* CH_CFG_USE_RT */
|
#endif /* CH_CFG_USE_TM */
|
||||||
|
|
||||||
#endif /* _CHRT_H_ */
|
#endif /* _CHTM_H_ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
|
@ -4,7 +4,7 @@ KERNSRC = ${CHIBIOS}/os/kernel/src/chsys.c \
|
||||||
${CHIBIOS}/os/kernel/src/chdebug.c \
|
${CHIBIOS}/os/kernel/src/chdebug.c \
|
||||||
${CHIBIOS}/os/kernel/src/chlists.c \
|
${CHIBIOS}/os/kernel/src/chlists.c \
|
||||||
${CHIBIOS}/os/kernel/src/chvt.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/chstats.c \
|
||||||
${CHIBIOS}/os/kernel/src/chschd.c \
|
${CHIBIOS}/os/kernel/src/chschd.c \
|
||||||
${CHIBIOS}/os/kernel/src/chthreads.c \
|
${CHIBIOS}/os/kernel/src/chthreads.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 <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 */
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -19,28 +19,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file chvt.c
|
* @file chtm.c
|
||||||
* @brief Real Time Counter and Measurement module code.
|
* @brief Time Measurement module code.
|
||||||
*
|
*
|
||||||
* @addtogroup realtime_counter
|
* @addtogroup time_measurement
|
||||||
* @details Realtime Counter APIs and services.
|
* @details Time Measurement 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.
|
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ch.h"
|
#include "ch.h"
|
||||||
|
|
||||||
#if CH_CFG_USE_RT || defined(__DOXYGEN__)
|
#if CH_CFG_USE_TM || defined(__DOXYGEN__)
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module local definitions. */
|
/* Module local definitions. */
|
||||||
|
@ -102,10 +91,10 @@ void _rt_init(void) {
|
||||||
* Example of a guarded loop using the realtime counter. The loop implements
|
* Example of a guarded loop using the realtime counter. The loop implements
|
||||||
* a timeout after one second.
|
* a timeout after one second.
|
||||||
* @code
|
* @code
|
||||||
* rtcnt_t start = chRTGetCounterValue();
|
* rtcnt_t start = chSysGetRealtimeCounterX();
|
||||||
* rtcnt_t timeout = start + S2RTC(RTCCLK, 1);
|
* rtcnt_t timeout = start + S2RTC(RTCCLK, 1);
|
||||||
* while (my_condition) {
|
* while (my_condition) {
|
||||||
* if (!chRTIsCounterWithin(start, timeout)
|
* if (!chTMIsCounterWithin(start, timeout)
|
||||||
* return TIMEOUT;
|
* return TIMEOUT;
|
||||||
* // Do something.
|
* // Do something.
|
||||||
* }
|
* }
|
||||||
|
@ -115,9 +104,9 @@ void _rt_init(void) {
|
||||||
* @par Example 2
|
* @par Example 2
|
||||||
* Example of a loop that lasts exactly 50 microseconds.
|
* Example of a loop that lasts exactly 50 microseconds.
|
||||||
* @code
|
* @code
|
||||||
* rtcnt_t start = chRTGetCounterValue();
|
* rtcnt_t start = chSysGetRealtimeCounterX();
|
||||||
* rtcnt_t timeout = start + US2RTC(RTCCLK, 50);
|
* rtcnt_t timeout = start + US2RTC(RTCCLK, 50);
|
||||||
* while (chRTIsCounterWithin(start, timeout)) {
|
* while (chTMIsCounterWithin(start, timeout)) {
|
||||||
* // Do something.
|
* // Do something.
|
||||||
* }
|
* }
|
||||||
* // Continue.
|
* // Continue.
|
||||||
|
@ -130,7 +119,7 @@ void _rt_init(void) {
|
||||||
*
|
*
|
||||||
* @special
|
* @special
|
||||||
*/
|
*/
|
||||||
bool chRTIsCounterWithin(rtcnt_t start, rtcnt_t end) {
|
bool chTMIsCounterWithin(rtcnt_t start, rtcnt_t end) {
|
||||||
rtcnt_t now = chSysGetRealtimeCounterX();
|
rtcnt_t now = chSysGetRealtimeCounterX();
|
||||||
|
|
||||||
return end > start ? (now >= start) && (now < end) :
|
return end > start ? (now >= start) && (now < end) :
|
||||||
|
@ -147,7 +136,7 @@ bool chRTIsCounterWithin(rtcnt_t start, rtcnt_t end) {
|
||||||
*
|
*
|
||||||
* @special
|
* @special
|
||||||
*/
|
*/
|
||||||
void chRTPolledDelay(rtcnt_t cycles) {
|
void chTMPolledDelay(rtcnt_t cycles) {
|
||||||
rtcnt_t start = chSysGetRealtimeCounterX();
|
rtcnt_t start = chSysGetRealtimeCounterX();
|
||||||
rtcnt_t end = start + cycles;
|
rtcnt_t end = start + cycles;
|
||||||
while (chRTIsCounterWithin(start, end))
|
while (chRTIsCounterWithin(start, end))
|
||||||
|
@ -161,7 +150,7 @@ void chRTPolledDelay(rtcnt_t cycles) {
|
||||||
*
|
*
|
||||||
* @init
|
* @init
|
||||||
*/
|
*/
|
||||||
void chRTTimeMeasurementObjectInit(time_measurement_t *tmp) {
|
void chTMObjectInit(time_measurement_t *tmp) {
|
||||||
|
|
||||||
tmp->best = (rtcnt_t)-1;
|
tmp->best = (rtcnt_t)-1;
|
||||||
tmp->worst = (rtcnt_t)0;
|
tmp->worst = (rtcnt_t)0;
|
||||||
|
@ -178,7 +167,7 @@ void chRTTimeMeasurementObjectInit(time_measurement_t *tmp) {
|
||||||
*
|
*
|
||||||
* @special
|
* @special
|
||||||
*/
|
*/
|
||||||
NOINLINE void chRTTimeMeasurementStartX(time_measurement_t *tmp) {
|
NOINLINE void chTMStartX(time_measurement_t *tmp) {
|
||||||
|
|
||||||
tmp->last = chSysGetRealtimeCounterX();
|
tmp->last = chSysGetRealtimeCounterX();
|
||||||
}
|
}
|
||||||
|
@ -192,7 +181,7 @@ NOINLINE void chRTTimeMeasurementStartX(time_measurement_t *tmp) {
|
||||||
*
|
*
|
||||||
* @special
|
* @special
|
||||||
*/
|
*/
|
||||||
NOINLINE void chRTTimeMeasurementStopX(time_measurement_t *tmp) {
|
NOINLINE void chTMStopX(time_measurement_t *tmp) {
|
||||||
|
|
||||||
rtcnt_t now = chSysGetRealtimeCounterX();
|
rtcnt_t now = chSysGetRealtimeCounterX();
|
||||||
tmp->last = now - tmp->last - measurement_offset;
|
tmp->last = now - tmp->last - measurement_offset;
|
||||||
|
@ -203,6 +192,6 @@ NOINLINE void chRTTimeMeasurementStopX(time_measurement_t *tmp) {
|
||||||
tmp->best = tmp->last;
|
tmp->best = tmp->last;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CH_CFG_USE_RT */
|
#endif /* CH_CFG_USE_TM */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
Loading…
Reference in New Issue