embassy/embassy-time/Cargo.toml
bors[bot] e5097a8866
Merge #959
959: Generic, executor-agnostic queue implementation r=ivmarkov a=ivmarkov

Hopefully relatively well documented.

Implementation relies on a fixed-size `SortedLinkedList` from `heapless`. (By default, for up to 128 timer schedules, but we can lower this number to - say - 64.)

As discussed earlier, on queue overflow, the `WakerRegistration` approach is utilized, whereas the waker that is ordered first in the queue is awoken to make room for the incoming one (which might be the waker that would be awoken after all!). Wakers are compared with `Waker::will_wake`, so the queue should actually not fill up that easily, if at all.

I've left provisions for the user to manually instantiate the queue using a dedicated macro - `generic_queue!` so that users willing to adjust the queue size, or users (like me) who have to use the queue in a complex "on-top-of-RTOS-but-the-timer-driver-calling-back-from-ISR" scenario can customize the mutex that protects the queue.

The one thing I'm not completely happy with is the need to call `{ embassy_time::queue::initialize() }` early on before any futures using embassy-time are polled, which is currently on the shoulders of the user. I'm open to any ideas where we can get rid of this and do it on the first call to `_embassy_time_schedule_wake`, without introducing very complex combinations of critical sections, atomics and whatnot.




Co-authored-by: ivmarkov <ivan.markov@gmail.com>
Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2022-10-26 19:14:12 +00:00

144 lines
4.3 KiB
TOML

[package]
name = "embassy-time"
version = "0.1.0"
edition = "2021"
license = "MIT OR Apache-2.0"
[package.metadata.embassy_docs]
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-time-v$VERSION/embassy-time/src/"
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-time/src/"
features = ["nightly", "defmt", "unstable-traits", "std"]
target = "x86_64-unknown-linux-gnu"
[features]
std = ["tick-hz-1_000_000"]
wasm = ["dep:wasm-bindgen", "dep:js-sys", "dep:wasm-timer", "tick-hz-1_000_000"]
# Enable nightly-only features
nightly = ["embedded-hal-async"]
# Implement embedded-hal 1.0 alpha and embedded-hal-async traits.
# Implement embedded-hal-async traits if `nightly` is set as well.
unstable-traits = ["embedded-hal-1"]
# Display a timestamp of the number of seconds since startup next to defmt log messages
# To use this you must have a time driver provided.
defmt-timestamp-uptime = ["defmt"]
# Create a global, generic queue that can be used with any executor
# To use this you must have a time driver provided.
generic-queue = []
# Set the number of timers for the generic queue.
#
# At most 1 `generic-queue-*` feature can be enabled. If none is enabled, a default of 64 timers is used.
#
# When using embassy-time from libraries, you should *not* enable any `generic-queue-*` feature, to allow the
# end user to pick.
generic-queue-8 = ["generic-queue"]
generic-queue-16 = ["generic-queue"]
generic-queue-32 = ["generic-queue"]
generic-queue-64 = ["generic-queue"]
generic-queue-128 = ["generic-queue"]
# Set the `embassy_time` tick rate.
#
# At most 1 `tick-*` feature can be enabled. If none is enabled, a default of 1MHz is used.
#
# If the time driver in use supports using arbitrary tick rates, you can enable one `tick-*`
# feature from your binary crate to set the tick rate. The driver will use configured tick rate.
# If the time driver supports a fixed tick rate, it will enable one feature itself, so you should
# not enable one. Check the time driver documentation for details.
#
# When using embassy-time from libraries, you should *not* enable any `tick-*` feature, to allow the
# end user or the driver to pick.
# BEGIN TICKS
# Generated by gen_tick.py. DO NOT EDIT.
tick-hz-1 = []
tick-hz-10 = []
tick-hz-100 = []
tick-hz-1_000 = []
tick-hz-10_000 = []
tick-hz-100_000 = []
tick-hz-1_000_000 = []
tick-hz-10_000_000 = []
tick-hz-100_000_000 = []
tick-hz-1_000_000_000 = []
tick-hz-2 = []
tick-hz-4 = []
tick-hz-8 = []
tick-hz-16 = []
tick-hz-32 = []
tick-hz-64 = []
tick-hz-128 = []
tick-hz-256 = []
tick-hz-512 = []
tick-hz-1_024 = []
tick-hz-2_048 = []
tick-hz-4_096 = []
tick-hz-8_192 = []
tick-hz-16_384 = []
tick-hz-32_768 = []
tick-hz-65_536 = []
tick-hz-131_072 = []
tick-hz-262_144 = []
tick-hz-524_288 = []
tick-hz-1_048_576 = []
tick-hz-2_097_152 = []
tick-hz-4_194_304 = []
tick-hz-8_388_608 = []
tick-hz-16_777_216 = []
tick-hz-2_000_000 = []
tick-hz-3_000_000 = []
tick-hz-4_000_000 = []
tick-hz-6_000_000 = []
tick-hz-8_000_000 = []
tick-hz-9_000_000 = []
tick-hz-12_000_000 = []
tick-hz-16_000_000 = []
tick-hz-18_000_000 = []
tick-hz-24_000_000 = []
tick-hz-32_000_000 = []
tick-hz-36_000_000 = []
tick-hz-48_000_000 = []
tick-hz-64_000_000 = []
tick-hz-72_000_000 = []
tick-hz-96_000_000 = []
tick-hz-128_000_000 = []
tick-hz-144_000_000 = []
tick-hz-192_000_000 = []
tick-hz-256_000_000 = []
tick-hz-288_000_000 = []
tick-hz-384_000_000 = []
tick-hz-512_000_000 = []
tick-hz-576_000_000 = []
tick-hz-768_000_000 = []
# END TICKS
[dependencies]
defmt = { version = "0.3", optional = true }
log = { version = "0.4.14", optional = true }
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6" }
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9", optional = true}
embedded-hal-async = { version = "=0.1.0-alpha.3", optional = true}
futures-util = { version = "0.3.17", default-features = false }
embassy-macros = { version = "0.1.0", path = "../embassy-macros"}
embassy-sync = { version = "0.1", path = "../embassy-sync" }
atomic-polyfill = "1.0.1"
critical-section = "1.1"
cfg-if = "1.0.0"
heapless = "0.7"
# WASM dependencies
wasm-bindgen = { version = "0.2.81", optional = true }
js-sys = { version = "0.3", optional = true }
wasm-timer = { version = "0.2.5", optional = true }
[dev-dependencies]
serial_test = "0.9"
critical-section = { version = "1.1", features = ["std"] }