Modern embedded framework, using Rust and async.
Go to file
bors[bot] d81a203ee2
Merge #429 #431
429: nrf/uarte: do not use WFE on drop. r=Dirbaio a=Dirbaio

- It disturbs other stuff that uses WFE/SEV in the system. I ran into issues with this.
- It needs the irq handler to check for RXTO/TXSTOPPED errors, which makes it slower.

431: interrupt: transmute instead of steal. r=Dirbaio a=Dirbaio

That steal method has a TAKEN=true write [here](6b013138b7/src/peripheral/mod.rs (L180)).
This is not zero cost, we don't want it. Transmute instead, which is zero cost.

Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
2021-10-16 14:21:36 +00:00
.github Merge #423 2021-10-13 21:11:41 +00:00
.vscode embassy: Refactor module structure to remove kitchen-sink util. 2021-09-11 02:35:35 +02:00
embassy interrupt: transmute instead of steal. 2021-10-16 04:11:19 +02:00
embassy-hal-common embassy: Refactor module structure to remove kitchen-sink util. 2021-09-11 02:35:35 +02:00
embassy-lora Update to newer revision of async lorawan stack 2021-10-11 13:51:00 +02:00
embassy-macros Add WASM support for executor 2021-09-13 16:42:39 +02:00
embassy-net embassy: Refactor module structure to remove kitchen-sink util. 2021-09-11 02:35:35 +02:00
embassy-nrf nrf/uarte: do not use WFE on drop. 2021-10-16 03:14:47 +02:00
embassy-rp Update version of critical-section 2021-09-13 17:05:17 +02:00
embassy-stm32 inline FRE register check for SPI on F1 2021-10-11 23:33:32 +02:00
embassy-traits Update lots of deps 2021-09-11 01:35:23 +02:00
examples Update to newer revision of async lorawan stack 2021-10-11 13:51:00 +02:00
stm32-data@bae2d34445 feat: Add spi support for STM32F1 variants 2021-10-11 22:39:48 +02:00
stm32-gen-features Initial STM32F1 family support with two examples for STM32F103C8 (Blue Pill) 2021-09-28 18:31:04 +02:00
stm32-metapac Support for STM32L1 2021-09-21 14:50:23 +02:00
stm32-metapac-gen Support for STM32L1 2021-09-21 14:50:23 +02:00
xtask Update lots of deps 2021-09-11 01:35:23 +02:00
.gitignore Update lots of deps 2021-09-11 01:35:23 +02:00
.gitmodules Add stm32-metapac crate, with codegen in rust 2021-05-31 02:40:58 +02:00
Cargo.example.toml std: fold into embassy core, add non-hacky time driver. 2021-08-25 21:06:27 +02: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 Extend SAADC one shot support 2021-10-09 11:25:18 +11:00
rust-toolchain.toml Initial support for nrf9160 2021-10-11 10:39:38 +02:00

Embassy

Embassy is a project to make async/await a first-class option for embedded development. For more information and instructions to get started, click here.

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.

  • saadc: SAADC driver. Provides a full implementation of the one-shot sampling for analog channels.

  • rtc: RTC driver implementing Clock and Alarm, for use with embassy::executor.

Examples

Examples are found in the examples/ folder seperated by the chip manufacturer they are designed to run on:

  • examples/nrf are designed to run on the nrf52840-dk board (PCA10056) but should be easily adaptable to other nRF52 chips and boards.
  • examples/rp are for the RP2040 chip.
  • examples/stm32 are designed for the STM32F429ZI chip but should be easily adaptable to other STM32F4xx chips.
  • examples/std are designed to run locally on your pc.

Running examples

  • Setup git submodules (needed for STM32 examples)
git submodule init
git submodule update
  • Install probe-run with defmt support.
cargo install probe-run
  • Run the example
cargo run --bin rtc_async

Minimum supported Rust version (MSRV)

Required nightly version is specified in the rust-toolchain.toml file. 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.