aboutsummaryrefslogtreecommitdiff
path: root/embassy-time-driver/src
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-01-11 16:38:44 +0100
committerDario Nieuwenhuis <[email protected]>2024-01-11 16:56:08 +0100
commit15f94fb0fc70463b9a50c997083fee3f5758b17a (patch)
tree17ccb5d369a9e7b0d2dbe0c7e39804b7f1f65458 /embassy-time-driver/src
parentdcffad6b05a06bc5f4d09a35184d5ffe158e02cf (diff)
time: split driver into a separate embassy-time-driver crate.
Diffstat (limited to 'embassy-time-driver/src')
-rw-r--r--embassy-time-driver/src/lib.rs200
-rw-r--r--embassy-time-driver/src/tick.rs482
2 files changed, 682 insertions, 0 deletions
diff --git a/embassy-time-driver/src/lib.rs b/embassy-time-driver/src/lib.rs
new file mode 100644
index 000000000..39a772aa5
--- /dev/null
+++ b/embassy-time-driver/src/lib.rs
@@ -0,0 +1,200 @@
1#![no_std]
2#![doc = include_str!("../README.md")]
3#![warn(missing_docs)]
4
5//! Time driver interface
6//!
7//! This module defines the interface a driver needs to implement to power the `embassy_time` module.
8//!
9//! # Implementing a driver
10//!
11//! - Define a struct `MyDriver`
12//! - Implement [`Driver`] for it
13//! - Register it as the global driver with [`time_driver_impl`](crate::time_driver_impl).
14//! - Enable the Cargo feature `embassy-executor/time`
15//!
16//! If your driver has a single set tick rate, enable the corresponding [`tick-hz-*`](crate#tick-rate) feature,
17//! which will prevent users from needing to configure it themselves (or selecting an incorrect configuration).
18//!
19//! If your driver supports a small number of set tick rates, expose your own cargo features and have each one
20//! enable the corresponding `embassy-time/tick-*`.
21//!
22//! Otherwise, don’t enable any `tick-hz-*` feature to let the user configure the tick rate themselves by
23//! enabling a feature on `embassy-time`.
24//!
25//! # Linkage details
26//!
27//! Instead of the usual "trait + generic params" approach, calls from embassy to the driver are done via `extern` functions.
28//!
29//! `embassy` internally defines the driver functions as `extern "Rust" { fn _embassy_time_now() -> u64; }` and calls them.
30//! The driver crate defines the functions as `#[no_mangle] fn _embassy_time_now() -> u64`. The linker will resolve the
31//! calls from the `embassy` crate to call into the driver crate.
32//!
33//! If there is none or multiple drivers in the crate tree, linking will fail.
34//!
35//! This method has a few key advantages for something as foundational as timekeeping:
36//!
37//! - The time driver is available everywhere easily, without having to thread the implementation
38//! through generic parameters. This is especially helpful for libraries.
39//! - It means comparing `Instant`s will always make sense: if there were multiple drivers
40//! active, one could compare an `Instant` from driver A to an `Instant` from driver B, which
41//! would yield incorrect results.
42//!
43//! # Example
44//!
45//! ```
46//! use embassy_time::driver::{Driver, AlarmHandle};
47//!
48//! struct MyDriver{} // not public!
49//!
50//! impl Driver for MyDriver {
51//! fn now(&self) -> u64 {
52//! todo!()
53//! }
54//! unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> {
55//! todo!()
56//! }
57//! fn set_alarm_callback(&self, alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
58//! todo!()
59//! }
60//! fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool {
61//! todo!()
62//! }
63//! }
64//! ```
65//! ```ignore
66//! embassy_time::time_driver_impl!(static DRIVER: MyDriver = MyDriver{});
67//! ```
68
69//! ## Feature flags
70#![doc = document_features::document_features!(feature_label = r#"<span class="stab portability"><code>{feature}</code></span>"#)]
71
72mod tick;
73
74/// Ticks per second of the global timebase.
75///
76/// This value is specified by the [`tick-*` Cargo features](crate#tick-rate)
77pub const TICK_HZ: u64 = tick::TICK_HZ;
78
79/// Alarm handle, assigned by the driver.
80#[derive(Clone, Copy)]
81pub struct AlarmHandle {
82 id: u8,
83}
84
85impl AlarmHandle {
86 /// Create an AlarmHandle
87 ///
88 /// Safety: May only be called by the current global Driver impl.
89 /// The impl is allowed to rely on the fact that all `AlarmHandle` instances
90 /// are created by itself in unsafe code (e.g. indexing operations)
91 pub unsafe fn new(id: u8) -> Self {
92 Self { id }
93 }
94
95 /// Get the ID of the AlarmHandle.
96 pub fn id(&self) -> u8 {
97 self.id
98 }
99}
100
101/// Time driver
102pub trait Driver: Send + Sync + 'static {
103 /// Return the current timestamp in ticks.
104 ///
105 /// Implementations MUST ensure that:
106 /// - This is guaranteed to be monotonic, i.e. a call to now() will always return
107 /// a greater or equal value than earler calls. Time can't "roll backwards".
108 /// - It "never" overflows. It must not overflow in a sufficiently long time frame, say
109 /// in 10_000 years (Human civilization is likely to already have self-destructed
110 /// 10_000 years from now.). This means if your hardware only has 16bit/32bit timers
111 /// you MUST extend them to 64-bit, for example by counting overflows in software,
112 /// or chaining multiple timers together.
113 fn now(&self) -> u64;
114
115 /// Try allocating an alarm handle. Returns None if no alarms left.
116 /// Initially the alarm has no callback set, and a null `ctx` pointer.
117 ///
118 /// # Safety
119 /// It is UB to make the alarm fire before setting a callback.
120 unsafe fn allocate_alarm(&self) -> Option<AlarmHandle>;
121
122 /// Sets the callback function to be called when the alarm triggers.
123 /// The callback may be called from any context (interrupt or thread mode).
124 fn set_alarm_callback(&self, alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ());
125
126 /// Sets an alarm at the given timestamp. When the current timestamp reaches the alarm
127 /// timestamp, the provided callback function will be called.
128 ///
129 /// The `Driver` implementation should guarantee that the alarm callback is never called synchronously from `set_alarm`.
130 /// Rather - if `timestamp` is already in the past - `false` should be returned and alarm should not be set,
131 /// or alternatively, the driver should return `true` and arrange to call the alarm callback as soon as possible, but not synchronously.
132 /// There is a rare third possibility that the alarm was barely in the future, and by the time it was enabled, it had slipped into the
133 /// past. This is can be detected by double-checking that the alarm is still in the future after enabling it; if it isn't, `false`
134 /// should also be returned to indicate that the callback may have been called already by the alarm, but it is not guaranteed, so the
135 /// caller should also call the callback, just like in the more common `false` case. (Note: This requires idempotency of the callback.)
136 ///
137 /// When callback is called, it is guaranteed that now() will return a value greater or equal than timestamp.
138 ///
139 /// Only one alarm can be active at a time for each AlarmHandle. This overwrites any previously-set alarm if any.
140 fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool;
141}
142
143extern "Rust" {
144 fn _embassy_time_now() -> u64;
145 fn _embassy_time_allocate_alarm() -> Option<AlarmHandle>;
146 fn _embassy_time_set_alarm_callback(alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ());
147 fn _embassy_time_set_alarm(alarm: AlarmHandle, timestamp: u64) -> bool;
148}
149
150/// See [`Driver::now`]
151pub fn now() -> u64 {
152 unsafe { _embassy_time_now() }
153}
154
155/// See [`Driver::allocate_alarm`]
156///
157/// Safety: it is UB to make the alarm fire before setting a callback.
158pub unsafe fn allocate_alarm() -> Option<AlarmHandle> {
159 _embassy_time_allocate_alarm()
160}
161
162/// See [`Driver::set_alarm_callback`]
163pub fn set_alarm_callback(alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
164 unsafe { _embassy_time_set_alarm_callback(alarm, callback, ctx) }
165}
166
167/// See [`Driver::set_alarm`]
168pub fn set_alarm(alarm: AlarmHandle, timestamp: u64) -> bool {
169 unsafe { _embassy_time_set_alarm(alarm, timestamp) }
170}
171
172/// Set the time Driver implementation.
173///
174/// See the module documentation for an example.
175#[macro_export]
176macro_rules! time_driver_impl {
177 (static $name:ident: $t: ty = $val:expr) => {
178 static $name: $t = $val;
179
180 #[no_mangle]
181 fn _embassy_time_now() -> u64 {
182 <$t as $crate::Driver>::now(&$name)
183 }
184
185 #[no_mangle]
186 unsafe fn _embassy_time_allocate_alarm() -> Option<$crate::AlarmHandle> {
187 <$t as $crate::Driver>::allocate_alarm(&$name)
188 }
189
190 #[no_mangle]
191 fn _embassy_time_set_alarm_callback(alarm: $crate::AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
192 <$t as $crate::Driver>::set_alarm_callback(&$name, alarm, callback, ctx)
193 }
194
195 #[no_mangle]
196 fn _embassy_time_set_alarm(alarm: $crate::AlarmHandle, timestamp: u64) -> bool {
197 <$t as $crate::Driver>::set_alarm(&$name, alarm, timestamp)
198 }
199 };
200}
diff --git a/embassy-time-driver/src/tick.rs b/embassy-time-driver/src/tick.rs
new file mode 100644
index 000000000..916ae9498
--- /dev/null
+++ b/embassy-time-driver/src/tick.rs
@@ -0,0 +1,482 @@
1// Generated by gen_tick.py. DO NOT EDIT.
2
3#[cfg(feature = "tick-hz-1")]
4pub const TICK_HZ: u64 = 1;
5#[cfg(feature = "tick-hz-2")]
6pub const TICK_HZ: u64 = 2;
7#[cfg(feature = "tick-hz-4")]
8pub const TICK_HZ: u64 = 4;
9#[cfg(feature = "tick-hz-8")]
10pub const TICK_HZ: u64 = 8;
11#[cfg(feature = "tick-hz-10")]
12pub const TICK_HZ: u64 = 10;
13#[cfg(feature = "tick-hz-16")]
14pub const TICK_HZ: u64 = 16;
15#[cfg(feature = "tick-hz-32")]
16pub const TICK_HZ: u64 = 32;
17#[cfg(feature = "tick-hz-64")]
18pub const TICK_HZ: u64 = 64;
19#[cfg(feature = "tick-hz-100")]
20pub const TICK_HZ: u64 = 100;
21#[cfg(feature = "tick-hz-128")]
22pub const TICK_HZ: u64 = 128;
23#[cfg(feature = "tick-hz-256")]
24pub const TICK_HZ: u64 = 256;
25#[cfg(feature = "tick-hz-512")]
26pub const TICK_HZ: u64 = 512;
27#[cfg(feature = "tick-hz-1_000")]
28pub const TICK_HZ: u64 = 1_000;
29#[cfg(feature = "tick-hz-1_024")]
30pub const TICK_HZ: u64 = 1_024;
31#[cfg(feature = "tick-hz-2_000")]
32pub const TICK_HZ: u64 = 2_000;
33#[cfg(feature = "tick-hz-2_048")]
34pub const TICK_HZ: u64 = 2_048;
35#[cfg(feature = "tick-hz-4_000")]
36pub const TICK_HZ: u64 = 4_000;
37#[cfg(feature = "tick-hz-4_096")]
38pub const TICK_HZ: u64 = 4_096;
39#[cfg(feature = "tick-hz-8_000")]
40pub const TICK_HZ: u64 = 8_000;
41#[cfg(feature = "tick-hz-8_192")]
42pub const TICK_HZ: u64 = 8_192;
43#[cfg(feature = "tick-hz-10_000")]
44pub const TICK_HZ: u64 = 10_000;
45#[cfg(feature = "tick-hz-16_000")]
46pub const TICK_HZ: u64 = 16_000;
47#[cfg(feature = "tick-hz-16_384")]
48pub const TICK_HZ: u64 = 16_384;
49#[cfg(feature = "tick-hz-20_000")]
50pub const TICK_HZ: u64 = 20_000;
51#[cfg(feature = "tick-hz-32_000")]
52pub const TICK_HZ: u64 = 32_000;
53#[cfg(feature = "tick-hz-32_768")]
54pub const TICK_HZ: u64 = 32_768;
55#[cfg(feature = "tick-hz-40_000")]
56pub const TICK_HZ: u64 = 40_000;
57#[cfg(feature = "tick-hz-64_000")]
58pub const TICK_HZ: u64 = 64_000;
59#[cfg(feature = "tick-hz-65_536")]
60pub const TICK_HZ: u64 = 65_536;
61#[cfg(feature = "tick-hz-80_000")]
62pub const TICK_HZ: u64 = 80_000;
63#[cfg(feature = "tick-hz-100_000")]
64pub const TICK_HZ: u64 = 100_000;
65#[cfg(feature = "tick-hz-128_000")]
66pub const TICK_HZ: u64 = 128_000;
67#[cfg(feature = "tick-hz-131_072")]
68pub const TICK_HZ: u64 = 131_072;
69#[cfg(feature = "tick-hz-160_000")]
70pub const TICK_HZ: u64 = 160_000;
71#[cfg(feature = "tick-hz-256_000")]
72pub const TICK_HZ: u64 = 256_000;
73#[cfg(feature = "tick-hz-262_144")]
74pub const TICK_HZ: u64 = 262_144;
75#[cfg(feature = "tick-hz-320_000")]
76pub const TICK_HZ: u64 = 320_000;
77#[cfg(feature = "tick-hz-512_000")]
78pub const TICK_HZ: u64 = 512_000;
79#[cfg(feature = "tick-hz-524_288")]
80pub const TICK_HZ: u64 = 524_288;
81#[cfg(feature = "tick-hz-640_000")]
82pub const TICK_HZ: u64 = 640_000;
83#[cfg(feature = "tick-hz-1_000_000")]
84pub const TICK_HZ: u64 = 1_000_000;
85#[cfg(feature = "tick-hz-1_024_000")]
86pub const TICK_HZ: u64 = 1_024_000;
87#[cfg(feature = "tick-hz-1_048_576")]
88pub const TICK_HZ: u64 = 1_048_576;
89#[cfg(feature = "tick-hz-1_280_000")]
90pub const TICK_HZ: u64 = 1_280_000;
91#[cfg(feature = "tick-hz-2_000_000")]
92pub const TICK_HZ: u64 = 2_000_000;
93#[cfg(feature = "tick-hz-2_048_000")]
94pub const TICK_HZ: u64 = 2_048_000;
95#[cfg(feature = "tick-hz-2_097_152")]
96pub const TICK_HZ: u64 = 2_097_152;
97#[cfg(feature = "tick-hz-2_560_000")]
98pub const TICK_HZ: u64 = 2_560_000;
99#[cfg(feature = "tick-hz-3_000_000")]
100pub const TICK_HZ: u64 = 3_000_000;
101#[cfg(feature = "tick-hz-4_000_000")]
102pub const TICK_HZ: u64 = 4_000_000;
103#[cfg(feature = "tick-hz-4_096_000")]
104pub const TICK_HZ: u64 = 4_096_000;
105#[cfg(feature = "tick-hz-4_194_304")]
106pub const TICK_HZ: u64 = 4_194_304;
107#[cfg(feature = "tick-hz-5_120_000")]
108pub const TICK_HZ: u64 = 5_120_000;
109#[cfg(feature = "tick-hz-6_000_000")]
110pub const TICK_HZ: u64 = 6_000_000;
111#[cfg(feature = "tick-hz-8_000_000")]
112pub const TICK_HZ: u64 = 8_000_000;
113#[cfg(feature = "tick-hz-8_192_000")]
114pub const TICK_HZ: u64 = 8_192_000;
115#[cfg(feature = "tick-hz-8_388_608")]
116pub const TICK_HZ: u64 = 8_388_608;
117#[cfg(feature = "tick-hz-9_000_000")]
118pub const TICK_HZ: u64 = 9_000_000;
119#[cfg(feature = "tick-hz-10_000_000")]
120pub const TICK_HZ: u64 = 10_000_000;
121#[cfg(feature = "tick-hz-10_240_000")]
122pub const TICK_HZ: u64 = 10_240_000;
123#[cfg(feature = "tick-hz-12_000_000")]
124pub const TICK_HZ: u64 = 12_000_000;
125#[cfg(feature = "tick-hz-16_000_000")]
126pub const TICK_HZ: u64 = 16_000_000;
127#[cfg(feature = "tick-hz-16_384_000")]
128pub const TICK_HZ: u64 = 16_384_000;
129#[cfg(feature = "tick-hz-16_777_216")]
130pub const TICK_HZ: u64 = 16_777_216;
131#[cfg(feature = "tick-hz-18_000_000")]
132pub const TICK_HZ: u64 = 18_000_000;
133#[cfg(feature = "tick-hz-20_000_000")]
134pub const TICK_HZ: u64 = 20_000_000;
135#[cfg(feature = "tick-hz-20_480_000")]
136pub const TICK_HZ: u64 = 20_480_000;
137#[cfg(feature = "tick-hz-24_000_000")]
138pub const TICK_HZ: u64 = 24_000_000;
139#[cfg(feature = "tick-hz-30_000_000")]
140pub const TICK_HZ: u64 = 30_000_000;
141#[cfg(feature = "tick-hz-32_000_000")]
142pub const TICK_HZ: u64 = 32_000_000;
143#[cfg(feature = "tick-hz-32_768_000")]
144pub const TICK_HZ: u64 = 32_768_000;
145#[cfg(feature = "tick-hz-36_000_000")]
146pub const TICK_HZ: u64 = 36_000_000;
147#[cfg(feature = "tick-hz-40_000_000")]
148pub const TICK_HZ: u64 = 40_000_000;
149#[cfg(feature = "tick-hz-40_960_000")]
150pub const TICK_HZ: u64 = 40_960_000;
151#[cfg(feature = "tick-hz-48_000_000")]
152pub const TICK_HZ: u64 = 48_000_000;
153#[cfg(feature = "tick-hz-50_000_000")]
154pub const TICK_HZ: u64 = 50_000_000;
155#[cfg(feature = "tick-hz-60_000_000")]
156pub const TICK_HZ: u64 = 60_000_000;
157#[cfg(feature = "tick-hz-64_000_000")]
158pub const TICK_HZ: u64 = 64_000_000;
159#[cfg(feature = "tick-hz-65_536_000")]
160pub const TICK_HZ: u64 = 65_536_000;
161#[cfg(feature = "tick-hz-70_000_000")]
162pub const TICK_HZ: u64 = 70_000_000;
163#[cfg(feature = "tick-hz-72_000_000")]
164pub const TICK_HZ: u64 = 72_000_000;
165#[cfg(feature = "tick-hz-80_000_000")]
166pub const TICK_HZ: u64 = 80_000_000;
167#[cfg(feature = "tick-hz-81_920_000")]
168pub const TICK_HZ: u64 = 81_920_000;
169#[cfg(feature = "tick-hz-90_000_000")]
170pub const TICK_HZ: u64 = 90_000_000;
171#[cfg(feature = "tick-hz-96_000_000")]
172pub const TICK_HZ: u64 = 96_000_000;
173#[cfg(feature = "tick-hz-100_000_000")]
174pub const TICK_HZ: u64 = 100_000_000;
175#[cfg(feature = "tick-hz-110_000_000")]
176pub const TICK_HZ: u64 = 110_000_000;
177#[cfg(feature = "tick-hz-120_000_000")]
178pub const TICK_HZ: u64 = 120_000_000;
179#[cfg(feature = "tick-hz-128_000_000")]
180pub const TICK_HZ: u64 = 128_000_000;
181#[cfg(feature = "tick-hz-130_000_000")]
182pub const TICK_HZ: u64 = 130_000_000;
183#[cfg(feature = "tick-hz-131_072_000")]
184pub const TICK_HZ: u64 = 131_072_000;
185#[cfg(feature = "tick-hz-140_000_000")]
186pub const TICK_HZ: u64 = 140_000_000;
187#[cfg(feature = "tick-hz-144_000_000")]
188pub const TICK_HZ: u64 = 144_000_000;
189#[cfg(feature = "tick-hz-150_000_000")]
190pub const TICK_HZ: u64 = 150_000_000;
191#[cfg(feature = "tick-hz-160_000_000")]
192pub const TICK_HZ: u64 = 160_000_000;
193#[cfg(feature = "tick-hz-163_840_000")]
194pub const TICK_HZ: u64 = 163_840_000;
195#[cfg(feature = "tick-hz-170_000_000")]
196pub const TICK_HZ: u64 = 170_000_000;
197#[cfg(feature = "tick-hz-180_000_000")]
198pub const TICK_HZ: u64 = 180_000_000;
199#[cfg(feature = "tick-hz-190_000_000")]
200pub const TICK_HZ: u64 = 190_000_000;
201#[cfg(feature = "tick-hz-192_000_000")]
202pub const TICK_HZ: u64 = 192_000_000;
203#[cfg(feature = "tick-hz-200_000_000")]
204pub const TICK_HZ: u64 = 200_000_000;
205#[cfg(feature = "tick-hz-210_000_000")]
206pub const TICK_HZ: u64 = 210_000_000;
207#[cfg(feature = "tick-hz-220_000_000")]
208pub const TICK_HZ: u64 = 220_000_000;
209#[cfg(feature = "tick-hz-230_000_000")]
210pub const TICK_HZ: u64 = 230_000_000;
211#[cfg(feature = "tick-hz-240_000_000")]
212pub const TICK_HZ: u64 = 240_000_000;
213#[cfg(feature = "tick-hz-250_000_000")]
214pub const TICK_HZ: u64 = 250_000_000;
215#[cfg(feature = "tick-hz-256_000_000")]
216pub const TICK_HZ: u64 = 256_000_000;
217#[cfg(feature = "tick-hz-260_000_000")]
218pub const TICK_HZ: u64 = 260_000_000;
219#[cfg(feature = "tick-hz-262_144_000")]
220pub const TICK_HZ: u64 = 262_144_000;
221#[cfg(feature = "tick-hz-270_000_000")]
222pub const TICK_HZ: u64 = 270_000_000;
223#[cfg(feature = "tick-hz-280_000_000")]
224pub const TICK_HZ: u64 = 280_000_000;
225#[cfg(feature = "tick-hz-288_000_000")]
226pub const TICK_HZ: u64 = 288_000_000;
227#[cfg(feature = "tick-hz-290_000_000")]
228pub const TICK_HZ: u64 = 290_000_000;
229#[cfg(feature = "tick-hz-300_000_000")]
230pub const TICK_HZ: u64 = 300_000_000;
231#[cfg(feature = "tick-hz-320_000_000")]
232pub const TICK_HZ: u64 = 320_000_000;
233#[cfg(feature = "tick-hz-327_680_000")]
234pub const TICK_HZ: u64 = 327_680_000;
235#[cfg(feature = "tick-hz-340_000_000")]
236pub const TICK_HZ: u64 = 340_000_000;
237#[cfg(feature = "tick-hz-360_000_000")]
238pub const TICK_HZ: u64 = 360_000_000;
239#[cfg(feature = "tick-hz-380_000_000")]
240pub const TICK_HZ: u64 = 380_000_000;
241#[cfg(feature = "tick-hz-384_000_000")]
242pub const TICK_HZ: u64 = 384_000_000;
243#[cfg(feature = "tick-hz-400_000_000")]
244pub const TICK_HZ: u64 = 400_000_000;
245#[cfg(feature = "tick-hz-420_000_000")]
246pub const TICK_HZ: u64 = 420_000_000;
247#[cfg(feature = "tick-hz-440_000_000")]
248pub const TICK_HZ: u64 = 440_000_000;
249#[cfg(feature = "tick-hz-460_000_000")]
250pub const TICK_HZ: u64 = 460_000_000;
251#[cfg(feature = "tick-hz-480_000_000")]
252pub const TICK_HZ: u64 = 480_000_000;
253#[cfg(feature = "tick-hz-500_000_000")]
254pub const TICK_HZ: u64 = 500_000_000;
255#[cfg(feature = "tick-hz-512_000_000")]
256pub const TICK_HZ: u64 = 512_000_000;
257#[cfg(feature = "tick-hz-520_000_000")]
258pub const TICK_HZ: u64 = 520_000_000;
259#[cfg(feature = "tick-hz-524_288_000")]
260pub const TICK_HZ: u64 = 524_288_000;
261#[cfg(feature = "tick-hz-540_000_000")]
262pub const TICK_HZ: u64 = 540_000_000;
263#[cfg(feature = "tick-hz-560_000_000")]
264pub const TICK_HZ: u64 = 560_000_000;
265#[cfg(feature = "tick-hz-576_000_000")]
266pub const TICK_HZ: u64 = 576_000_000;
267#[cfg(feature = "tick-hz-580_000_000")]
268pub const TICK_HZ: u64 = 580_000_000;
269#[cfg(feature = "tick-hz-600_000_000")]
270pub const TICK_HZ: u64 = 600_000_000;
271#[cfg(feature = "tick-hz-620_000_000")]
272pub const TICK_HZ: u64 = 620_000_000;
273#[cfg(feature = "tick-hz-640_000_000")]
274pub const TICK_HZ: u64 = 640_000_000;
275#[cfg(feature = "tick-hz-655_360_000")]
276pub const TICK_HZ: u64 = 655_360_000;
277#[cfg(feature = "tick-hz-660_000_000")]
278pub const TICK_HZ: u64 = 660_000_000;
279#[cfg(feature = "tick-hz-680_000_000")]
280pub const TICK_HZ: u64 = 680_000_000;
281#[cfg(feature = "tick-hz-700_000_000")]
282pub const TICK_HZ: u64 = 700_000_000;
283#[cfg(feature = "tick-hz-720_000_000")]
284pub const TICK_HZ: u64 = 720_000_000;
285#[cfg(feature = "tick-hz-740_000_000")]
286pub const TICK_HZ: u64 = 740_000_000;
287#[cfg(feature = "tick-hz-760_000_000")]
288pub const TICK_HZ: u64 = 760_000_000;
289#[cfg(feature = "tick-hz-768_000_000")]
290pub const TICK_HZ: u64 = 768_000_000;
291#[cfg(feature = "tick-hz-780_000_000")]
292pub const TICK_HZ: u64 = 780_000_000;
293#[cfg(feature = "tick-hz-800_000_000")]
294pub const TICK_HZ: u64 = 800_000_000;
295#[cfg(feature = "tick-hz-820_000_000")]
296pub const TICK_HZ: u64 = 820_000_000;
297#[cfg(feature = "tick-hz-840_000_000")]
298pub const TICK_HZ: u64 = 840_000_000;
299#[cfg(feature = "tick-hz-860_000_000")]
300pub const TICK_HZ: u64 = 860_000_000;
301#[cfg(feature = "tick-hz-880_000_000")]
302pub const TICK_HZ: u64 = 880_000_000;
303#[cfg(feature = "tick-hz-900_000_000")]
304pub const TICK_HZ: u64 = 900_000_000;
305#[cfg(feature = "tick-hz-920_000_000")]
306pub const TICK_HZ: u64 = 920_000_000;
307#[cfg(feature = "tick-hz-940_000_000")]
308pub const TICK_HZ: u64 = 940_000_000;
309#[cfg(feature = "tick-hz-960_000_000")]
310pub const TICK_HZ: u64 = 960_000_000;
311#[cfg(feature = "tick-hz-980_000_000")]
312pub const TICK_HZ: u64 = 980_000_000;
313#[cfg(feature = "tick-hz-1_000_000_000")]
314pub const TICK_HZ: u64 = 1_000_000_000;
315#[cfg(feature = "tick-hz-1_310_720_000")]
316pub const TICK_HZ: u64 = 1_310_720_000;
317#[cfg(feature = "tick-hz-2_621_440_000")]
318pub const TICK_HZ: u64 = 2_621_440_000;
319#[cfg(feature = "tick-hz-5_242_880_000")]
320pub const TICK_HZ: u64 = 5_242_880_000;
321#[cfg(not(any(
322 feature = "tick-hz-1",
323 feature = "tick-hz-2",
324 feature = "tick-hz-4",
325 feature = "tick-hz-8",
326 feature = "tick-hz-10",
327 feature = "tick-hz-16",
328 feature = "tick-hz-32",
329 feature = "tick-hz-64",
330 feature = "tick-hz-100",
331 feature = "tick-hz-128",
332 feature = "tick-hz-256",
333 feature = "tick-hz-512",
334 feature = "tick-hz-1_000",
335 feature = "tick-hz-1_024",
336 feature = "tick-hz-2_000",
337 feature = "tick-hz-2_048",
338 feature = "tick-hz-4_000",
339 feature = "tick-hz-4_096",
340 feature = "tick-hz-8_000",
341 feature = "tick-hz-8_192",
342 feature = "tick-hz-10_000",
343 feature = "tick-hz-16_000",
344 feature = "tick-hz-16_384",
345 feature = "tick-hz-20_000",
346 feature = "tick-hz-32_000",
347 feature = "tick-hz-32_768",
348 feature = "tick-hz-40_000",
349 feature = "tick-hz-64_000",
350 feature = "tick-hz-65_536",
351 feature = "tick-hz-80_000",
352 feature = "tick-hz-100_000",
353 feature = "tick-hz-128_000",
354 feature = "tick-hz-131_072",
355 feature = "tick-hz-160_000",
356 feature = "tick-hz-256_000",
357 feature = "tick-hz-262_144",
358 feature = "tick-hz-320_000",
359 feature = "tick-hz-512_000",
360 feature = "tick-hz-524_288",
361 feature = "tick-hz-640_000",
362 feature = "tick-hz-1_000_000",
363 feature = "tick-hz-1_024_000",
364 feature = "tick-hz-1_048_576",
365 feature = "tick-hz-1_280_000",
366 feature = "tick-hz-2_000_000",
367 feature = "tick-hz-2_048_000",
368 feature = "tick-hz-2_097_152",
369 feature = "tick-hz-2_560_000",
370 feature = "tick-hz-3_000_000",
371 feature = "tick-hz-4_000_000",
372 feature = "tick-hz-4_096_000",
373 feature = "tick-hz-4_194_304",
374 feature = "tick-hz-5_120_000",
375 feature = "tick-hz-6_000_000",
376 feature = "tick-hz-8_000_000",
377 feature = "tick-hz-8_192_000",
378 feature = "tick-hz-8_388_608",
379 feature = "tick-hz-9_000_000",
380 feature = "tick-hz-10_000_000",
381 feature = "tick-hz-10_240_000",
382 feature = "tick-hz-12_000_000",
383 feature = "tick-hz-16_000_000",
384 feature = "tick-hz-16_384_000",
385 feature = "tick-hz-16_777_216",
386 feature = "tick-hz-18_000_000",
387 feature = "tick-hz-20_000_000",
388 feature = "tick-hz-20_480_000",
389 feature = "tick-hz-24_000_000",
390 feature = "tick-hz-30_000_000",
391 feature = "tick-hz-32_000_000",
392 feature = "tick-hz-32_768_000",
393 feature = "tick-hz-36_000_000",
394 feature = "tick-hz-40_000_000",
395 feature = "tick-hz-40_960_000",
396 feature = "tick-hz-48_000_000",
397 feature = "tick-hz-50_000_000",
398 feature = "tick-hz-60_000_000",
399 feature = "tick-hz-64_000_000",
400 feature = "tick-hz-65_536_000",
401 feature = "tick-hz-70_000_000",
402 feature = "tick-hz-72_000_000",
403 feature = "tick-hz-80_000_000",
404 feature = "tick-hz-81_920_000",
405 feature = "tick-hz-90_000_000",
406 feature = "tick-hz-96_000_000",
407 feature = "tick-hz-100_000_000",
408 feature = "tick-hz-110_000_000",
409 feature = "tick-hz-120_000_000",
410 feature = "tick-hz-128_000_000",
411 feature = "tick-hz-130_000_000",
412 feature = "tick-hz-131_072_000",
413 feature = "tick-hz-140_000_000",
414 feature = "tick-hz-144_000_000",
415 feature = "tick-hz-150_000_000",
416 feature = "tick-hz-160_000_000",
417 feature = "tick-hz-163_840_000",
418 feature = "tick-hz-170_000_000",
419 feature = "tick-hz-180_000_000",
420 feature = "tick-hz-190_000_000",
421 feature = "tick-hz-192_000_000",
422 feature = "tick-hz-200_000_000",
423 feature = "tick-hz-210_000_000",
424 feature = "tick-hz-220_000_000",
425 feature = "tick-hz-230_000_000",
426 feature = "tick-hz-240_000_000",
427 feature = "tick-hz-250_000_000",
428 feature = "tick-hz-256_000_000",
429 feature = "tick-hz-260_000_000",
430 feature = "tick-hz-262_144_000",
431 feature = "tick-hz-270_000_000",
432 feature = "tick-hz-280_000_000",
433 feature = "tick-hz-288_000_000",
434 feature = "tick-hz-290_000_000",
435 feature = "tick-hz-300_000_000",
436 feature = "tick-hz-320_000_000",
437 feature = "tick-hz-327_680_000",
438 feature = "tick-hz-340_000_000",
439 feature = "tick-hz-360_000_000",
440 feature = "tick-hz-380_000_000",
441 feature = "tick-hz-384_000_000",
442 feature = "tick-hz-400_000_000",
443 feature = "tick-hz-420_000_000",
444 feature = "tick-hz-440_000_000",
445 feature = "tick-hz-460_000_000",
446 feature = "tick-hz-480_000_000",
447 feature = "tick-hz-500_000_000",
448 feature = "tick-hz-512_000_000",
449 feature = "tick-hz-520_000_000",
450 feature = "tick-hz-524_288_000",
451 feature = "tick-hz-540_000_000",
452 feature = "tick-hz-560_000_000",
453 feature = "tick-hz-576_000_000",
454 feature = "tick-hz-580_000_000",
455 feature = "tick-hz-600_000_000",
456 feature = "tick-hz-620_000_000",
457 feature = "tick-hz-640_000_000",
458 feature = "tick-hz-655_360_000",
459 feature = "tick-hz-660_000_000",
460 feature = "tick-hz-680_000_000",
461 feature = "tick-hz-700_000_000",
462 feature = "tick-hz-720_000_000",
463 feature = "tick-hz-740_000_000",
464 feature = "tick-hz-760_000_000",
465 feature = "tick-hz-768_000_000",
466 feature = "tick-hz-780_000_000",
467 feature = "tick-hz-800_000_000",
468 feature = "tick-hz-820_000_000",
469 feature = "tick-hz-840_000_000",
470 feature = "tick-hz-860_000_000",
471 feature = "tick-hz-880_000_000",
472 feature = "tick-hz-900_000_000",
473 feature = "tick-hz-920_000_000",
474 feature = "tick-hz-940_000_000",
475 feature = "tick-hz-960_000_000",
476 feature = "tick-hz-980_000_000",
477 feature = "tick-hz-1_000_000_000",
478 feature = "tick-hz-1_310_720_000",
479 feature = "tick-hz-2_621_440_000",
480 feature = "tick-hz-5_242_880_000",
481)))]
482pub const TICK_HZ: u64 = 1_000_000;