Modern embedded framework, using Rust and async.
Go to file
2021-03-19 10:46:13 -05:00
.github/workflows ci: attempt to consolidate nrf examples 2021-03-19 10:46:13 -05:00
.vscode Update deps 2021-03-04 22:41:54 +01:00
embassy Run cargo fmt 2021-03-18 20:02:42 +01:00
embassy-extras peripheralmutex: separate interrupt registration to own method. 2021-03-18 18:49:10 +01:00
embassy-macros Add spawn/spawn_pool APIs to Task 2021-03-18 00:38:27 +01:00
embassy-nrf Simplify spim macros 2021-03-18 21:59:35 +01:00
embassy-nrf-examples Implement FullDuplex for nrf spim 2021-03-18 01:27:30 +01:00
embassy-std Remove rand(), fixes #50 2021-02-26 01:58:00 +01:00
embassy-std-examples Update features for latest nightly. 2021-03-17 02:48:16 +01:00
embassy-stm32f4 F4: Fix compilation for other MCUs 2021-03-18 22:37:08 -03:00
embassy-stm32f4-examples F4: Fix compilation for other MCUs 2021-03-18 22:37:08 -03:00
embassy-stm32l0 Add WaitFor{Low,High} for stm32l0 exti pins 2021-03-18 19:58:32 +01:00
embassy-traits Implement FullDuplex for nrf spim 2021-03-18 01:27:30 +01:00
.gitignore Update embassy-std to new executor api 2021-02-03 04:30:11 +01:00
Cargo.toml Add stm32l0 with ExtiPin futures 2021-03-09 11:00:02 +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 Fix probe-run install command 2021-03-14 23:17:45 +03: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::traits::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

The embassy::executor module provides an async/await executor designed for embedded usage.

  • No alloc, no heap needed. Task futures are statically allocated.
  • No "fixed capacity" data structures, executor works with 1 or 1000 tasks without needing config/tuning.
  • Integrated timer queue: sleeping is easy, just do Timer::after(Duration::from_secs(1)).await;.
  • No busy-loop polling: CPU sleeps when there's no work to do, using interrupts or WFE/SEV.
  • Efficient polling: a wake will only poll the woken task, not all of them.
  • Fair: a task can't monopolize CPU time even if it's constantly being woken. All other tasks get a chance to run before a given task gets polled for the second time.
  • Creating multiple executor instances is supported, to run tasks with multiple priority levels. This allows higher-priority tasks to preempt lower-priority tasks.

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 probe-run
  • Run the example
cargo run --bin rtc_async

Minimum supported Rust version (MSRV)

Only recent nighly supported. 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.