Thomas Lyp / DevLibMemoryController

Dependencies:   FastPWM

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ticker_api.h Source File

ticker_api.h

00001 
00002 /** \addtogroup hal */
00003 /** @{*/
00004 /* mbed Microcontroller Library
00005  * Copyright (c) 2015 ARM Limited
00006  *
00007  * Licensed under the Apache License, Version 2.0 (the "License");
00008  * you may not use this file except in compliance with the License.
00009  * You may obtain a copy of the License at
00010  *
00011  *     http://www.apache.org/licenses/LICENSE-2.0
00012  *
00013  * Unless required by applicable law or agreed to in writing, software
00014  * distributed under the License is distributed on an "AS IS" BASIS,
00015  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00016  * See the License for the specific language governing permissions and
00017  * limitations under the License.
00018  */
00019 #ifndef MBED_TICKER_API_H
00020 #define MBED_TICKER_API_H
00021 
00022 #include <stdint.h>
00023 #include <stdbool.h>
00024 #include "device.h"
00025 
00026 /**
00027  * Legacy format representing a timestamp in us.
00028  * Given it is modeled as a 32 bit integer, this type can represent timestamp
00029  * up to 4294 seconds (71 minutes).
00030  * Prefer using us_timestamp_t which store timestamp as 64 bits integer.
00031  */
00032 typedef uint32_t timestamp_t;
00033 
00034 /**
00035  * A us timestamp stored in a 64 bit integer.
00036  * Can store timestamp up to 584810 years.
00037  */
00038 typedef uint64_t us_timestamp_t;
00039 
00040 /** Ticker's event structure
00041  */
00042 typedef struct ticker_event_s {
00043     us_timestamp_t         timestamp; /**< Event's timestamp */
00044     uint32_t               id;        /**< TimerEvent object */
00045     struct ticker_event_s *next;      /**< Next event in the queue */
00046 } ticker_event_t;
00047 
00048 typedef void (*ticker_event_handler)(uint32_t id);
00049 
00050 /** Information about the ticker implementation
00051  */
00052 typedef struct {
00053     uint32_t frequency;                           /**< Frequency in Hz this ticker runs at */
00054     uint32_t bits;                                /**< Number of bits this ticker supports */
00055 } ticker_info_t;
00056 
00057 
00058 /** Ticker's interface structure - required API for a ticker
00059  */
00060 typedef struct {
00061     void (*init)(void);                           /**< Init function */
00062     uint32_t (*read)(void);                       /**< Read function */
00063     void (*disable_interrupt)(void);              /**< Disable interrupt function */
00064     void (*clear_interrupt)(void);                /**< Clear interrupt function */
00065     void (*set_interrupt)(timestamp_t timestamp); /**< Set interrupt function */
00066     void (*fire_interrupt)(void);                 /**< Fire interrupt right-away */
00067     const ticker_info_t *(*get_info)(void);       /**< Return info about this ticker's implementation */
00068 } ticker_interface_t;
00069 
00070 /** Ticker's event queue structure
00071  */
00072 typedef struct {
00073     ticker_event_handler event_handler; /**< Event handler */
00074     ticker_event_t *head;               /**< A pointer to head */
00075     uint32_t frequency;                 /**< Frequency of the timer in Hz */
00076     uint32_t bitmask;                   /**< Mask to be applied to time values read */
00077     uint32_t max_delta;                 /**< Largest delta in ticks that can be used when scheduling */
00078     uint64_t max_delta_us;              /**< Largest delta in us that can be used when scheduling */
00079     uint32_t tick_last_read;            /**< Last tick read */
00080     uint64_t tick_remainder;            /**< Ticks that have not been added to base_time */
00081     us_timestamp_t present_time;        /**< Store the timestamp used for present time */
00082     bool initialized;                   /**< Indicate if the instance is initialized */
00083     bool dispatching;                   /**< The function ticker_irq_handler is dispatching */
00084     uint8_t frequency_shifts;           /**< If frequency is a value of 2^n, this is n, otherwise 0 */
00085 } ticker_event_queue_t;
00086 
00087 /** Ticker's data structure
00088  */
00089 typedef struct {
00090     const ticker_interface_t *interface; /**< Ticker's interface */
00091     ticker_event_queue_t *queue;         /**< Ticker's event queue */
00092 } ticker_data_t;
00093 
00094 #ifdef __cplusplus
00095 extern "C" {
00096 #endif
00097 
00098 /**
00099  * \defgroup hal_ticker Ticker HAL functions
00100  * @{
00101  */
00102 
00103 /** Initialize a ticker and set the event handler
00104  *
00105  * @param ticker The ticker object.
00106  * @param handler A handler to be set
00107  */
00108 void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler);
00109 
00110 /** IRQ handler that goes through the events to trigger overdue events.
00111  *
00112  * @param ticker The ticker object.
00113  */
00114 void ticker_irq_handler(const ticker_data_t *const ticker);
00115 
00116 /** Remove an event from the queue
00117  *
00118  * @param ticker The ticker object.
00119  * @param obj  The event object to be removed from the queue
00120  */
00121 void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj);
00122 
00123 /** Insert an event to the queue
00124  *
00125  * The event will be executed in timestamp - ticker_read().
00126  *
00127  * @warning This function does not consider timestamp in the past. If an event
00128  * is inserted with a timestamp less than the current timestamp then the event
00129  * will be executed in timestamp - ticker_read() us.
00130  * The internal counter wrap very quickly it is hard to decide weither an
00131  * event is in the past or in 1 hour.
00132  *
00133  * @note prefer the use of ticker_insert_event_us which allows registration of
00134  * absolute timestamp.
00135  *
00136  * @param ticker    The ticker object.
00137  * @param obj       The event object to be inserted to the queue
00138  * @param timestamp The event's timestamp
00139  * @param id        The event object
00140  */
00141 void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id);
00142 
00143 /** Insert an event to the queue
00144  *
00145  * The event will be executed in timestamp - ticker_read_us() us.
00146  *
00147  * @note If an event is inserted with a timestamp less than the current
00148  * timestamp then the event will be scheduled immediately resulting in
00149  * an instant call to event handler.
00150  *
00151  * @param ticker    The ticker object.
00152  * @param obj       The event object to be inserted to the queue
00153  * @param timestamp The event's timestamp
00154  * @param id        The event object
00155  */
00156 void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id);
00157 
00158 /** Read the current (relative) ticker's timestamp
00159  *
00160  * @warning Return a relative timestamp because the counter wrap every 4294
00161  * seconds.
00162  *
00163  * @param ticker The ticker object.
00164  * @return The current timestamp
00165  */
00166 timestamp_t ticker_read(const ticker_data_t *const ticker);
00167 
00168 /** Read the current (absolute) ticker's timestamp
00169  *
00170  * @warning Return an absolute timestamp counting from the initialization of the
00171  * ticker.
00172  *
00173  * @param ticker The ticker object.
00174  * @return The current timestamp
00175  */
00176 us_timestamp_t ticker_read_us(const ticker_data_t *const ticker);
00177 
00178 /** Read the next event's timestamp
00179  *
00180  * @param ticker        The ticker object.
00181  * @param timestamp     The timestamp object.
00182  * @return 1 if timestamp is pending event, 0 if there's no event pending
00183  */
00184 int ticker_get_next_timestamp(const ticker_data_t *const ticker, timestamp_t *timestamp);
00185 
00186 /* Private functions
00187  *
00188  * @cond PRIVATE
00189  *
00190  */
00191 
00192 int _ticker_match_interval_passed(timestamp_t prev_tick, timestamp_t cur_tick, timestamp_t match_tick);
00193 
00194 /*
00195  * @endcond PRIVATE
00196  *
00197  */
00198 
00199 /**@}*/
00200 
00201 #ifdef __cplusplus
00202 }
00203 #endif
00204 
00205 #endif
00206 
00207 /** @}*/