diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-01-11 16:38:44 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-01-11 16:56:08 +0100 |
| commit | 15f94fb0fc70463b9a50c997083fee3f5758b17a (patch) | |
| tree | 17ccb5d369a9e7b0d2dbe0c7e39804b7f1f65458 /embassy-time-driver/src | |
| parent | dcffad6b05a06bc5f4d09a35184d5ffe158e02cf (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.rs | 200 | ||||
| -rw-r--r-- | embassy-time-driver/src/tick.rs | 482 |
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 | |||
| 72 | mod tick; | ||
| 73 | |||
| 74 | /// Ticks per second of the global timebase. | ||
| 75 | /// | ||
| 76 | /// This value is specified by the [`tick-*` Cargo features](crate#tick-rate) | ||
| 77 | pub const TICK_HZ: u64 = tick::TICK_HZ; | ||
| 78 | |||
| 79 | /// Alarm handle, assigned by the driver. | ||
| 80 | #[derive(Clone, Copy)] | ||
| 81 | pub struct AlarmHandle { | ||
| 82 | id: u8, | ||
| 83 | } | ||
| 84 | |||
| 85 | impl 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 | ||
| 102 | pub 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 | |||
| 143 | extern "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`] | ||
| 151 | pub 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. | ||
| 158 | pub unsafe fn allocate_alarm() -> Option<AlarmHandle> { | ||
| 159 | _embassy_time_allocate_alarm() | ||
| 160 | } | ||
| 161 | |||
| 162 | /// See [`Driver::set_alarm_callback`] | ||
| 163 | pub 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`] | ||
| 168 | pub 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] | ||
| 176 | macro_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")] | ||
| 4 | pub const TICK_HZ: u64 = 1; | ||
| 5 | #[cfg(feature = "tick-hz-2")] | ||
| 6 | pub const TICK_HZ: u64 = 2; | ||
| 7 | #[cfg(feature = "tick-hz-4")] | ||
| 8 | pub const TICK_HZ: u64 = 4; | ||
| 9 | #[cfg(feature = "tick-hz-8")] | ||
| 10 | pub const TICK_HZ: u64 = 8; | ||
| 11 | #[cfg(feature = "tick-hz-10")] | ||
| 12 | pub const TICK_HZ: u64 = 10; | ||
| 13 | #[cfg(feature = "tick-hz-16")] | ||
| 14 | pub const TICK_HZ: u64 = 16; | ||
| 15 | #[cfg(feature = "tick-hz-32")] | ||
| 16 | pub const TICK_HZ: u64 = 32; | ||
| 17 | #[cfg(feature = "tick-hz-64")] | ||
| 18 | pub const TICK_HZ: u64 = 64; | ||
| 19 | #[cfg(feature = "tick-hz-100")] | ||
| 20 | pub const TICK_HZ: u64 = 100; | ||
| 21 | #[cfg(feature = "tick-hz-128")] | ||
| 22 | pub const TICK_HZ: u64 = 128; | ||
| 23 | #[cfg(feature = "tick-hz-256")] | ||
| 24 | pub const TICK_HZ: u64 = 256; | ||
| 25 | #[cfg(feature = "tick-hz-512")] | ||
| 26 | pub const TICK_HZ: u64 = 512; | ||
| 27 | #[cfg(feature = "tick-hz-1_000")] | ||
| 28 | pub const TICK_HZ: u64 = 1_000; | ||
| 29 | #[cfg(feature = "tick-hz-1_024")] | ||
| 30 | pub const TICK_HZ: u64 = 1_024; | ||
| 31 | #[cfg(feature = "tick-hz-2_000")] | ||
| 32 | pub const TICK_HZ: u64 = 2_000; | ||
| 33 | #[cfg(feature = "tick-hz-2_048")] | ||
| 34 | pub const TICK_HZ: u64 = 2_048; | ||
| 35 | #[cfg(feature = "tick-hz-4_000")] | ||
| 36 | pub const TICK_HZ: u64 = 4_000; | ||
| 37 | #[cfg(feature = "tick-hz-4_096")] | ||
| 38 | pub const TICK_HZ: u64 = 4_096; | ||
| 39 | #[cfg(feature = "tick-hz-8_000")] | ||
| 40 | pub const TICK_HZ: u64 = 8_000; | ||
| 41 | #[cfg(feature = "tick-hz-8_192")] | ||
| 42 | pub const TICK_HZ: u64 = 8_192; | ||
| 43 | #[cfg(feature = "tick-hz-10_000")] | ||
| 44 | pub const TICK_HZ: u64 = 10_000; | ||
| 45 | #[cfg(feature = "tick-hz-16_000")] | ||
| 46 | pub const TICK_HZ: u64 = 16_000; | ||
| 47 | #[cfg(feature = "tick-hz-16_384")] | ||
| 48 | pub const TICK_HZ: u64 = 16_384; | ||
| 49 | #[cfg(feature = "tick-hz-20_000")] | ||
| 50 | pub const TICK_HZ: u64 = 20_000; | ||
| 51 | #[cfg(feature = "tick-hz-32_000")] | ||
| 52 | pub const TICK_HZ: u64 = 32_000; | ||
| 53 | #[cfg(feature = "tick-hz-32_768")] | ||
| 54 | pub const TICK_HZ: u64 = 32_768; | ||
| 55 | #[cfg(feature = "tick-hz-40_000")] | ||
| 56 | pub const TICK_HZ: u64 = 40_000; | ||
| 57 | #[cfg(feature = "tick-hz-64_000")] | ||
| 58 | pub const TICK_HZ: u64 = 64_000; | ||
| 59 | #[cfg(feature = "tick-hz-65_536")] | ||
| 60 | pub const TICK_HZ: u64 = 65_536; | ||
| 61 | #[cfg(feature = "tick-hz-80_000")] | ||
| 62 | pub const TICK_HZ: u64 = 80_000; | ||
| 63 | #[cfg(feature = "tick-hz-100_000")] | ||
| 64 | pub const TICK_HZ: u64 = 100_000; | ||
| 65 | #[cfg(feature = "tick-hz-128_000")] | ||
| 66 | pub const TICK_HZ: u64 = 128_000; | ||
| 67 | #[cfg(feature = "tick-hz-131_072")] | ||
| 68 | pub const TICK_HZ: u64 = 131_072; | ||
| 69 | #[cfg(feature = "tick-hz-160_000")] | ||
| 70 | pub const TICK_HZ: u64 = 160_000; | ||
| 71 | #[cfg(feature = "tick-hz-256_000")] | ||
| 72 | pub const TICK_HZ: u64 = 256_000; | ||
| 73 | #[cfg(feature = "tick-hz-262_144")] | ||
| 74 | pub const TICK_HZ: u64 = 262_144; | ||
| 75 | #[cfg(feature = "tick-hz-320_000")] | ||
| 76 | pub const TICK_HZ: u64 = 320_000; | ||
| 77 | #[cfg(feature = "tick-hz-512_000")] | ||
| 78 | pub const TICK_HZ: u64 = 512_000; | ||
| 79 | #[cfg(feature = "tick-hz-524_288")] | ||
| 80 | pub const TICK_HZ: u64 = 524_288; | ||
| 81 | #[cfg(feature = "tick-hz-640_000")] | ||
| 82 | pub const TICK_HZ: u64 = 640_000; | ||
| 83 | #[cfg(feature = "tick-hz-1_000_000")] | ||
| 84 | pub const TICK_HZ: u64 = 1_000_000; | ||
| 85 | #[cfg(feature = "tick-hz-1_024_000")] | ||
| 86 | pub const TICK_HZ: u64 = 1_024_000; | ||
| 87 | #[cfg(feature = "tick-hz-1_048_576")] | ||
| 88 | pub const TICK_HZ: u64 = 1_048_576; | ||
| 89 | #[cfg(feature = "tick-hz-1_280_000")] | ||
| 90 | pub const TICK_HZ: u64 = 1_280_000; | ||
| 91 | #[cfg(feature = "tick-hz-2_000_000")] | ||
| 92 | pub const TICK_HZ: u64 = 2_000_000; | ||
| 93 | #[cfg(feature = "tick-hz-2_048_000")] | ||
| 94 | pub const TICK_HZ: u64 = 2_048_000; | ||
| 95 | #[cfg(feature = "tick-hz-2_097_152")] | ||
| 96 | pub const TICK_HZ: u64 = 2_097_152; | ||
| 97 | #[cfg(feature = "tick-hz-2_560_000")] | ||
| 98 | pub const TICK_HZ: u64 = 2_560_000; | ||
| 99 | #[cfg(feature = "tick-hz-3_000_000")] | ||
| 100 | pub const TICK_HZ: u64 = 3_000_000; | ||
| 101 | #[cfg(feature = "tick-hz-4_000_000")] | ||
| 102 | pub const TICK_HZ: u64 = 4_000_000; | ||
| 103 | #[cfg(feature = "tick-hz-4_096_000")] | ||
| 104 | pub const TICK_HZ: u64 = 4_096_000; | ||
| 105 | #[cfg(feature = "tick-hz-4_194_304")] | ||
| 106 | pub const TICK_HZ: u64 = 4_194_304; | ||
| 107 | #[cfg(feature = "tick-hz-5_120_000")] | ||
| 108 | pub const TICK_HZ: u64 = 5_120_000; | ||
| 109 | #[cfg(feature = "tick-hz-6_000_000")] | ||
| 110 | pub const TICK_HZ: u64 = 6_000_000; | ||
| 111 | #[cfg(feature = "tick-hz-8_000_000")] | ||
| 112 | pub const TICK_HZ: u64 = 8_000_000; | ||
| 113 | #[cfg(feature = "tick-hz-8_192_000")] | ||
| 114 | pub const TICK_HZ: u64 = 8_192_000; | ||
| 115 | #[cfg(feature = "tick-hz-8_388_608")] | ||
| 116 | pub const TICK_HZ: u64 = 8_388_608; | ||
| 117 | #[cfg(feature = "tick-hz-9_000_000")] | ||
| 118 | pub const TICK_HZ: u64 = 9_000_000; | ||
| 119 | #[cfg(feature = "tick-hz-10_000_000")] | ||
| 120 | pub const TICK_HZ: u64 = 10_000_000; | ||
| 121 | #[cfg(feature = "tick-hz-10_240_000")] | ||
| 122 | pub const TICK_HZ: u64 = 10_240_000; | ||
| 123 | #[cfg(feature = "tick-hz-12_000_000")] | ||
| 124 | pub const TICK_HZ: u64 = 12_000_000; | ||
| 125 | #[cfg(feature = "tick-hz-16_000_000")] | ||
| 126 | pub const TICK_HZ: u64 = 16_000_000; | ||
| 127 | #[cfg(feature = "tick-hz-16_384_000")] | ||
| 128 | pub const TICK_HZ: u64 = 16_384_000; | ||
| 129 | #[cfg(feature = "tick-hz-16_777_216")] | ||
| 130 | pub const TICK_HZ: u64 = 16_777_216; | ||
| 131 | #[cfg(feature = "tick-hz-18_000_000")] | ||
| 132 | pub const TICK_HZ: u64 = 18_000_000; | ||
| 133 | #[cfg(feature = "tick-hz-20_000_000")] | ||
| 134 | pub const TICK_HZ: u64 = 20_000_000; | ||
| 135 | #[cfg(feature = "tick-hz-20_480_000")] | ||
| 136 | pub const TICK_HZ: u64 = 20_480_000; | ||
| 137 | #[cfg(feature = "tick-hz-24_000_000")] | ||
| 138 | pub const TICK_HZ: u64 = 24_000_000; | ||
| 139 | #[cfg(feature = "tick-hz-30_000_000")] | ||
| 140 | pub const TICK_HZ: u64 = 30_000_000; | ||
| 141 | #[cfg(feature = "tick-hz-32_000_000")] | ||
| 142 | pub const TICK_HZ: u64 = 32_000_000; | ||
| 143 | #[cfg(feature = "tick-hz-32_768_000")] | ||
| 144 | pub const TICK_HZ: u64 = 32_768_000; | ||
| 145 | #[cfg(feature = "tick-hz-36_000_000")] | ||
| 146 | pub const TICK_HZ: u64 = 36_000_000; | ||
| 147 | #[cfg(feature = "tick-hz-40_000_000")] | ||
| 148 | pub const TICK_HZ: u64 = 40_000_000; | ||
| 149 | #[cfg(feature = "tick-hz-40_960_000")] | ||
| 150 | pub const TICK_HZ: u64 = 40_960_000; | ||
| 151 | #[cfg(feature = "tick-hz-48_000_000")] | ||
| 152 | pub const TICK_HZ: u64 = 48_000_000; | ||
| 153 | #[cfg(feature = "tick-hz-50_000_000")] | ||
| 154 | pub const TICK_HZ: u64 = 50_000_000; | ||
| 155 | #[cfg(feature = "tick-hz-60_000_000")] | ||
| 156 | pub const TICK_HZ: u64 = 60_000_000; | ||
| 157 | #[cfg(feature = "tick-hz-64_000_000")] | ||
| 158 | pub const TICK_HZ: u64 = 64_000_000; | ||
| 159 | #[cfg(feature = "tick-hz-65_536_000")] | ||
| 160 | pub const TICK_HZ: u64 = 65_536_000; | ||
| 161 | #[cfg(feature = "tick-hz-70_000_000")] | ||
| 162 | pub const TICK_HZ: u64 = 70_000_000; | ||
| 163 | #[cfg(feature = "tick-hz-72_000_000")] | ||
| 164 | pub const TICK_HZ: u64 = 72_000_000; | ||
| 165 | #[cfg(feature = "tick-hz-80_000_000")] | ||
| 166 | pub const TICK_HZ: u64 = 80_000_000; | ||
| 167 | #[cfg(feature = "tick-hz-81_920_000")] | ||
| 168 | pub const TICK_HZ: u64 = 81_920_000; | ||
| 169 | #[cfg(feature = "tick-hz-90_000_000")] | ||
| 170 | pub const TICK_HZ: u64 = 90_000_000; | ||
| 171 | #[cfg(feature = "tick-hz-96_000_000")] | ||
| 172 | pub const TICK_HZ: u64 = 96_000_000; | ||
| 173 | #[cfg(feature = "tick-hz-100_000_000")] | ||
| 174 | pub const TICK_HZ: u64 = 100_000_000; | ||
| 175 | #[cfg(feature = "tick-hz-110_000_000")] | ||
| 176 | pub const TICK_HZ: u64 = 110_000_000; | ||
| 177 | #[cfg(feature = "tick-hz-120_000_000")] | ||
| 178 | pub const TICK_HZ: u64 = 120_000_000; | ||
| 179 | #[cfg(feature = "tick-hz-128_000_000")] | ||
| 180 | pub const TICK_HZ: u64 = 128_000_000; | ||
| 181 | #[cfg(feature = "tick-hz-130_000_000")] | ||
| 182 | pub const TICK_HZ: u64 = 130_000_000; | ||
| 183 | #[cfg(feature = "tick-hz-131_072_000")] | ||
| 184 | pub const TICK_HZ: u64 = 131_072_000; | ||
| 185 | #[cfg(feature = "tick-hz-140_000_000")] | ||
| 186 | pub const TICK_HZ: u64 = 140_000_000; | ||
| 187 | #[cfg(feature = "tick-hz-144_000_000")] | ||
| 188 | pub const TICK_HZ: u64 = 144_000_000; | ||
| 189 | #[cfg(feature = "tick-hz-150_000_000")] | ||
| 190 | pub const TICK_HZ: u64 = 150_000_000; | ||
| 191 | #[cfg(feature = "tick-hz-160_000_000")] | ||
| 192 | pub const TICK_HZ: u64 = 160_000_000; | ||
| 193 | #[cfg(feature = "tick-hz-163_840_000")] | ||
| 194 | pub const TICK_HZ: u64 = 163_840_000; | ||
| 195 | #[cfg(feature = "tick-hz-170_000_000")] | ||
| 196 | pub const TICK_HZ: u64 = 170_000_000; | ||
| 197 | #[cfg(feature = "tick-hz-180_000_000")] | ||
| 198 | pub const TICK_HZ: u64 = 180_000_000; | ||
| 199 | #[cfg(feature = "tick-hz-190_000_000")] | ||
| 200 | pub const TICK_HZ: u64 = 190_000_000; | ||
| 201 | #[cfg(feature = "tick-hz-192_000_000")] | ||
| 202 | pub const TICK_HZ: u64 = 192_000_000; | ||
| 203 | #[cfg(feature = "tick-hz-200_000_000")] | ||
| 204 | pub const TICK_HZ: u64 = 200_000_000; | ||
| 205 | #[cfg(feature = "tick-hz-210_000_000")] | ||
| 206 | pub const TICK_HZ: u64 = 210_000_000; | ||
| 207 | #[cfg(feature = "tick-hz-220_000_000")] | ||
| 208 | pub const TICK_HZ: u64 = 220_000_000; | ||
| 209 | #[cfg(feature = "tick-hz-230_000_000")] | ||
| 210 | pub const TICK_HZ: u64 = 230_000_000; | ||
| 211 | #[cfg(feature = "tick-hz-240_000_000")] | ||
| 212 | pub const TICK_HZ: u64 = 240_000_000; | ||
| 213 | #[cfg(feature = "tick-hz-250_000_000")] | ||
| 214 | pub const TICK_HZ: u64 = 250_000_000; | ||
| 215 | #[cfg(feature = "tick-hz-256_000_000")] | ||
| 216 | pub const TICK_HZ: u64 = 256_000_000; | ||
| 217 | #[cfg(feature = "tick-hz-260_000_000")] | ||
| 218 | pub const TICK_HZ: u64 = 260_000_000; | ||
| 219 | #[cfg(feature = "tick-hz-262_144_000")] | ||
| 220 | pub const TICK_HZ: u64 = 262_144_000; | ||
| 221 | #[cfg(feature = "tick-hz-270_000_000")] | ||
| 222 | pub const TICK_HZ: u64 = 270_000_000; | ||
| 223 | #[cfg(feature = "tick-hz-280_000_000")] | ||
| 224 | pub const TICK_HZ: u64 = 280_000_000; | ||
| 225 | #[cfg(feature = "tick-hz-288_000_000")] | ||
| 226 | pub const TICK_HZ: u64 = 288_000_000; | ||
| 227 | #[cfg(feature = "tick-hz-290_000_000")] | ||
| 228 | pub const TICK_HZ: u64 = 290_000_000; | ||
| 229 | #[cfg(feature = "tick-hz-300_000_000")] | ||
| 230 | pub const TICK_HZ: u64 = 300_000_000; | ||
| 231 | #[cfg(feature = "tick-hz-320_000_000")] | ||
| 232 | pub const TICK_HZ: u64 = 320_000_000; | ||
| 233 | #[cfg(feature = "tick-hz-327_680_000")] | ||
| 234 | pub const TICK_HZ: u64 = 327_680_000; | ||
| 235 | #[cfg(feature = "tick-hz-340_000_000")] | ||
| 236 | pub const TICK_HZ: u64 = 340_000_000; | ||
| 237 | #[cfg(feature = "tick-hz-360_000_000")] | ||
| 238 | pub const TICK_HZ: u64 = 360_000_000; | ||
| 239 | #[cfg(feature = "tick-hz-380_000_000")] | ||
| 240 | pub const TICK_HZ: u64 = 380_000_000; | ||
| 241 | #[cfg(feature = "tick-hz-384_000_000")] | ||
| 242 | pub const TICK_HZ: u64 = 384_000_000; | ||
| 243 | #[cfg(feature = "tick-hz-400_000_000")] | ||
| 244 | pub const TICK_HZ: u64 = 400_000_000; | ||
| 245 | #[cfg(feature = "tick-hz-420_000_000")] | ||
| 246 | pub const TICK_HZ: u64 = 420_000_000; | ||
| 247 | #[cfg(feature = "tick-hz-440_000_000")] | ||
| 248 | pub const TICK_HZ: u64 = 440_000_000; | ||
| 249 | #[cfg(feature = "tick-hz-460_000_000")] | ||
| 250 | pub const TICK_HZ: u64 = 460_000_000; | ||
| 251 | #[cfg(feature = "tick-hz-480_000_000")] | ||
| 252 | pub const TICK_HZ: u64 = 480_000_000; | ||
| 253 | #[cfg(feature = "tick-hz-500_000_000")] | ||
| 254 | pub const TICK_HZ: u64 = 500_000_000; | ||
| 255 | #[cfg(feature = "tick-hz-512_000_000")] | ||
| 256 | pub const TICK_HZ: u64 = 512_000_000; | ||
| 257 | #[cfg(feature = "tick-hz-520_000_000")] | ||
| 258 | pub const TICK_HZ: u64 = 520_000_000; | ||
| 259 | #[cfg(feature = "tick-hz-524_288_000")] | ||
| 260 | pub const TICK_HZ: u64 = 524_288_000; | ||
| 261 | #[cfg(feature = "tick-hz-540_000_000")] | ||
| 262 | pub const TICK_HZ: u64 = 540_000_000; | ||
| 263 | #[cfg(feature = "tick-hz-560_000_000")] | ||
| 264 | pub const TICK_HZ: u64 = 560_000_000; | ||
| 265 | #[cfg(feature = "tick-hz-576_000_000")] | ||
| 266 | pub const TICK_HZ: u64 = 576_000_000; | ||
| 267 | #[cfg(feature = "tick-hz-580_000_000")] | ||
| 268 | pub const TICK_HZ: u64 = 580_000_000; | ||
| 269 | #[cfg(feature = "tick-hz-600_000_000")] | ||
| 270 | pub const TICK_HZ: u64 = 600_000_000; | ||
| 271 | #[cfg(feature = "tick-hz-620_000_000")] | ||
| 272 | pub const TICK_HZ: u64 = 620_000_000; | ||
| 273 | #[cfg(feature = "tick-hz-640_000_000")] | ||
| 274 | pub const TICK_HZ: u64 = 640_000_000; | ||
| 275 | #[cfg(feature = "tick-hz-655_360_000")] | ||
| 276 | pub const TICK_HZ: u64 = 655_360_000; | ||
| 277 | #[cfg(feature = "tick-hz-660_000_000")] | ||
| 278 | pub const TICK_HZ: u64 = 660_000_000; | ||
| 279 | #[cfg(feature = "tick-hz-680_000_000")] | ||
| 280 | pub const TICK_HZ: u64 = 680_000_000; | ||
| 281 | #[cfg(feature = "tick-hz-700_000_000")] | ||
| 282 | pub const TICK_HZ: u64 = 700_000_000; | ||
| 283 | #[cfg(feature = "tick-hz-720_000_000")] | ||
| 284 | pub const TICK_HZ: u64 = 720_000_000; | ||
| 285 | #[cfg(feature = "tick-hz-740_000_000")] | ||
| 286 | pub const TICK_HZ: u64 = 740_000_000; | ||
| 287 | #[cfg(feature = "tick-hz-760_000_000")] | ||
| 288 | pub const TICK_HZ: u64 = 760_000_000; | ||
| 289 | #[cfg(feature = "tick-hz-768_000_000")] | ||
| 290 | pub const TICK_HZ: u64 = 768_000_000; | ||
| 291 | #[cfg(feature = "tick-hz-780_000_000")] | ||
| 292 | pub const TICK_HZ: u64 = 780_000_000; | ||
| 293 | #[cfg(feature = "tick-hz-800_000_000")] | ||
| 294 | pub const TICK_HZ: u64 = 800_000_000; | ||
| 295 | #[cfg(feature = "tick-hz-820_000_000")] | ||
| 296 | pub const TICK_HZ: u64 = 820_000_000; | ||
| 297 | #[cfg(feature = "tick-hz-840_000_000")] | ||
| 298 | pub const TICK_HZ: u64 = 840_000_000; | ||
| 299 | #[cfg(feature = "tick-hz-860_000_000")] | ||
| 300 | pub const TICK_HZ: u64 = 860_000_000; | ||
| 301 | #[cfg(feature = "tick-hz-880_000_000")] | ||
| 302 | pub const TICK_HZ: u64 = 880_000_000; | ||
| 303 | #[cfg(feature = "tick-hz-900_000_000")] | ||
| 304 | pub const TICK_HZ: u64 = 900_000_000; | ||
| 305 | #[cfg(feature = "tick-hz-920_000_000")] | ||
| 306 | pub const TICK_HZ: u64 = 920_000_000; | ||
| 307 | #[cfg(feature = "tick-hz-940_000_000")] | ||
| 308 | pub const TICK_HZ: u64 = 940_000_000; | ||
| 309 | #[cfg(feature = "tick-hz-960_000_000")] | ||
| 310 | pub const TICK_HZ: u64 = 960_000_000; | ||
| 311 | #[cfg(feature = "tick-hz-980_000_000")] | ||
| 312 | pub const TICK_HZ: u64 = 980_000_000; | ||
| 313 | #[cfg(feature = "tick-hz-1_000_000_000")] | ||
| 314 | pub const TICK_HZ: u64 = 1_000_000_000; | ||
| 315 | #[cfg(feature = "tick-hz-1_310_720_000")] | ||
| 316 | pub const TICK_HZ: u64 = 1_310_720_000; | ||
| 317 | #[cfg(feature = "tick-hz-2_621_440_000")] | ||
| 318 | pub const TICK_HZ: u64 = 2_621_440_000; | ||
| 319 | #[cfg(feature = "tick-hz-5_242_880_000")] | ||
| 320 | pub 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 | )))] | ||
| 482 | pub const TICK_HZ: u64 = 1_000_000; | ||
