From 7041c5b167918def8ad906cbd9a46d73acc73c56 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 9 Jan 2012 18:28:29 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3775 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM4-STM32F407-DISCOVERY/halconf.h | 7 ++ os/hal/hal.mk | 1 + os/hal/include/hal.h | 19 +++++- os/hal/include/tm.h | 94 ++++++++++++++++++++++++++ os/hal/platforms/STM32F1xx/hal_lld.h | 5 ++ os/hal/platforms/STM32F2xx/hal_lld.h | 5 ++ os/hal/platforms/STM32F4xx/hal_lld.h | 5 ++ os/hal/platforms/STM32L1xx/hal_lld.h | 5 ++ os/hal/src/hal.c | 3 + os/hal/src/tm.c | 105 +++++++++++++++++++++++++++++ readme.txt | 2 + todo.txt | 18 +++-- 12 files changed, 263 insertions(+), 6 deletions(-) create mode 100644 os/hal/include/tm.h create mode 100644 os/hal/src/tm.c diff --git a/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h b/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h index 2c109a7ef..3bacab41f 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h +++ b/demos/ARMCM4-STM32F407-DISCOVERY/halconf.h @@ -34,6 +34,13 @@ #include "mcuconf.h" +/** + * @brief Enables the TM subsystem. + */ +#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) +#define HAL_USE_TM TRUE +#endif + /** * @brief Enables the PAL subsystem. */ diff --git a/os/hal/hal.mk b/os/hal/hal.mk index dddb73f85..83cf1bd1b 100644 --- a/os/hal/hal.mk +++ b/os/hal/hal.mk @@ -15,6 +15,7 @@ HALSRC = ${CHIBIOS}/os/hal/src/hal.c \ ${CHIBIOS}/os/hal/src/spi.c \ ${CHIBIOS}/os/hal/src/uart.c \ ${CHIBIOS}/os/hal/src/usb.c \ + ${CHIBIOS}/os/hal/src/tm.c \ ${CHIBIOS}/os/hal/src/mmc_spi.c \ ${CHIBIOS}/os/hal/src/serial_usb.c \ ${CHIBIOS}/os/hal/src/rtc.c diff --git a/os/hal/include/hal.h b/os/hal/include/hal.h index b7e6141cc..c9a7ad169 100644 --- a/os/hal/include/hal.h +++ b/os/hal/include/hal.h @@ -34,6 +34,7 @@ #include "hal_lld.h" +#include "tm.h" #include "pal.h" #include "adc.h" #include "can.h" @@ -43,6 +44,7 @@ #include "icu.h" #include "mac.h" #include "pwm.h" +#include "rtc.h" #include "serial.h" #include "sdc.h" #include "spi.h" @@ -50,7 +52,6 @@ #include "usb.h" #include "mmc_spi.h" #include "serial_usb.h" -#include "rtc.h" /*===========================================================================*/ /* Driver constants. */ @@ -188,6 +189,22 @@ (halGetCounterValue() < end)) /** @} */ +/** + * @brief Polled delay. + * @note The real delays is always few cycles in excess of the specified + * value. + * + * @param[in] ticks number of ticks + * + * @api + */ +#define halPolledDelay(ticks) { \ + halrtcnt_t start = halGetCounterValue(); \ + halrtcnt_t timeout = start + (ticks); \ + while (halIsCounterWithin(start, timeout)) \ + ; \ +} + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ diff --git a/os/hal/include/tm.h b/os/hal/include/tm.h new file mode 100644 index 000000000..23b9255f2 --- /dev/null +++ b/os/hal/include/tm.h @@ -0,0 +1,94 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011 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 tm.h + * @brief Time Measurement unit header. + * + * @addtogroup TM + * @{ + */ + +#ifndef _TM_H_ +#define _TM_H_ + +#if HAL_USE_TM + +/** + * @brief Type of a Time Measurement object. + * @note Start/stop of measurements is performed through the function + * pointers in order to avoid inlining of those functions which + * could compromise measurement accuracy. + * @note The maximum measurable time period depends on the implementation + * of the realtime counter in the HAL driver. + * @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 TimeMeasurement TimeMeasurement; + +/** + * @brief Time Measurement structure. + */ +struct TimeMeasurement { + void (*start)(TimeMeasurement *tmp); /**< @brief Starts a measurement. */ + void (*stop)(TimeMeasurement *tmp); /**< @brief Stops a measurement. */ + halrtcnt_t last; /**< @brief Last measurement. */ + halrtcnt_t worst; /**< @brief Worst measurement. */ + halrtcnt_t best; /**< @brief Best measurement. */ +}; + +/** + * @brief Starts a measurement. + * @pre The @p TimeMeasurement must be initialized. + * @note This function can be invoked in any context. + * + * @param[in,out] tmp pointer to a @p TimeMeasurement structure + * + * @special + */ +#define tmStartMeasurement(tmp) (tmp)->start(tmp) + +/** + * @brief Stops a measurement. + * @pre The @p TimeMeasurement must be initialized. + * @note This function can be invoked in any context. + * + * @param[in,out] tmp pointer to a @p TimeMeasurement structure + * + * @special + */ +#define tmStopMeasurement(tmp) (tmp)->stop(tmp) + +#ifdef __cplusplus +extern "C" { +#endif + void tmInit(void); + void tmObjectInit(TimeMeasurement *tmp); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_TM */ + +#endif /* _TM_H_ */ + +/** @} */ diff --git a/os/hal/platforms/STM32F1xx/hal_lld.h b/os/hal/platforms/STM32F1xx/hal_lld.h index ad6f117c8..0d5f0d712 100644 --- a/os/hal/platforms/STM32F1xx/hal_lld.h +++ b/os/hal/platforms/STM32F1xx/hal_lld.h @@ -49,6 +49,11 @@ /* Driver constants. */ /*===========================================================================*/ +/** + * @brief Defines the support for realtime counters in the HAL. + */ +#define HAL_IMPLEMENTS_COUNTERS TRUE + /** * @name Internal clock sources * @{ diff --git a/os/hal/platforms/STM32F2xx/hal_lld.h b/os/hal/platforms/STM32F2xx/hal_lld.h index 4f8272c97..84861fa33 100644 --- a/os/hal/platforms/STM32F2xx/hal_lld.h +++ b/os/hal/platforms/STM32F2xx/hal_lld.h @@ -44,6 +44,11 @@ /* Driver constants. */ /*===========================================================================*/ +/** + * @brief Defines the support for realtime counters in the HAL. + */ +#define HAL_IMPLEMENTS_COUNTERS TRUE + /** * @name Platform identification * @{ diff --git a/os/hal/platforms/STM32F4xx/hal_lld.h b/os/hal/platforms/STM32F4xx/hal_lld.h index 5215e0e0c..1e5d4947b 100644 --- a/os/hal/platforms/STM32F4xx/hal_lld.h +++ b/os/hal/platforms/STM32F4xx/hal_lld.h @@ -44,6 +44,11 @@ /* Driver constants. */ /*===========================================================================*/ +/** + * @brief Defines the support for realtime counters in the HAL. + */ +#define HAL_IMPLEMENTS_COUNTERS TRUE + /** * @name Platform identification * @{ diff --git a/os/hal/platforms/STM32L1xx/hal_lld.h b/os/hal/platforms/STM32L1xx/hal_lld.h index c56b8efa3..336e91f47 100644 --- a/os/hal/platforms/STM32L1xx/hal_lld.h +++ b/os/hal/platforms/STM32L1xx/hal_lld.h @@ -43,6 +43,11 @@ /* Driver constants. */ /*===========================================================================*/ +/** + * @brief Defines the support for realtime counters in the HAL. + */ +#define HAL_IMPLEMENTS_COUNTERS TRUE + /** * @name Platform identification * @{ diff --git a/os/hal/src/hal.c b/os/hal/src/hal.c index d5a8082e9..b469b57e5 100644 --- a/os/hal/src/hal.c +++ b/os/hal/src/hal.c @@ -62,6 +62,9 @@ void halInit(void) { hal_lld_init(); +#if HAL_USE_TM || defined(__DOXYGEN__) + tmInit(); +#endif #if HAL_USE_PAL || defined(__DOXYGEN__) palInit(&pal_default_config); #endif diff --git a/os/hal/src/tm.c b/os/hal/src/tm.c new file mode 100644 index 000000000..4d1eb57b8 --- /dev/null +++ b/os/hal/src/tm.c @@ -0,0 +1,105 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011 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 tm.c + * @brief Time Measurement unit code. + * + * @addtogroup TM + * @{ + */ + +#include "ch.h" +#include "hal.h" + +#if HAL_USE_TM + +/** + * @brief Subsystem calibration value. + */ +static halrtcnt_t measurement_offset; + + +/** + * @brief Starts a measurement. + * + * @param[in,out] tmp pointer to a @p TimeMeasurement structure + * + * @notapi + */ +static void tm_start(TimeMeasurement *tmp) { + + tmp->last = halGetCounterValue(); +} + +/** + * @brief Stops a measurement. + * + * @param[in,out] tmp pointer to a @p TimeMeasurement structure + * + * @notapi + */ +static void tm_stop(TimeMeasurement *tmp) { + + halrtcnt_t now = halGetCounterValue(); + tmp->last = now - tmp->last - measurement_offset; + if (tmp->last > tmp->worst) + tmp->worst = tmp->last; + else if (tmp->last < tmp->best) + tmp->best = tmp->last; +} + +/** + * @brief Initializes the Time Measurement unit. + * + * @init + */ +void tmInit(void) { + TimeMeasurement tm; + + /* Time Measurement subsystem calibration, it does a null measurement + and calculates the call overhead which is subtracted to real + measurements.*/ + measurement_offset = 0; + tmObjectInit(&tm); + tmStartMeasurement(&tm); + tmStopMeasurement(&tm); + measurement_offset = tm.last; +} + +/** + * @brief Initializes a @p TimeMeasurement object. + * + * @param[out] tmp pointer to a @p TimeMeasurement structure + * + * @init + */ +void tmObjectInit(TimeMeasurement *tmp) { + + tmp->start = tm_start; + tmp->stop = tm_stop; + tmp->last = (halrtcnt_t)0; + tmp->worst = (halrtcnt_t)0; + tmp->best = (halrtcnt_t)-1; +} + +#endif /* HAL_USE_TM */ + +/** @} */ diff --git a/readme.txt b/readme.txt index ffcbea9ac..0aeefcfb4 100644 --- a/readme.txt +++ b/readme.txt @@ -79,6 +79,8 @@ - FIX: Fixed SYSCFG clock not started in STM32L1/F4 HALs (bug 3449139). - FIX: Fixed wrong definitions in STM32L-Discovery board file (bug 3449076). - OPT: Improved the exception exit code in the GCC Cortex-Mx ports. +- NEW: Added a Time Measurement driver to the HAL, this generic driver uses + the realtime counters abstracted in the HAL driver. - NEW: Improved the STM32F1xx HAL driver, it now has the same features and configuration options of the newer STM32s. - NEW: MMC over SPI driver improved to handle high capacity cards, by diff --git a/todo.txt b/todo.txt index 8fea41308..94fad3578 100644 --- a/todo.txt +++ b/todo.txt @@ -6,8 +6,16 @@ X = In progress, some work done. N = Decided against. Current Pipeline (2.3.x): -X I2C device driver class support and at least one implementation. -X STM32F2xx support. +* I2C device driver class support and at least one implementation. +X STM32F2xx validation (so far done testing on STM32F4). +X Revision of the RTCv1 driver implementation. +X Revision of the RTCv2 driver implementation. +- Consistency check of all halconf.h files. +- Consistency check of all STM32xx mcuconf.h files. +- Fixing issue with Simulator and CH_DBG_SYSTEM_STATE_CHECK option. +- SD driver port to STM32F2 and STM32F4. +- CAN driver test on STM32F4. +- USB driver test on STM32Lxx. Within 2.x.x - Nios II support. @@ -16,7 +24,7 @@ Within 2.x.x - Software I2C implementation using a GPT instance for timings. - LPC17xx support. - NUC120 support. -- MMC_SPI driver revision and speedup. +- MMC_SPI driver speedup. - Static memory allocation hook macros in kernel code. - MAC driver for STM32F107, STM32F2xx, STM32F4xx. - USB driver model revision. @@ -35,10 +43,10 @@ X Implement the "transmission end" serial driver event on those platforms - Reduce number of demos globally, add demos to a repository or on web site. Required in order to reduce support effort. - FatFs wrapper. -- New device driver models: Clock, Systick, RTC, WDG, DAC, Power Monitor. +- New device driver models: Clock, Systick, WDG, DAC, Power Monitor. - Add UART4 support to the STM32 UART driver (CL line only, HD has a nasty shared interrupt). -- STM32 OTG USB cell support for CL devices. +- STM32 OTG USB cell support for CL, F2, F4 devices. - Add ADC3 support to the STM32 ADC driver. - Shared DMA channels support in the STM8L HAL. - Device drivers for STM8/STM8L (ADC, PWM, bring them on par with STM32). -- cgit v1.2.3