/* 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 chrt.h * @brief Real Time Counter and Measurement module macros and structures. * * @addtogroup realtime_counter * @{ */ #ifndef _CHRT_H_ #define _CHRT_H_ #if CH_CFG_USE_RT || defined(__DOXYGEN__) #define port_rt_get_counter_value() 0 /*===========================================================================*/ /* Module constants. */ /*===========================================================================*/ /*===========================================================================*/ /* Module pre-compile time settings. */ /*===========================================================================*/ /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ /*===========================================================================*/ /* Module data structures and types. */ /*===========================================================================*/ /** * @brief Type of a Time Measurement object. * @note The maximum measurable time period depends on the implementation * of the realtime counter and its clock frequency. * @note The measurement is not 100% cycle-accurate, it can be in excess * of few cycles depending on the compiler and target architecture. * @note Interrupts can affect measurement if the measurement is performed * with interrupts enabled. */ typedef struct { rtcnt_t best; /**< @brief Best measurement. */ rtcnt_t worst; /**< @brief Worst measurement. */ rtcnt_t cumulative; /**< @brief Cumulative measurement. */ rtcnt_t last; /**< @brief Last measurement. */ } time_measurement_t; /*===========================================================================*/ /* Module macros. */ /*===========================================================================*/ /** * @name Time conversion utilities for the realtime counter * @{ */ /** * @brief Seconds to realtime counter. * @details Converts from seconds to realtime counter cycles. * @note The result is rounded upward to the next tick boundary. * * @param[in] sec number of seconds * @return The number of cycles. * * @api */ #define S2RTV(freq, sec) ((freq) * (sec)) /** * @brief Milliseconds to realtime counter. * @details Converts from milliseconds to realtime counter cycles. * @note The result is rounded upward to the next tick boundary. * * @param[in] msec number of milliseconds * @return The number of cycles. * * @api */ #define MS2RTC(freq, msec) (rtcnt_t)((((freq) + 999UL) / 1000UL) * (msec)) /** * @brief Microseconds to realtime counter. * @details Converts from microseconds to realtime counter cycles. * @note The result is rounded upward to the next tick boundary. * * @param[in] usec number of microseconds * @return The number of cycles. * * @api */ #define US2RTC(freq, usec) (rtcnt_t)((((freq) + 999999UL) / 1000000UL) * (usec)) /** * @brief Realtime counter cycles to seconds. * @details Converts from realtime counter cycles number to seconds. * * @param[in] n number of cycles * @return The number of seconds. * * @api */ #define RTC2S(freq, n) (rtcnt_t)((n) / (freq)) /** * @brief Realtime counter cycles to milliseconds. * @details Converts from realtime counter cycles number to milliseconds. * * @param[in] n number of cycles * @return The number of milliseconds. * * @api */ #define RTC2MS(freq, n) ((n) / ((freq) / 1000UL)) /** * @brief Realtime counter cycles to microseconds. * @details Converts from realtime counter cycles number to microseconds. * * @param[in] n number of cycles * @return The number of microseconds. * * @api */ #define RTC2US(freq, n) ((n) / ((freq) / 1000000UL)) /** @} */ /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ #ifdef __cplusplus extern "C" { #endif void _rt_init(void); bool chRTIsCounterWithin(rtcnt_t start, rtcnt_t end); void chRTPolledDelay(rtcnt_t cycles); void chRTTimeMeasurementObjectInit(time_measurement_t *tmp); NOINLINE void chRTTimeMeasurementStartX(time_measurement_t *tmp); NOINLINE void chRTTimeMeasurementStopX(time_measurement_t *tmp); #ifdef __cplusplus } #endif /*===========================================================================*/ /* Module inline functions. */ /*===========================================================================*/ #endif /* CH_CFG_USE_RT */ #endif /* _CHRT_H_ */ /** @} */