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