From f569bcec23452c190248aab184a125f3a52e2eb8 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 29 Jul 2013 15:13:52 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6040 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/kernel/include/chstats.h | 19 +++++++++-------- os/kernel/include/chsys.h | 12 ++++++----- os/kernel/include/chtm.h | 10 ++++----- os/kernel/src/chstats.c | 9 ++++---- os/kernel/src/chsys.c | 46 +++++++++++++++++++++++++++++++++++++++++ os/kernel/src/chtm.c | 50 ++++++--------------------------------------- 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,49 +83,11 @@ 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. * @@ -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(); -- cgit v1.2.3