forked
Embed:
(wiki syntax)
Show/hide line numbers
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 * Maximum delta (in us) between too interrupts. 00028 */ 00029 #define MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA 0x70000000ULL 00030 00031 /** 00032 * Legacy format representing a timestamp in us. 00033 * Given it is modeled as a 32 bit integer, this type can represent timestamp 00034 * up to 4294 seconds (71 minutes). 00035 * Prefer using us_timestamp_t which store timestamp as 64 bits integer. 00036 */ 00037 typedef uint32_t timestamp_t; 00038 00039 /** 00040 * A us timestamp stored in a 64 bit integer. 00041 * Can store timestamp up to 584810 years. 00042 */ 00043 typedef uint64_t us_timestamp_t; 00044 00045 /** Ticker's event structure 00046 */ 00047 typedef struct ticker_event_s { 00048 us_timestamp_t timestamp; /**< Event's timestamp */ 00049 uint32_t id; /**< TimerEvent object */ 00050 struct ticker_event_s *next; /**< Next event in the queue */ 00051 } ticker_event_t; 00052 00053 typedef void (*ticker_event_handler)(uint32_t id); 00054 00055 /** Ticker's interface structure - required API for a ticker 00056 */ 00057 typedef struct { 00058 void (*init)(void); /**< Init function */ 00059 uint32_t (*read)(void); /**< Read function */ 00060 void (*disable_interrupt)(void); /**< Disable interrupt function */ 00061 void (*clear_interrupt)(void); /**< Clear interrupt function */ 00062 void (*set_interrupt)(timestamp_t timestamp); /**< Set interrupt function */ 00063 } ticker_interface_t; 00064 00065 /** Ticker's event queue structure 00066 */ 00067 typedef struct { 00068 ticker_event_handler event_handler; /**< Event handler */ 00069 ticker_event_t *head; /**< A pointer to head */ 00070 us_timestamp_t present_time; /**< Store the timestamp used for present time */ 00071 bool initialized; /**< Indicate if the instance is initialized */ 00072 } ticker_event_queue_t; 00073 00074 /** Ticker's data structure 00075 */ 00076 typedef struct { 00077 const ticker_interface_t *interface; /**< Ticker's interface */ 00078 ticker_event_queue_t *queue; /**< Ticker's event queue */ 00079 } ticker_data_t; 00080 00081 #ifdef __cplusplus 00082 extern "C" { 00083 #endif 00084 00085 /** 00086 * \defgroup hal_ticker Ticker HAL functions 00087 * @{ 00088 */ 00089 00090 /** Initialize a ticker and set the event handler 00091 * 00092 * @param ticker The ticker object. 00093 * @param handler A handler to be set 00094 */ 00095 void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler); 00096 00097 /** IRQ handler that goes through the events to trigger overdue events. 00098 * 00099 * @param ticker The ticker object. 00100 */ 00101 void ticker_irq_handler(const ticker_data_t *const ticker); 00102 00103 /** Remove an event from the queue 00104 * 00105 * @param ticker The ticker object. 00106 * @param obj The event object to be removed from the queue 00107 */ 00108 void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj); 00109 00110 /** Insert an event to the queue 00111 * 00112 * The event will be executed in timestamp - ticker_read(). 00113 * 00114 * @warning This function does not consider timestamp in the past. If an event 00115 * is inserted with a timestamp less than the current timestamp then the event 00116 * will be executed in timestamp - ticker_read() us. 00117 * The internal counter wrap very quickly it is hard to decide weither an 00118 * event is in the past or in 1 hour. 00119 * 00120 * @note prefer the use of ticker_insert_event_us which allows registration of 00121 * absolute timestamp. 00122 * 00123 * @param ticker The ticker object. 00124 * @param obj The event object to be inserted to the queue 00125 * @param timestamp The event's timestamp 00126 * @param id The event object 00127 */ 00128 void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id); 00129 00130 /** Insert an event to the queue 00131 * 00132 * The event will be executed in timestamp - ticker_read_us() us. 00133 * 00134 * @warning If an event is inserted with a timestamp less than the current 00135 * timestamp then the event will **not** be inserted. 00136 * 00137 * @param ticker The ticker object. 00138 * @param obj The event object to be inserted to the queue 00139 * @param timestamp The event's timestamp 00140 * @param id The event object 00141 */ 00142 void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id); 00143 00144 /** Read the current (relative) ticker's timestamp 00145 * 00146 * @warning Return a relative timestamp because the counter wrap every 4294 00147 * seconds. 00148 * 00149 * @param ticker The ticker object. 00150 * @return The current timestamp 00151 */ 00152 timestamp_t ticker_read(const ticker_data_t *const ticker); 00153 00154 /** Read the current (absolute) ticker's timestamp 00155 * 00156 * @warning Return an absolute timestamp counting from the initialization of the 00157 * ticker. 00158 * 00159 * @param ticker The ticker object. 00160 * @return The current timestamp 00161 */ 00162 us_timestamp_t ticker_read_us(const ticker_data_t *const ticker); 00163 00164 /** Read the next event's timestamp 00165 * 00166 * @param ticker The ticker object. 00167 * @param timestamp The timestamp object. 00168 * @return 1 if timestamp is pending event, 0 if there's no event pending 00169 */ 00170 int ticker_get_next_timestamp(const ticker_data_t *const ticker, timestamp_t *timestamp); 00171 00172 /**@}*/ 00173 00174 #ifdef __cplusplus 00175 } 00176 #endif 00177 00178 #endif 00179 00180 /** @}*/
Generated on Tue Jul 12 2022 16:02:33 by 1.7.2