aboutsummaryrefslogtreecommitdiff
path: root/embassy-time/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/src
parentdcffad6b05a06bc5f4d09a35184d5ffe158e02cf (diff)
time: split driver into a separate embassy-time-driver crate.
Diffstat (limited to 'embassy-time/src')
-rw-r--r--embassy-time/src/driver.rs186
-rw-r--r--embassy-time/src/driver_mock.rs2
-rw-r--r--embassy-time/src/driver_std.rs2
-rw-r--r--embassy-time/src/driver_wasm.rs2
-rw-r--r--embassy-time/src/lib.rs10
-rw-r--r--embassy-time/src/tick.rs482
6 files changed, 6 insertions, 678 deletions
diff --git a/embassy-time/src/driver.rs b/embassy-time/src/driver.rs
deleted file mode 100644
index f966386b7..000000000
--- a/embassy-time/src/driver.rs
+++ /dev/null
@@ -1,186 +0,0 @@
1//! Time driver interface
2//!
3//! This module defines the interface a driver needs to implement to power the `embassy_time` module.
4//!
5//! # Implementing a driver
6//!
7//! - Define a struct `MyDriver`
8//! - Implement [`Driver`] for it
9//! - Register it as the global driver with [`time_driver_impl`](crate::time_driver_impl).
10//! - Enable the Cargo feature `embassy-executor/time`
11//!
12//! If your driver has a single set tick rate, enable the corresponding [`tick-hz-*`](crate#tick-rate) feature,
13//! which will prevent users from needing to configure it themselves (or selecting an incorrect configuration).
14//!
15//! If your driver supports a small number of set tick rates, expose your own cargo features and have each one
16//! enable the corresponding `embassy-time/tick-*`.
17//!
18//! Otherwise, don’t enable any `tick-hz-*` feature to let the user configure the tick rate themselves by
19//! enabling a feature on `embassy-time`.
20//!
21//! # Linkage details
22//!
23//! Instead of the usual "trait + generic params" approach, calls from embassy to the driver are done via `extern` functions.
24//!
25//! `embassy` internally defines the driver functions as `extern "Rust" { fn _embassy_time_now() -> u64; }` and calls them.
26//! The driver crate defines the functions as `#[no_mangle] fn _embassy_time_now() -> u64`. The linker will resolve the
27//! calls from the `embassy` crate to call into the driver crate.
28//!
29//! If there is none or multiple drivers in the crate tree, linking will fail.
30//!
31//! This method has a few key advantages for something as foundational as timekeeping:
32//!
33//! - The time driver is available everywhere easily, without having to thread the implementation
34//! through generic parameters. This is especially helpful for libraries.
35//! - It means comparing `Instant`s will always make sense: if there were multiple drivers
36//! active, one could compare an `Instant` from driver A to an `Instant` from driver B, which
37//! would yield incorrect results.
38//!
39//! # Example
40//!
41//! ```
42//! use embassy_time::driver::{Driver, AlarmHandle};
43//!
44//! struct MyDriver{} // not public!
45//!
46//! impl Driver for MyDriver {
47//! fn now(&self) -> u64 {
48//! todo!()
49//! }
50//! unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> {
51//! todo!()
52//! }
53//! fn set_alarm_callback(&self, alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
54//! todo!()
55//! }
56//! fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool {
57//! todo!()
58//! }
59//! }
60//! ```
61//! ```ignore
62//! embassy_time::time_driver_impl!(static DRIVER: MyDriver = MyDriver{});
63//! ```
64
65/// Alarm handle, assigned by the driver.
66#[derive(Clone, Copy)]
67pub struct AlarmHandle {
68 id: u8,
69}
70
71impl AlarmHandle {
72 /// Create an AlarmHandle
73 ///
74 /// Safety: May only be called by the current global Driver impl.
75 /// The impl is allowed to rely on the fact that all `AlarmHandle` instances
76 /// are created by itself in unsafe code (e.g. indexing operations)
77 pub unsafe fn new(id: u8) -> Self {
78 Self { id }
79 }
80
81 /// Get the ID of the AlarmHandle.
82 pub fn id(&self) -> u8 {
83 self.id
84 }
85}
86
87/// Time driver
88pub trait Driver: Send + Sync + 'static {
89 /// Return the current timestamp in ticks.
90 ///
91 /// Implementations MUST ensure that:
92 /// - This is guaranteed to be monotonic, i.e. a call to now() will always return
93 /// a greater or equal value than earler calls. Time can't "roll backwards".
94 /// - It "never" overflows. It must not overflow in a sufficiently long time frame, say
95 /// in 10_000 years (Human civilization is likely to already have self-destructed
96 /// 10_000 years from now.). This means if your hardware only has 16bit/32bit timers
97 /// you MUST extend them to 64-bit, for example by counting overflows in software,
98 /// or chaining multiple timers together.
99 fn now(&self) -> u64;
100
101 /// Try allocating an alarm handle. Returns None if no alarms left.
102 /// Initially the alarm has no callback set, and a null `ctx` pointer.
103 ///
104 /// # Safety
105 /// It is UB to make the alarm fire before setting a callback.
106 unsafe fn allocate_alarm(&self) -> Option<AlarmHandle>;
107
108 /// Sets the callback function to be called when the alarm triggers.
109 /// The callback may be called from any context (interrupt or thread mode).
110 fn set_alarm_callback(&self, alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ());
111
112 /// Sets an alarm at the given timestamp. When the current timestamp reaches the alarm
113 /// timestamp, the provided callback function will be called.
114 ///
115 /// The `Driver` implementation should guarantee that the alarm callback is never called synchronously from `set_alarm`.
116 /// Rather - if `timestamp` is already in the past - `false` should be returned and alarm should not be set,
117 /// or alternatively, the driver should return `true` and arrange to call the alarm callback as soon as possible, but not synchronously.
118 /// 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
119 /// 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`
120 /// should also be returned to indicate that the callback may have been called already by the alarm, but it is not guaranteed, so the
121 /// caller should also call the callback, just like in the more common `false` case. (Note: This requires idempotency of the callback.)
122 ///
123 /// When callback is called, it is guaranteed that now() will return a value greater or equal than timestamp.
124 ///
125 /// Only one alarm can be active at a time for each AlarmHandle. This overwrites any previously-set alarm if any.
126 fn set_alarm(&self, alarm: AlarmHandle, timestamp: u64) -> bool;
127}
128
129extern "Rust" {
130 fn _embassy_time_now() -> u64;
131 fn _embassy_time_allocate_alarm() -> Option<AlarmHandle>;
132 fn _embassy_time_set_alarm_callback(alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ());
133 fn _embassy_time_set_alarm(alarm: AlarmHandle, timestamp: u64) -> bool;
134}
135
136/// See [`Driver::now`]
137pub fn now() -> u64 {
138 unsafe { _embassy_time_now() }
139}
140
141/// See [`Driver::allocate_alarm`]
142///
143/// Safety: it is UB to make the alarm fire before setting a callback.
144pub unsafe fn allocate_alarm() -> Option<AlarmHandle> {
145 _embassy_time_allocate_alarm()
146}
147
148/// See [`Driver::set_alarm_callback`]
149pub fn set_alarm_callback(alarm: AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
150 unsafe { _embassy_time_set_alarm_callback(alarm, callback, ctx) }
151}
152
153/// See [`Driver::set_alarm`]
154pub fn set_alarm(alarm: AlarmHandle, timestamp: u64) -> bool {
155 unsafe { _embassy_time_set_alarm(alarm, timestamp) }
156}
157
158/// Set the time Driver implementation.
159///
160/// See the module documentation for an example.
161#[macro_export]
162macro_rules! time_driver_impl {
163 (static $name:ident: $t: ty = $val:expr) => {
164 static $name: $t = $val;
165
166 #[no_mangle]
167 fn _embassy_time_now() -> u64 {
168 <$t as $crate::driver::Driver>::now(&$name)
169 }
170
171 #[no_mangle]
172 unsafe fn _embassy_time_allocate_alarm() -> Option<$crate::driver::AlarmHandle> {
173 <$t as $crate::driver::Driver>::allocate_alarm(&$name)
174 }
175
176 #[no_mangle]
177 fn _embassy_time_set_alarm_callback(alarm: $crate::driver::AlarmHandle, callback: fn(*mut ()), ctx: *mut ()) {
178 <$t as $crate::driver::Driver>::set_alarm_callback(&$name, alarm, callback, ctx)
179 }
180
181 #[no_mangle]
182 fn _embassy_time_set_alarm(alarm: $crate::driver::AlarmHandle, timestamp: u64) -> bool {
183 <$t as $crate::driver::Driver>::set_alarm(&$name, alarm, timestamp)
184 }
185 };
186}
diff --git a/embassy-time/src/driver_mock.rs b/embassy-time/src/driver_mock.rs
index 7533d51e5..7abc2bd70 100644
--- a/embassy-time/src/driver_mock.rs
+++ b/embassy-time/src/driver_mock.rs
@@ -28,7 +28,7 @@ use crate::{Duration, Instant};
28/// ``` 28/// ```
29pub struct MockDriver(CsMutex<RefCell<InnerMockDriver>>); 29pub struct MockDriver(CsMutex<RefCell<InnerMockDriver>>);
30 30
31crate::time_driver_impl!(static DRIVER: MockDriver = MockDriver::new()); 31crate::driver::time_driver_impl!(static DRIVER: MockDriver = MockDriver::new());
32 32
33impl MockDriver { 33impl MockDriver {
34 /// Creates a new mock driver. 34 /// Creates a new mock driver.
diff --git a/embassy-time/src/driver_std.rs b/embassy-time/src/driver_std.rs
index 32db47a37..3b5524f9e 100644
--- a/embassy-time/src/driver_std.rs
+++ b/embassy-time/src/driver_std.rs
@@ -45,7 +45,7 @@ struct TimeDriver {
45} 45}
46 46
47const ALARM_NEW: AlarmState = AlarmState::new(); 47const ALARM_NEW: AlarmState = AlarmState::new();
48crate::time_driver_impl!(static DRIVER: TimeDriver = TimeDriver { 48crate::driver::time_driver_impl!(static DRIVER: TimeDriver = TimeDriver {
49 alarm_count: AtomicU8::new(0), 49 alarm_count: AtomicU8::new(0),
50 50
51 once: Once::new(), 51 once: Once::new(),
diff --git a/embassy-time/src/driver_wasm.rs b/embassy-time/src/driver_wasm.rs
index 0f672dc75..d75856c26 100644
--- a/embassy-time/src/driver_wasm.rs
+++ b/embassy-time/src/driver_wasm.rs
@@ -42,7 +42,7 @@ struct TimeDriver {
42} 42}
43 43
44const ALARM_NEW: AlarmState = AlarmState::new(); 44const ALARM_NEW: AlarmState = AlarmState::new();
45crate::time_driver_impl!(static DRIVER: TimeDriver = TimeDriver { 45crate::driver::time_driver_impl!(static DRIVER: TimeDriver = TimeDriver {
46 alarm_count: AtomicU8::new(0), 46 alarm_count: AtomicU8::new(0),
47 once: Once::new(), 47 once: Once::new(),
48 alarms: UninitCell::uninit(), 48 alarms: UninitCell::uninit(),
diff --git a/embassy-time/src/lib.rs b/embassy-time/src/lib.rs
index 7e2546f68..3f8c09f1a 100644
--- a/embassy-time/src/lib.rs
+++ b/embassy-time/src/lib.rs
@@ -10,12 +10,12 @@
10// This mod MUST go first, so that the others see its macros. 10// This mod MUST go first, so that the others see its macros.
11pub(crate) mod fmt; 11pub(crate) mod fmt;
12 12
13pub use embassy_time_driver as driver;
14
13mod delay; 15mod delay;
14pub mod driver;
15mod duration; 16mod duration;
16mod instant; 17mod instant;
17pub mod queue; 18pub mod queue;
18mod tick;
19mod timer; 19mod timer;
20 20
21#[cfg(feature = "mock-driver")] 21#[cfg(feature = "mock-driver")]
@@ -32,15 +32,11 @@ mod driver_wasm;
32mod queue_generic; 32mod queue_generic;
33 33
34pub use delay::{block_for, Delay}; 34pub use delay::{block_for, Delay};
35pub use driver::TICK_HZ;
35pub use duration::Duration; 36pub use duration::Duration;
36pub use instant::Instant; 37pub use instant::Instant;
37pub use timer::{with_timeout, Ticker, TimeoutError, Timer}; 38pub use timer::{with_timeout, Ticker, TimeoutError, Timer};
38 39
39/// Ticks per second of the global timebase.
40///
41/// This value is specified by the [`tick-*` Cargo features](crate#tick-rate)
42pub const TICK_HZ: u64 = tick::TICK_HZ;
43
44const fn gcd(a: u64, b: u64) -> u64 { 40const fn gcd(a: u64, b: u64) -> u64 {
45 if b == 0 { 41 if b == 0 {
46 a 42 a
diff --git a/embassy-time/src/tick.rs b/embassy-time/src/tick.rs
deleted file mode 100644
index 916ae9498..000000000
--- a/embassy-time/src/tick.rs
+++ /dev/null
@@ -1,482 +0,0 @@
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;