aboutsummaryrefslogtreecommitdiffstats
path: root/os/kernel
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-07-29 15:13:52 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-07-29 15:13:52 +0000
commitf569bcec23452c190248aab184a125f3a52e2eb8 (patch)
treeee7b4be89b879597c2d82a49616d963696fbf78c /os/kernel
parentca4b2f91b7a24abeb6ea7fa43c1816397fb966c4 (diff)
downloadChibiOS-f569bcec23452c190248aab184a125f3a52e2eb8.tar.gz
ChibiOS-f569bcec23452c190248aab184a125f3a52e2eb8.tar.bz2
ChibiOS-f569bcec23452c190248aab184a125f3a52e2eb8.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6040 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/kernel')
-rw-r--r--os/kernel/include/chstats.h19
-rw-r--r--os/kernel/include/chsys.h12
-rw-r--r--os/kernel/include/chtm.h10
-rw-r--r--os/kernel/src/chstats.c9
-rw-r--r--os/kernel/src/chsys.c46
-rw-r--r--os/kernel/src/chtm.c50
6 files changed, 79 insertions, 67 deletions
diff --git a/os/kernel/include/chstats.h b/os/kernel/include/chstats.h
index dee5c9bec..d2a83e1b6 100644
--- a/os/kernel/include/chstats.h
+++ b/os/kernel/include/chstats.h
@@ -55,12 +55,15 @@
* @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. */
+ time_measurement_t *current; /**< @brief Currently under measurement.*/
+ ucnt_t n_irq; /**< @brief Number of IRQs. */
+ ucnt_t n_ctxswc; /**< @brief Number of context switches. */
+ time_measurement_t m_crit_thd; /**< @brief Measurement of threads
+ critical zones duration. */
+ time_measurement_t m_crit_isr; /**< @brief Measurement of ISRs critical
+ zones duration. */
+ time_measurement_t m_isr; /**< @brief Measurement of ISRs total
+ duration. */
} kernel_stats_t;
/*===========================================================================*/
@@ -70,12 +73,12 @@ typedef struct {
/**
* @brief Increases the IRQ counter.
*/
-#define _stats_increase_irq() kernel_stats.nirq++
+#define _stats_increase_irq() kernel_stats.n_irq++
/**
* @brief Increases the context switch counter.
*/
-#define _stats_increase_ctxswc() kernel_stats.nctxswc++
+#define _stats_increase_ctxswc() kernel_stats.n_ctxswc++
/*===========================================================================*/
/* External declarations. */
diff --git a/os/kernel/include/chsys.h b/os/kernel/include/chsys.h
index 0fd07b96b..722323d54 100644
--- a/os/kernel/include/chsys.h
+++ b/os/kernel/include/chsys.h
@@ -182,18 +182,16 @@
/**
* @brief Returns the current value of the system real time counter.
- * @note This function can be called from any context.
+ * @note This function is only available if the port layer supports the
+ * option @p CH_PORT_SUPPORTS_RT.
*
* @return The value of the system realtime counter of
- * type rtcnt_t. If the port does not support a
- * realtime counter then zero is returned.
+ * type rtcnt_t.
*
* @xclass
*/
#if CH_PORT_SUPPORTS_RT || defined(__DOXYGEN__)
#define chSysGetRealtimeCounterX() (rtcnt_t)port_rt_get_counter_value()
-#else
-#define chSysGetRealtimeCounterX() 0
#endif
/*===========================================================================*/
@@ -208,6 +206,10 @@ extern "C" {
void chSysTimerHandlerI(void);
syssts_t chSysGetAndLockX(void);
void chSysRestoreLockX(syssts_t sts);
+#if CH_PORT_SUPPORTS_RT
+ bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end);
+ void chSysPolledDelayX(rtcnt_t cycles);
+#endif
#ifdef __cplusplus
}
#endif
diff --git a/os/kernel/include/chtm.h b/os/kernel/include/chtm.h
index bd1d73dd9..8d8d021fd 100644
--- a/os/kernel/include/chtm.h
+++ b/os/kernel/include/chtm.h
@@ -81,13 +81,11 @@ typedef struct {
extern "C" {
#endif
void _tm_init(void);
- bool chTMIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end);
- void chTMPolledDelayX(rtcnt_t cycles);
void chTMObjectInit(time_measurement_t *tmp);
- NOINLINE void chTMStartX(time_measurement_t *tmp);
- NOINLINE void chTMStopX(time_measurement_t *tmp);
- NOINLINE void chTMChainToX(time_measurement_t *tmp1,
- time_measurement_t *tmp2);
+ NOINLINE void chTMStartMeasurementX(time_measurement_t *tmp);
+ NOINLINE void chTMStopMeasurementX(time_measurement_t *tmp);
+ NOINLINE void chTMChainMeasurementToX(time_measurement_t *tmp1,
+ time_measurement_t *tmp2);
#ifdef __cplusplus
}
#endif
diff --git a/os/kernel/src/chstats.c b/os/kernel/src/chstats.c
index 9d69e0023..eb2023c93 100644
--- a/os/kernel/src/chstats.c
+++ b/os/kernel/src/chstats.c
@@ -67,10 +67,11 @@ kernel_stats_t kernel_stats;
*/
void _stats_init(void) {
- kernel_stats.nirq = 0;
- kernel_stats.nctxswc = 0;
- chTMObjectInit(&kernel_stats.isr);
- chTMObjectInit(&kernel_stats.critical);
+ kernel_stats.n_irq = 0;
+ kernel_stats.n_ctxswc = 0;
+ chTMObjectInit(&kernel_stats.m_isr);
+ chTMObjectInit(&kernel_stats.m_crit_thd);
+ chTMObjectInit(&kernel_stats.m_crit_isr);
}
#endif /* CH_DBG_STATISTICS */
diff --git a/os/kernel/src/chsys.c b/os/kernel/src/chsys.c
index 0727532ee..168bd1376 100644
--- a/os/kernel/src/chsys.c
+++ b/os/kernel/src/chsys.c
@@ -29,6 +29,7 @@
* - Interrupt Handling.
* - Power Management.
* - Abnormal Termination.
+ * - Realtime counter.
* .
* @{
*/
@@ -245,4 +246,49 @@ void chSysRestoreLockX(syssts_t sts) {
}
}
+
+#if CH_PORT_SUPPORTS_RT || defined(__DOXYGEN__)
+/**
+ * @brief Realtime window test.
+ * @details This function verifies if the current realtime counter value
+ * lies within the specified range or not. The test takes care
+ * of the realtime counter wrapping to zero on overflow.
+ * @note When start==end then the function returns always true because the
+ * whole time range is specified.
+ * @note This function is only available if the port layer supports the
+ * option @p CH_PORT_SUPPORTS_RT.
+ *
+ * @param[in] cnt the counter value to be tested
+ * @param[in] start the start of the time window (inclusive)
+ * @param[in] end the end of the time window (non inclusive)
+ * @retval true current time within the specified time window.
+ * @retval false current time not within the specified time window.
+ *
+ * @xclass
+ */
+bool chSysIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end) {
+
+ return end > start ? (cnt >= start) && (cnt < end) :
+ (cnt >= start) || (cnt < end);
+}
+
+/**
+ * @brief Polled delay.
+ * @note The real delay is always few cycles in excess of the specified
+ * value.
+ * @note This function is only available if the port layer supports the
+ * option @p CH_PORT_SUPPORTS_RT.
+ *
+ * @param[in] cycles number of cycles
+ *
+ * @xclass
+ */
+void chSysPolledDelayX(rtcnt_t cycles) {
+ rtcnt_t start = chSysGetRealtimeCounterX();
+ rtcnt_t end = start + cycles;
+ while (chSysIsCounterWithinX(chSysGetRealtimeCounterX(), start, end))
+ ;
+}
+#endif /* CH_PORT_SUPPORTS_RT */
+
/** @} */
diff --git a/os/kernel/src/chtm.c b/os/kernel/src/chtm.c
index 0ae2dfeda..474177093 100644
--- a/os/kernel/src/chtm.c
+++ b/os/kernel/src/chtm.c
@@ -83,50 +83,12 @@ void _tm_init(void) {
measurements.*/
measurement_offset = 0;
chTMObjectInit(&tm);
- chTMStartX(&tm);
- chTMStopX(&tm);
+ chTMStartMeasurementX(&tm);
+ chTMStopMeasurementX(&tm);
measurement_offset = tm.last;
}
/**
- * @brief Realtime window test.
- * @details This function verifies if the current realtime counter value
- * lies within the specified range or not. The test takes care
- * of the realtime counter wrapping to zero on overflow.
- * @note When start==end then the function returns always true because the
- * whole time range is specified.
- *
- * @param[in] cnt the counter value to be tested
- * @param[in] start the start of the time window (inclusive)
- * @param[in] end the end of the time window (non inclusive)
- * @retval true current time within the specified time window.
- * @retval false current time not within the specified time window.
- *
- * @xclass
- */
-bool chTMIsCounterWithinX(rtcnt_t cnt, rtcnt_t start, rtcnt_t end) {
-
- return end > start ? (cnt >= start) && (cnt < end) :
- (cnt >= start) || (cnt < end);
-}
-
-/**
- * @brief Polled delay.
- * @note The real delay is always few cycles in excess of the specified
- * value.
- *
- * @param[in] cycles number of cycles
- *
- * @xclass
- */
-void chTMPolledDelayX(rtcnt_t cycles) {
- rtcnt_t start = chSysGetRealtimeCounterX();
- rtcnt_t end = start + cycles;
- while (chTMIsCounterWithinX(chSysGetRealtimeCounterX(), start, end))
- ;
-}
-
-/**
* @brief Initializes a @p TimeMeasurement object.
*
* @param[out] tmp pointer to a @p TimeMeasurement structure
@@ -149,7 +111,7 @@ void chTMObjectInit(time_measurement_t *tmp) {
*
* @xclass
*/
-NOINLINE void chTMStartX(time_measurement_t *tmp) {
+NOINLINE void chTMStartMeasurementX(time_measurement_t *tmp) {
tmp->last = chSysGetRealtimeCounterX();
}
@@ -162,7 +124,7 @@ NOINLINE void chTMStartX(time_measurement_t *tmp) {
*
* @xclass
*/
-NOINLINE void chTMStopX(time_measurement_t *tmp) {
+NOINLINE void chTMStopMeasurementX(time_measurement_t *tmp) {
tm_stop(tmp, chSysGetRealtimeCounterX());
}
@@ -181,8 +143,8 @@ NOINLINE void chTMStopX(time_measurement_t *tmp) {
*
* @xclass
*/
-NOINLINE void chTMChainToX(time_measurement_t *tmp1,
- time_measurement_t *tmp2) {
+NOINLINE void chTMChainMeasurementToX(time_measurement_t *tmp1,
+ time_measurement_t *tmp2) {
/* Starts new measurement.*/
tmp2->last = chSysGetRealtimeCounterX();