Modern embedded framework, using Rust and async.
Go to file
Dario Nieuwenhuis 0750234fbe WIP owned irqs
2020-12-29 00:05:52 +01:00
.github/workflows Fix CI 2020-12-01 17:52:06 +01:00
.vscode Add embassy-std crate with glue to run embassy on std. 2020-12-28 03:41:40 +01:00
embassy WIP owned irqs 2020-12-29 00:05:52 +01:00
embassy-macros WIP owned irqs 2020-12-29 00:05:52 +01:00
embassy-nrf WIP owned irqs 2020-12-29 00:05:52 +01:00
embassy-std Add embassy-std crate with glue to run embassy on std. 2020-12-28 03:41:40 +01:00
examples WIP owned irqs 2020-12-29 00:05:52 +01:00
.gitignore Add Executor with timer queue, Timer, Instant, Duration, Alarm. 2020-09-25 03:25:06 +02:00
Cargo.toml More efficient timer queue, integrated into Executor directly. 2020-12-26 23:44:53 +01:00
LICENSE-APACHE First commit 2020-09-22 18:03:43 +02:00
LICENSE-MIT First commit 2020-09-22 18:03:43 +02:00
README.md Remove anyfmt 2020-11-27 18:42:59 +01:00
test-build.sh Add std impl for rand 2020-12-14 00:36:29 +01:00

Embassy

Embassy is a project to make async/await a first-class option for embedded development.

Traits and types

embassy provides a set of traits and types specifically designed for async usage.

  • embassy::io: AsyncBufRead, AsyncWrite. Traits for byte-stream IO, essentially no_std compatible versions of futures::io.
  • embassy::flash: Flash device trait.
  • embassy::time: Clock and Alarm traits. Std-like Duration and Instant.
  • More traits for SPI, I2C, UART async HAL coming soon.

Executor with timers

The embassy::executor module provides an async/await executor based on static-executor.

  • No alloc, no heap needed. Task futures are statically allocated.
  • Integrated timer queue allows simple sleeping: Timer::after(Duration::from_ticks(64000)).await;.
  • Suitable for low-power operation. Using interrupts or WFE/SEV ensures the CPU sleeps when there's no work to do. No busy-loop polling.
  • Creating multiple executor instances is supported, to run tasks with multiple priority levels. This allows higher-priority tasks to preempt lower-priority tasks.
  • Compatible with RTIC (example coming soon).

Utils

embassy::util contains some lightweight async/await utilities, mainly helpful for async driver development (signaling a task that an interrupt has occured, for example).

embassy-nrf

The embassy-nrf crate contains implementations for nRF 52 series SoCs.

  • uarte: UARTE driver implementing AsyncBufRead and AsyncWrite.
  • qspi: QSPI driver implementing Flash.
  • gpiote: GPIOTE driver. Allows awaiting GPIO pin changes. Great for reading buttons or receiving interrupts from external chips.
  • rtc: RTC driver implementing Clock and Alarm, for use with embassy::executor.

Running the examples

Examples are for the nRF52840 chip but should be easily adaptable to other nRF52 chips.

GPIO pins are set up for the nrf52840-dk board (PCA10056)

  • Install probe-run with defmt support.
cargo install --git https://github.com/knurling-rs/probe-run --branch main --features defmt
  • Run the example
cargo run --bin rtc_async

Minimum supported Rust version (MSRV)

rustc 1.48.0-nightly (1fd5b9d51 2020-09-20)

Any recent nightly should work. Nightly is required for:

  • generic_associated_types: for trait funcs returning futures.
  • type_alias_impl_trait: for trait funcs returning futures implemented with async{} blocks, and for static-executor.

Stable support is a non-goal until these features get stabilized.

Why the name?

EMBedded ASYnc! :)

License

This work is licensed under either of

at your option.