aboutsummaryrefslogtreecommitdiff
path: root/embassy-time-driver
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
parentdcffad6b05a06bc5f4d09a35184d5ffe158e02cf (diff)
time: split driver into a separate embassy-time-driver crate.
Diffstat (limited to 'embassy-time-driver')
-rw-r--r--embassy-time-driver/CHANGELOG.md51
-rw-r--r--embassy-time-driver/Cargo.toml391
-rw-r--r--embassy-time-driver/README.md20
-rw-r--r--embassy-time-driver/build.rs1
-rw-r--r--embassy-time-driver/gen_tick.py81
-rw-r--r--embassy-time-driver/src/lib.rs200
-rw-r--r--embassy-time-driver/src/tick.rs482
7 files changed, 1226 insertions, 0 deletions
diff --git a/embassy-time-driver/CHANGELOG.md b/embassy-time-driver/CHANGELOG.md
new file mode 100644
index 000000000..d8c0c7d08
--- /dev/null
+++ b/embassy-time-driver/CHANGELOG.md
@@ -0,0 +1,51 @@
1# Changelog
2
3All notable changes to this project will be documented in this file.
4
5The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
8## 0.2.0 - 2023-12-04
9
10- Added tick rates in multiples of 10 kHz
11- Remove nightly and unstable-traits features in preparation for 1.75.
12- Update heapless to 0.8.
13
14## 0.1.5 - 2023-10-16
15
16- Added `links` key to Cargo.toml, to prevent multiple copies of this crate in the same binary.
17 Needed because different copies might get different tick rates, causing
18 wrong delays if the time driver is using one copy and user code is using another.
19 This is especially common when mixing crates from crates.io and git.
20
21## 0.1.4 - 2023-10-12
22
23- Added more tick rates
24
25## 0.1.3 - 2023-08-28
26
27- Update `embedded-hal-async` to `1.0.0-rc.2`
28- Update `embedded-hal v1` to `1.0.0-rc.2`
29
30## 0.1.2 - 2023-07-05
31
32- Update `embedded-hal-async` to `0.2.0-alpha.2`.
33- Update `embedded-hal v1` to `1.0.0-alpha.11`. (Note: v0.2 support is kept unchanged).
34
35## 0.1.1 - 2023-04-13
36
37- Update `embedded-hal-async` to `0.2.0-alpha.1` (uses `async fn` in traits).
38- Update `embedded-hal v1` to `1.0.0-alpha.10`. (Note: v0.2 support is kept unchanged).
39- Remove dep on `embassy-sync`.
40- Fix reentrancy issues in the `std` time driver (#1177)
41- Add `Duration::from_hz()`.
42- impl `From` conversions to/from `core::time::Duration`.
43- Add `#[must_use]` to all futures.
44- Add inherent `async fn tick()` to `Ticker`, so you can use it directly without the `Stream` trait.
45- Add more tick rates.
46- impl `Default` for `Signal`
47- Remove unnecessary uses of `atomic-polyfill`
48
49## 0.1.0 - 2022-08-26
50
51- First release
diff --git a/embassy-time-driver/Cargo.toml b/embassy-time-driver/Cargo.toml
new file mode 100644
index 000000000..2ed250d4d
--- /dev/null
+++ b/embassy-time-driver/Cargo.toml
@@ -0,0 +1,391 @@
1[package]
2name = "embassy-time-driver"
3version = "0.1.0"
4edition = "2021"
5description = "Driver trait for embassy-time"
6repository = "https://github.com/embassy-rs/embassy"
7readme = "README.md"
8license = "MIT OR Apache-2.0"
9categories = [
10 "embedded",
11 "no-std",
12 "concurrency",
13 "asynchronous",
14]
15
16# Prevent multiple copies of this crate in the same binary.
17# Needed because different copies might get different tick rates, causing
18# wrong delays if the time driver is using one copy and user code is using another.
19# This is especially common when mixing crates from crates.io and git.
20links = "embassy-time"
21
22[package.metadata.embassy_docs]
23src_base = "https://github.com/embassy-rs/embassy/blob/embassy-time-driver-v$VERSION/embassy-time-driver/src/"
24src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-time-driver/src/"
25target = "x86_64-unknown-linux-gnu"
26
27[features]
28#! ### Tick Rate
29#!
30#! At most 1 `tick-*` feature can be enabled. If none is enabled, a default of 1MHz is used.
31#!
32#! If the time driver in use supports using arbitrary tick rates, you can enable one `tick-*`
33#! feature from your binary crate to set the tick rate. The driver will use configured tick rate.
34#! If the time driver supports a fixed tick rate, it will enable one feature itself, so you should
35#! not enable one. Check the time driver documentation for details.
36#!
37#! When using embassy-time from libraries, you should *not* enable any `tick-*` feature, to allow the
38#! end user or the driver to pick.
39#! <details>
40#! <summary>Available tick rates:</summary>
41#! <!-- Next line must be left empty for the features to render correctly! -->
42#!
43
44# BEGIN TICKS
45# Generated by gen_tick.py. DO NOT EDIT.
46## 1Hz Tick Rate
47tick-hz-1 = []
48## 2Hz Tick Rate
49tick-hz-2 = []
50## 4Hz Tick Rate
51tick-hz-4 = []
52## 8Hz Tick Rate
53tick-hz-8 = []
54## 10Hz Tick Rate
55tick-hz-10 = []
56## 16Hz Tick Rate
57tick-hz-16 = []
58## 32Hz Tick Rate
59tick-hz-32 = []
60## 64Hz Tick Rate
61tick-hz-64 = []
62## 100Hz Tick Rate
63tick-hz-100 = []
64## 128Hz Tick Rate
65tick-hz-128 = []
66## 256Hz Tick Rate
67tick-hz-256 = []
68## 512Hz Tick Rate
69tick-hz-512 = []
70## 1.0kHz Tick Rate
71tick-hz-1_000 = []
72## 1.024kHz Tick Rate
73tick-hz-1_024 = []
74## 2.0kHz Tick Rate
75tick-hz-2_000 = []
76## 2.048kHz Tick Rate
77tick-hz-2_048 = []
78## 4.0kHz Tick Rate
79tick-hz-4_000 = []
80## 4.096kHz Tick Rate
81tick-hz-4_096 = []
82## 8.0kHz Tick Rate
83tick-hz-8_000 = []
84## 8.192kHz Tick Rate
85tick-hz-8_192 = []
86## 10.0kHz Tick Rate
87tick-hz-10_000 = []
88## 16.0kHz Tick Rate
89tick-hz-16_000 = []
90## 16.384kHz Tick Rate
91tick-hz-16_384 = []
92## 20.0kHz Tick Rate
93tick-hz-20_000 = []
94## 32.0kHz Tick Rate
95tick-hz-32_000 = []
96## 32.768kHz Tick Rate
97tick-hz-32_768 = []
98## 40.0kHz Tick Rate
99tick-hz-40_000 = []
100## 64.0kHz Tick Rate
101tick-hz-64_000 = []
102## 65.536kHz Tick Rate
103tick-hz-65_536 = []
104## 80.0kHz Tick Rate
105tick-hz-80_000 = []
106## 100.0kHz Tick Rate
107tick-hz-100_000 = []
108## 128.0kHz Tick Rate
109tick-hz-128_000 = []
110## 131.072kHz Tick Rate
111tick-hz-131_072 = []
112## 160.0kHz Tick Rate
113tick-hz-160_000 = []
114## 256.0kHz Tick Rate
115tick-hz-256_000 = []
116## 262.144kHz Tick Rate
117tick-hz-262_144 = []
118## 320.0kHz Tick Rate
119tick-hz-320_000 = []
120## 512.0kHz Tick Rate
121tick-hz-512_000 = []
122## 524.288kHz Tick Rate
123tick-hz-524_288 = []
124## 640.0kHz Tick Rate
125tick-hz-640_000 = []
126## 1.0MHz Tick Rate
127tick-hz-1_000_000 = []
128## 1.024MHz Tick Rate
129tick-hz-1_024_000 = []
130## 1.048576MHz Tick Rate
131tick-hz-1_048_576 = []
132## 1.28MHz Tick Rate
133tick-hz-1_280_000 = []
134## 2.0MHz Tick Rate
135tick-hz-2_000_000 = []
136## 2.048MHz Tick Rate
137tick-hz-2_048_000 = []
138## 2.097152MHz Tick Rate
139tick-hz-2_097_152 = []
140## 2.56MHz Tick Rate
141tick-hz-2_560_000 = []
142## 3.0MHz Tick Rate
143tick-hz-3_000_000 = []
144## 4.0MHz Tick Rate
145tick-hz-4_000_000 = []
146## 4.096MHz Tick Rate
147tick-hz-4_096_000 = []
148## 4.194304MHz Tick Rate
149tick-hz-4_194_304 = []
150## 5.12MHz Tick Rate
151tick-hz-5_120_000 = []
152## 6.0MHz Tick Rate
153tick-hz-6_000_000 = []
154## 8.0MHz Tick Rate
155tick-hz-8_000_000 = []
156## 8.192MHz Tick Rate
157tick-hz-8_192_000 = []
158## 8.388608MHz Tick Rate
159tick-hz-8_388_608 = []
160## 9.0MHz Tick Rate
161tick-hz-9_000_000 = []
162## 10.0MHz Tick Rate
163tick-hz-10_000_000 = []
164## 10.24MHz Tick Rate
165tick-hz-10_240_000 = []
166## 12.0MHz Tick Rate
167tick-hz-12_000_000 = []
168## 16.0MHz Tick Rate
169tick-hz-16_000_000 = []
170## 16.384MHz Tick Rate
171tick-hz-16_384_000 = []
172## 16.777216MHz Tick Rate
173tick-hz-16_777_216 = []
174## 18.0MHz Tick Rate
175tick-hz-18_000_000 = []
176## 20.0MHz Tick Rate
177tick-hz-20_000_000 = []
178## 20.48MHz Tick Rate
179tick-hz-20_480_000 = []
180## 24.0MHz Tick Rate
181tick-hz-24_000_000 = []
182## 30.0MHz Tick Rate
183tick-hz-30_000_000 = []
184## 32.0MHz Tick Rate
185tick-hz-32_000_000 = []
186## 32.768MHz Tick Rate
187tick-hz-32_768_000 = []
188## 36.0MHz Tick Rate
189tick-hz-36_000_000 = []
190## 40.0MHz Tick Rate
191tick-hz-40_000_000 = []
192## 40.96MHz Tick Rate
193tick-hz-40_960_000 = []
194## 48.0MHz Tick Rate
195tick-hz-48_000_000 = []
196## 50.0MHz Tick Rate
197tick-hz-50_000_000 = []
198## 60.0MHz Tick Rate
199tick-hz-60_000_000 = []
200## 64.0MHz Tick Rate
201tick-hz-64_000_000 = []
202## 65.536MHz Tick Rate
203tick-hz-65_536_000 = []
204## 70.0MHz Tick Rate
205tick-hz-70_000_000 = []
206## 72.0MHz Tick Rate
207tick-hz-72_000_000 = []
208## 80.0MHz Tick Rate
209tick-hz-80_000_000 = []
210## 81.92MHz Tick Rate
211tick-hz-81_920_000 = []
212## 90.0MHz Tick Rate
213tick-hz-90_000_000 = []
214## 96.0MHz Tick Rate
215tick-hz-96_000_000 = []
216## 100.0MHz Tick Rate
217tick-hz-100_000_000 = []
218## 110.0MHz Tick Rate
219tick-hz-110_000_000 = []
220## 120.0MHz Tick Rate
221tick-hz-120_000_000 = []
222## 128.0MHz Tick Rate
223tick-hz-128_000_000 = []
224## 130.0MHz Tick Rate
225tick-hz-130_000_000 = []
226## 131.072MHz Tick Rate
227tick-hz-131_072_000 = []
228## 140.0MHz Tick Rate
229tick-hz-140_000_000 = []
230## 144.0MHz Tick Rate
231tick-hz-144_000_000 = []
232## 150.0MHz Tick Rate
233tick-hz-150_000_000 = []
234## 160.0MHz Tick Rate
235tick-hz-160_000_000 = []
236## 163.84MHz Tick Rate
237tick-hz-163_840_000 = []
238## 170.0MHz Tick Rate
239tick-hz-170_000_000 = []
240## 180.0MHz Tick Rate
241tick-hz-180_000_000 = []
242## 190.0MHz Tick Rate
243tick-hz-190_000_000 = []
244## 192.0MHz Tick Rate
245tick-hz-192_000_000 = []
246## 200.0MHz Tick Rate
247tick-hz-200_000_000 = []
248## 210.0MHz Tick Rate
249tick-hz-210_000_000 = []
250## 220.0MHz Tick Rate
251tick-hz-220_000_000 = []
252## 230.0MHz Tick Rate
253tick-hz-230_000_000 = []
254## 240.0MHz Tick Rate
255tick-hz-240_000_000 = []
256## 250.0MHz Tick Rate
257tick-hz-250_000_000 = []
258## 256.0MHz Tick Rate
259tick-hz-256_000_000 = []
260## 260.0MHz Tick Rate
261tick-hz-260_000_000 = []
262## 262.144MHz Tick Rate
263tick-hz-262_144_000 = []
264## 270.0MHz Tick Rate
265tick-hz-270_000_000 = []
266## 280.0MHz Tick Rate
267tick-hz-280_000_000 = []
268## 288.0MHz Tick Rate
269tick-hz-288_000_000 = []
270## 290.0MHz Tick Rate
271tick-hz-290_000_000 = []
272## 300.0MHz Tick Rate
273tick-hz-300_000_000 = []
274## 320.0MHz Tick Rate
275tick-hz-320_000_000 = []
276## 327.68MHz Tick Rate
277tick-hz-327_680_000 = []
278## 340.0MHz Tick Rate
279tick-hz-340_000_000 = []
280## 360.0MHz Tick Rate
281tick-hz-360_000_000 = []
282## 380.0MHz Tick Rate
283tick-hz-380_000_000 = []
284## 384.0MHz Tick Rate
285tick-hz-384_000_000 = []
286## 400.0MHz Tick Rate
287tick-hz-400_000_000 = []
288## 420.0MHz Tick Rate
289tick-hz-420_000_000 = []
290## 440.0MHz Tick Rate
291tick-hz-440_000_000 = []
292## 460.0MHz Tick Rate
293tick-hz-460_000_000 = []
294## 480.0MHz Tick Rate
295tick-hz-480_000_000 = []
296## 500.0MHz Tick Rate
297tick-hz-500_000_000 = []
298## 512.0MHz Tick Rate
299tick-hz-512_000_000 = []
300## 520.0MHz Tick Rate
301tick-hz-520_000_000 = []
302## 524.288MHz Tick Rate
303tick-hz-524_288_000 = []
304## 540.0MHz Tick Rate
305tick-hz-540_000_000 = []
306## 560.0MHz Tick Rate
307tick-hz-560_000_000 = []
308## 576.0MHz Tick Rate
309tick-hz-576_000_000 = []
310## 580.0MHz Tick Rate
311tick-hz-580_000_000 = []
312## 600.0MHz Tick Rate
313tick-hz-600_000_000 = []
314## 620.0MHz Tick Rate
315tick-hz-620_000_000 = []
316## 640.0MHz Tick Rate
317tick-hz-640_000_000 = []
318## 655.36MHz Tick Rate
319tick-hz-655_360_000 = []
320## 660.0MHz Tick Rate
321tick-hz-660_000_000 = []
322## 680.0MHz Tick Rate
323tick-hz-680_000_000 = []
324## 700.0MHz Tick Rate
325tick-hz-700_000_000 = []
326## 720.0MHz Tick Rate
327tick-hz-720_000_000 = []
328## 740.0MHz Tick Rate
329tick-hz-740_000_000 = []
330## 760.0MHz Tick Rate
331tick-hz-760_000_000 = []
332## 768.0MHz Tick Rate
333tick-hz-768_000_000 = []
334## 780.0MHz Tick Rate
335tick-hz-780_000_000 = []
336## 800.0MHz Tick Rate
337tick-hz-800_000_000 = []
338## 820.0MHz Tick Rate
339tick-hz-820_000_000 = []
340## 840.0MHz Tick Rate
341tick-hz-840_000_000 = []
342## 860.0MHz Tick Rate
343tick-hz-860_000_000 = []
344## 880.0MHz Tick Rate
345tick-hz-880_000_000 = []
346## 900.0MHz Tick Rate
347tick-hz-900_000_000 = []
348## 920.0MHz Tick Rate
349tick-hz-920_000_000 = []
350## 940.0MHz Tick Rate
351tick-hz-940_000_000 = []
352## 960.0MHz Tick Rate
353tick-hz-960_000_000 = []
354## 980.0MHz Tick Rate
355tick-hz-980_000_000 = []
356## 1.0GHz Tick Rate
357tick-hz-1_000_000_000 = []
358## 1.31072GHz Tick Rate
359tick-hz-1_310_720_000 = []
360## 2.62144GHz Tick Rate
361tick-hz-2_621_440_000 = []
362## 5.24288GHz Tick Rate
363tick-hz-5_242_880_000 = []
364# END TICKS
365
366#! </details>
367
368[dependencies]
369defmt = { version = "0.3", optional = true }
370log = { version = "0.4.14", optional = true }
371
372embedded-hal-02 = { package = "embedded-hal", version = "0.2.6" }
373embedded-hal-1 = { package = "embedded-hal", version = "1.0" }
374embedded-hal-async = { version = "1.0" }
375
376futures-util = { version = "0.3.17", default-features = false }
377critical-section = "1.1"
378cfg-if = "1.0.0"
379heapless = "0.8"
380
381document-features = "0.2.7"
382
383# WASM dependencies
384wasm-bindgen = { version = "0.2.81", optional = true }
385js-sys = { version = "0.3", optional = true }
386wasm-timer = { version = "0.2.5", optional = true }
387
388[dev-dependencies]
389serial_test = "0.9"
390critical-section = { version = "1.1", features = ["std"] }
391embassy-executor = { version = "0.4.0", path = "../embassy-executor" }
diff --git a/embassy-time-driver/README.md b/embassy-time-driver/README.md
new file mode 100644
index 000000000..74a5b7876
--- /dev/null
+++ b/embassy-time-driver/README.md
@@ -0,0 +1,20 @@
1# embassy-time-driver
2
3
4This crate contains the driver trait necessary for adding [`embassy-time`](https://crates.io/crates/embassy-time) support
5for a new hardware platform.
6
7If you want to *use* `embassy-time` with already made drivers, you should depend on the main `embassy-time` crate, not on this crate.
8
9If you are writing a driver, you should depend only on this crate, not on the main `embassy-time` crate.
10This will allow your driver to continue working for newer `embassy-time` major versions, without needing an update,
11if the driver trait has not had breaking changes.
12
13## How it works
14
15`embassy-time` module is backed by a global "time driver" specified at build time.
16Only one driver can be active in a program.
17
18All methods and structs transparently call into the active driver. This makes it
19possible for libraries to use `embassy-time` in a driver-agnostic way without
20requiring generic parameters.
diff --git a/embassy-time-driver/build.rs b/embassy-time-driver/build.rs
new file mode 100644
index 000000000..f328e4d9d
--- /dev/null
+++ b/embassy-time-driver/build.rs
@@ -0,0 +1 @@
fn main() {}
diff --git a/embassy-time-driver/gen_tick.py b/embassy-time-driver/gen_tick.py
new file mode 100644
index 000000000..af194c31f
--- /dev/null
+++ b/embassy-time-driver/gen_tick.py
@@ -0,0 +1,81 @@
1import os
2from glob import glob
3
4abspath = os.path.abspath(__file__)
5dname = os.path.dirname(abspath)
6os.chdir(dname)
7
8ticks = []
9for i in range(10):
10 ticks.append(10**i)
11for i in range(1, 25):
12 ticks.append(2**i)
13for i in range(1, 20):
14 ticks.append(2**i * 1000)
15for i in range(1, 20):
16 ticks.append(2**i * 10000)
17for i in range(1, 10):
18 ticks.append(2**i * 1000000)
19 ticks.append(2**i * 9 // 8 * 1000000)
20 ticks.append(2**i * 3 // 2 * 1000000)
21for i in range(1, 30):
22 ticks.append(10 * i * 1_000_000)
23for i in range(15, 50):
24 ticks.append(20 * i * 1_000_000)
25
26seen = set()
27ticks = sorted([x for x in ticks if not (x in seen or seen.add(x))])
28
29# ========= Update Cargo.toml
30
31SEPARATOR_START = '# BEGIN TICKS\n'
32SEPARATOR_END = '# END TICKS\n'
33HELP = '# Generated by gen_tick.py. DO NOT EDIT.\n'
34
35feats_time = ''
36feats_driver = ''
37for freq in ticks:
38 feature = f'tick-hz-{freq:_}'
39 if freq >= 1_000_000_000:
40 freq_human = f"{freq / 1_000_000_000}GHz"
41 elif freq >= 1_000_000:
42 freq_human = f"{freq / 1_000_000}MHz"
43 elif freq >= 1_000:
44 freq_human = f"{freq / 1000}kHz"
45 else:
46 freq_human = f"{freq}Hz"
47
48 feats_time += f"## {freq_human} Tick Rate\n"
49 feats_time += f"{feature} = [\"embassy-time-driver/{feature}\"]\n"
50 feats_driver += f"## {freq_human} Tick Rate\n"
51 feats_driver += f"{feature} = []\n"
52
53with open('Cargo.toml', 'r') as f:
54 data = f.read()
55before, data = data.split(SEPARATOR_START, maxsplit=1)
56_, after = data.split(SEPARATOR_END, maxsplit=1)
57with open('Cargo.toml', 'w') as f:
58 f.write(before + SEPARATOR_START + HELP + feats_driver + SEPARATOR_END + after)
59
60with open('../embassy-time/Cargo.toml', 'r') as f:
61 data = f.read()
62before, data = data.split(SEPARATOR_START, maxsplit=1)
63_, after = data.split(SEPARATOR_END, maxsplit=1)
64with open('../embassy-time/Cargo.toml', 'w') as f:
65 f.write(before + SEPARATOR_START + HELP + feats_time + SEPARATOR_END + after)
66
67# ========= Update src/tick.rs
68
69with open('src/tick.rs', 'w') as f:
70
71 f.write('// Generated by gen_tick.py. DO NOT EDIT.\n\n')
72 for hz in ticks:
73 f.write(
74 f'#[cfg(feature = "tick-hz-{hz:_}")] pub const TICK_HZ: u64 = {hz:_};\n')
75 f.write('#[cfg(not(any(\n')
76 for hz in ticks:
77 f.write(f'feature = "tick-hz-{hz:_}",\n')
78 f.write(')))] pub const TICK_HZ: u64 = 1_000_000;')
79
80
81os.system('rustfmt src/tick.rs')
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;