Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 /** @}*/
Generated on Tue Jul 12 2022 13:53:16 by
1.7.2