Coder Social home page Coder Social logo

rust-embedded / awesome-embedded-rust Goto Github PK

View Code? Open in Web Editor NEW
5.8K 162.0 363.0 923 KB

Curated list of resources for Embedded and Low-level development in the Rust programming language

License: Other

awesome-list awesome rust embedded embedded-systems libraries

awesome-embedded-rust's Introduction

Embedded Rust

Awesome

This is a curated list of resources related to embedded and low-level programming in the Rust programming language, including a selection of useful crates.

This project is developed and maintained by the Resources team.

Don't see something you want or need here? Add it to the Not Yet Awesome Embedded Rust list!

Table of Contents

Community

In 2018, the Rust community created an embedded working group to help drive adoption in the Rust ecosystem.

  • Embedded WG, including newsletters with progress updates.

Community Chat Rooms

Books, blogs, and training materials

Tools

  • xargo Rust package manager with support for non-default std libraries — build Rust runtime for your embedded system.
    • xargo is great, but since it's in maintenance mode, cargo-xbuild is catching up as its intended replacement.
  • svd2rust Generate Rust structs with register mappings from SVD files.
  • edc2svd Generate SVD files for PIC32 devices from EDC files. - crates.io
  • embedded-hal-mock Mock implementation of embedded-hal traits for testing without accessing real hardware. - crates.io
  • bindgen Automatically generates Rust FFI bindings to C and C++ libraries. - crates.io
  • cortex-m semihosting Semihosting for ARM Cortex-M processors
  • bobbin-cli A Rust command line tool to simplify embedded development and deployment.
  • ferros A Rust-based userland which also adds compile-time assurances to seL4 development.
  • cargo-flash A small cargo subcommand to download your binary to your target chip. - crates.io
  • cargo-embed A superset of cargo-flash with additional useful features like configuration file support, an RTT terminal, or a GDB server. - crates.io
  • cargo-hf2 A small cargo subcommand to download cargo builds to Microsoft UF2 bootloaders via HID USB . - crates.io
  • cargo-bloat Find out what takes most of the space in your executable.
  • cargo-call-stack Static, whole program stack usage analyzer.
  • cargo-dfu Cargo extension for flashing embedded rust programs via DFU.
  • espflash Serial flasher utility for Espressif SoCs and modules. - crates.io
  • espup Tool for installing and maintaining Espressif Rust ecosystem. - crates.io
  • uf2 Converts binary files to Microsoft's UF2 format for copying over to mass storage device uf2 bootloaders - crates.io
  • Knurling Tools are developed by Ferrous Systems to ease the development process for building, debugging, and testing embedded Rust systems. These tools include:
    • Probe Run: a cargo runner to flash and run embedded applications just like you would native applications, including backtraces and panicking behavior
    • defmt: a highly efficient logging framework that targets resource-constrained devices, like microcontrollers.
    • flip-link, a linker wrapper that provides stack overflow protection without an MMU by flipping the standard memory layout of ARM Cortex-M programs
    • app-template, a cargo-generate powered project template for quickly setting up new projects using the Knurling Tools.
    • defmt-test, an embedded test harness that lets you write and run unit tests as if you were using the built-in #[test] attribute, but will run on an embedded target
  • embedded-hal-compat, a compatibility layer to provide interoperability between v0.2.x and v1.x.x hal implementations and drivers
  • Embassy start is a GitHub repo template for setting up async embedded Rust projects that use Embassy. This particular template targets nRF hardware and networking using the Uarte for the purposes of illustration only.
  • svd-generator CLI tool to parse flattened device tree files, and create a SVD file. - crates.io

Real-time

Real-time Operating System (RTOS)

  • Drone OS An Embedded Operating System for writing real-time applications in Rust.
  • FreeRTOS.rs Rust interface for the FreeRTOS API
  • FreeRTOS-rust Rust interface for FreeRTOS with Rust entry point and build support crate.
  • RIOT-OS directly supports applications written in Rust, both in terms of build system integration and by having safe and idiomatic wrappers.
  • Tock An embedded operating system designed for running multiple concurrent, mutually distrustful applications on low-memory and low-power microcontrollers
  • Hubris A real-time operating system built by Oxide Computer to run the Service Controller processor in the mainboards of their rack-mount servers.

Real-time tools

  • RTIC v1.0 Real-Time Interrupt-driven Concurrency — A concurrency framework for building real-time systems:

Peripheral Access Crates

Register definition for microcontroller families. Usually generated using svd2rust. - crates.io

Peripheral Access Crates were also called Device Crates.

NOTE You may be able to find even more peripheral access crates by searching for the svd2rust keyword on crates.io!

Microchip

  • atsamd11 Peripheral access API for Microchip (formerly Atmel) SAMD11 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsamd21 Peripheral access API for Microchip (formerly Atmel) SAMD21 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsamd51 Peripheral access API for Microchip (formerly Atmel) SAMD51 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsame53 Peripheral access API for Microchip (formerly Atmel) SAME53 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsame54 Peripheral access API for Microchip (formerly Atmel) SAME54 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsamx7x-rust Peripheral access API for Microchip (formerly Atmel) SAM S70/E70/V70/V71 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • avr-device Peripheral access API for Microchip (formerly Atmel) AVR microcontroller family.
  • sam3x8e Peripheral access API for Atmel SAMD3X8E microcontrollers (generated using svd2rust) - crates.io
  • pic32-pac Peripheral access API for PIC32MX1/2xx - crates.io

Nordic

  • nrf51 Peripheral access API for nRF51 microcontrollers (generated using svd2rust) - crates.io
  • nrf52810-pac - Peripheral access API for the nRF52810 microcontroller (generated using svd2rust) - crates.io
  • nrf52811-pac - Peripheral access API for the nRF52811 microcontroller (generated using svd2rust) - crates.io
  • nrf52832-pac - Peripheral access API for the nRF52832 microcontroller (generated using svd2rust) - crates.io
  • nrf52833-pac - Peripheral access API for the nRF52833 microcontroller (generated using svd2rust) - crates.io
  • nrf52840-pac - Peripheral access API for the nRF52840 microcontroller (generated using svd2rust) - crates.io
  • nrf5340-app-pac - Peripheral access API for the nRF5340 application core (generated using svd2rust) - crates.io
  • nrf5340-net-pac - Peripheral access API for the nRF5340 network core (generated using svd2rust) - crates.io
  • nrf9160-pac - Peripheral access API for the nRF9160 system-in-package (generated using svd2rust) - crates.io

NXP

Raspberry Pi Silicon

  • rp2040-pac - Peripheral access API for the RP2040 dual-core system-on-chip (generated using svd2rust) - crates.io

SiFive

Silicon Labs

  • efm32pg12-pac - Peripheral access API for Silicon Labs EFM32PG12 microcontrollers - crates.io

The efm32-rs project has peripheral access APIs for most EFM32 microcontrollers (generated using svd2rust):

StarFive

STMicroelectronics

The stm32-rs project has peripheral access APIs for most STM32 microcontrollers (generated using svd2rust):

Texas Instruments

  • tm4c123x Peripheral access API for TM4C123x microcontrollers (generated using svd2rust)
  • tm4c129x Peripheral access API for TM4C129x microcontrollers (generated using svd2rust)

MSP430

Espressif

Ambiq Micro

  • ambiq-apollo1-pac Peripheral access API for Ambiq Apollo 1 microcontrollers (generated using svd2rust)
  • ambiq-apollo2-pac Peripheral access API for Ambiq Apollo 2 microcontrollers (generated using svd2rust)
  • ambiq-apollo3-pac Peripheral access API for Ambiq Apollo 3 microcontrollers (generated using svd2rust)
  • ambiq-apollo3p-pac Peripheral access API for Ambiq Apollo 3 Plus microcontrollers (generated using svd2rust)

GigaDevice

  • gd32vf103-pac Peripheral access API for GD32VF103 RISC-V microcontrollers (generated using svd2rust) - crates.io
  • gd32e2 Peripheral access API for GD32E23x Cortex-M23 microcontrollers (generated using svd2rust) - crates.io
  • gd32f1 Peripheral access API for GD32F1x0 Cortex-M3 microcontrollers (generated using svd2rust) - crates.io
  • gd32f2 Peripheral access API for GD32F20x Cortex-M3 microcontrollers (generated using svd2rust) - crates.io

XMC

Peripheral access crates for the different XMC4xxx families of microcontrollers

Vorago

Wiznet

  • w7500x-pac Peripheral Access Crate for Wiznet's W7500x microcontrollers (generated using svd2rust) - crates.io

Renesas

  • ra2a1 Peripheral Access Crate for ra2a1 microcontrollers (generated using svd2rust) - crates.io
  • ra2e1 Peripheral Access Crate for ra2e1 microcontrollers (generated using svd2rust) - crates.io
  • ra2e2 Peripheral Access Crate for ra2e2 microcontrollers (generated using svd2rust) - crates.io
  • ra2l1 Peripheral Access Crate for ra2l1 microcontrollers (generated using svd2rust) - crates.io
  • ra4e1 Peripheral Access Crate for ra4e1 microcontrollers (generated using svd2rust) - crates.io
  • ra4m1 Peripheral Access Crate for ra4m1 microcontrollers (generated using svd2rust) - crates.io
  • ra4m2 Peripheral Access Crate for ra4m2 microcontrollers (generated using svd2rust) - crates.io
  • ra4m3 Peripheral Access Crate for ra4m3 microcontrollers (generated using svd2rust) - crates.io
  • ra4w1 Peripheral Access Crate for ra4w1 microcontrollers (generated using svd2rust) - crates.io
  • ra6e1 Peripheral Access Crate for ra6e1 microcontrollers (generated using svd2rust) - crates.io
  • ra6m1 Peripheral Access Crate for ra6m1 microcontrollers (generated using svd2rust) - crates.io
  • ra6m2 Peripheral Access Crate for ra6m2 microcontrollers (generated using svd2rust) - crates.io
  • ra6m3 Peripheral Access Crate for ra6m3 microcontrollers (generated using svd2rust) - crates.io
  • ra6m4 Peripheral Access Crate for ra6m4 microcontrollers (generated using svd2rust) - crates.io
  • ra6t1 Peripheral Access Crate for ra6t1 microcontrollers (generated using svd2rust) - crates.io
  • ra6t2 Peripheral Access Crate for ra6t2 microcontrollers (generated using svd2rust) - crates.io
  • da14531 Peripheral Access Crate for DA14531 Ultra-Low Power BT 5.1 System-on-Chip - crates.io

HAL implementation crates

Implementations of embedded-hal for microcontroller families and systems running some OS. - crates.io

NOTE You may be able to find even more HAL implementation crates by searching for the embedded-hal-impl and embedded-hal keywords on crates.io!

OS

Microchip

  • atsam4-hal - HAL for SAM4E, SAM4N and SAM4S - crates.io
  • atsamd-hal - HAL for SAMD11, SAMD21, SAMD51 and SAME54 - crates.io
  • atsamx7x-hal - HAL for SAM S70/E70/V70/V71-based devices - crates.io
  • avr-hal - HAL for AVR microcontroller family and AVR-based boards
  • pic32-hal - HAL for PIC32MX - crates.io

Nordic

NXP

Also check the list of NXP board support crates!

Raspberry Pi Silicon

  • rp2040-hal - HAL for the RP2040 dual-core system-on-chip - crates.io

SiFive

STMicroelectronics

Also check the list of STMicroelectronics board support crates!

Texas Instruments

MSP430

  • msp430fr2x5x-hal
    • HAL implementation for the MSP430FR2x5x family of microcontrollers

Espressif

  • esp-idf-hal
    • An embedded-hal implementation for Rust on ESP32 microcontrollers and ESP-IDF
  • esp-hal
    • A no_std Hardware Abstraction Layers for ESP32 microcontrollers

Silicon Labs

  • tomu-hal
    • HAL implementation targeted for Tomu USB board with EFM32HG309F64 ARMv6-M core. Has support to configure tomu bootloader directly from an application via the toboot_config macro.

XMC

GigaDevice

  • gd32vf103xx-hal - crates.io
    • HAL for GD32VF103xx microcontrollers
  • gd32vf103-hal - crates.io
    • (WIP) Hardware abstract layer (HAL) for the GD32VF103 RISC-V microcontroller
  • gd32f1x0-hal - crates.io
    • HAL implementation for GD32F1x0 microcontrollers

Vorago

Renesas

  • da14531-hal HAL crate for DA14531 Ultra-Low Power BT 5.1 System-on-Chip - crates.io

StarFive

Architecture support crates

Crates tailored for general CPU architectures.

ARM

  • cortex-a Low-level access to Cortex-A processors (early state) - crates.io
  • cortex-m Low-level access to Cortex-M processors - crates.io

RISC-V

  • riscv Low-level access to RISC-V processors - crates.io

MIPS

  • mips Low-level access to MIPS32 processors - crates.io
  • mips-mcu Low-level access to MIPS MCU cores - crates.io

Board support crates

Crates tailored for specific boards.

1BitSquared

Adafruit

Arduino

Nordic

NXP

Pimoroni

Raspberry Pi

  • rp-pico - Board Support Crate for the RP2040-based Raspberry Pi Pico.

Sparkfun

SeeedStudio

SiFive

Sipeed

Sony

  • prussia - SDK for the PlayStation 2.

STMicroelectronics

Teensy

  • teensy4-rs Board Support crate for the [Teensy 4.0]

Vorago

Texas Instruments

  • monotron - A 1980s home-computer style application for the Texas Instruments Stellaris Launchpad. PS/2 keyboard input, text output on a bit-bashed 800x600 VGA signal. Uses menu, vga-framebuffer and pc-keyboard.
  • stellaris-launchpad - For the Texas Instruments Stellaris Launchpad and Tiva-C Launchpad crates.io
  • tm4c129-launchpad - For the Texas Instruments TM4C129-XL Launchpad board

Special Purpose

  • betafpv-f3 - For the BetaFPV F3 drone flight controller

Sodaq

Other

Component abstraction crates

The following crates provide HAL-like abstractions for subcomponents of embedded devices that go beyond what is available in embedded-hal:

  • accelerometer - Generic accelerometer support, including traits and types for taking readings from 2 or 3-axis accelerometers and tracking device orientations - crates.io
  • embedded-graphics: 2D drawing library for any size display - crates.io
  • radio - Generic radio transceiver traits, mocks, and helpers - crates.io
  • smart-leds: Support for addressable LEDs including WS2812 and APA102
  • usb-device: Abstraction layer between USB peripheral crates & USB class crates - crates.io
  • atat: Abstraction crate to ease writing AT based driver crates - crates.io
  • embedded-nal: An Embedded Network Abstraction Layer - crates.io
  • embedded-storage: An Embedded Storage Abstraction Layer
  • switch-hal: An "on"/"off" abstraction for input and output switches - crates.io

Driver crates

Platform agnostic crates to interface external components. These crates use the embedded-hal interface to support all the devices and systems that implement the embedded-hal traits.

The list below contains drivers that have achieved the "released" status. To add a driver to this list, please ensure that your driver has a short blog post, article, or sufficiently explanatory README showing an example of its use. Ideally, this post would demonstrate using the device in a small project so that a Rust and/or embedded newcomer can also understand it. Otherwise, please add it to the WIP section below.

  1. AD983x - SPI - AD9833/AD9837 waveform generators / DDS - Intro blog post - crates.io
  2. adafruit-alphanum4 - I2C - Driver for Adafruit 14-segment LED Alphanumeric Backpack based on the ht16k33 chip - crates.io
  3. ADE791x - SPI - ADE7912/ADE7913 3-Channel, Isolated, Sigma-Delta ADC - github - crates.io
  4. ADS1x1x - I2C - 12/16-bit ADCs like ADS1013, ADS1015, ADS1115, etc. - Intro blog post - crates.io
  5. ADXL313 - SPI - 3-axis accelerometer - crates.io
  6. ADXL343 - I2C - 3-axis accelerometer - crates.io
  7. ADXL355 - SPI - 3-axis accelerometer - Intro blog post - crates.io
  8. AFE4404 - I2C - Pulse oximeter - crates.io
  9. AHT20 - I2C - Humidity and temperature sensor - github - crates.io
  10. AHT20-driver - I2C - Humidity and temperature sensor - Intro blog post - github - crates.io
  11. AnyLeaf - I2C - pH sensor module - github - crates.io
  12. AT86RF212 - SPI - Low power IEEE 802.15.4-2011 ISM RF Transceiver - Intro blog post - crates.io
  13. BlueNRG - SPI - driver for BlueNRG-MS Bluetooth module - Intro post crates.io
  14. BMA400 - I2C/SPI - Bosch 12-bit 3-axis accelerometer - github crates.io
  15. BNO055 - I2C - Bosch Sensortec BNO055 9-axis IMU driver - Intro post crates.io
  16. CD74HC4067 - GPIO - 16-channel digital and analog multiplexer - Intro blog post - github - crates.io
  17. dht-sensor - 1-Wire - DHT11/DHT22 temperature/humidity sensor driver - github - crates.io
  18. DRV8825 - DRV8825 Stepper Motor Driver (based on Stepper) - Intro blog post - crates.io
  19. DS1307 - I2C - Real-time clock driver - Intro blog post - crates.io
  20. ebyte-e32 - SERIAL - Ebyte E32 LoRa module driver - Intro blog post - crates.io
  21. EEPROM24x - I2C - 24x series serial EEPROM driver - Intro blog post - crates.io
  22. embedded-ccs811 - I2C - Gas and VOC sensor driver for monitoring indoor air quality - Intro blog post - crates.io
  23. embedded-sdmmc - SPI - SD/MMC Card Driver with MS-DOS Partition and FAT16/FAT32 support - Intro post crates.io
  24. ENC28J60 - SPI - Ethernet controller - Intro blog post - crates.io
  25. FUSB302B - I2C - Programmable USB Type‐C Controller with USB Power Delivery - github
  26. HC-12 - SERIAL - Wireless serial transceiver module - Intro blog post - github - crates.io
  27. HTS221 - I2C - Humidity and temperature sensor - Intro blog post - crates.io
  28. IIS2MDC - I2C - ST's High accuracy, ultra-low-power, 3-axis digital output magnetometer - crates.io
  29. ISM330DHCX - I2C - ST's IMU with 3D accelerometer, 3D gyroscope, ML core and more - crates.io
  30. keypad - GPIO - Keypad matrix circuits - Intro post - crates.io
  31. KXCJ9 - I2C - KXCJ9/KXCJB 3-axis accelerometers - Intro blog post - crates.io
  32. L3GD20 - SPI - Gyroscope - Intro blog post - crates.io
  33. LSM303DLHC - I2C - Accelerometer + compass (magnetometer) - Intro blog post - crates.io
  34. MAX6675 - SPI - A driver for the MAX6675 digital thermocouple converter - Intro blog post - crates.io
  35. MAX6955 - I2C - Driver for Alphanumeric LED display driver - Intro blog post - crates.io
  36. MAX116xx-10bit - SPI - Driver for the MAX11619-MAX11621, MAX11624 and MAX11625 10-bit ADCs - Intro blog post - crates.io
  37. MCP25LCXX - SPI - Driver for Microchip's 25LC series of EEPROMs - crates.io
  38. MCP3008 - SPI - 8 channel 10-bit ADC - Intro blog post - crates.io
  39. MCP3425 - I2C - 16-bit ADC - Intro blog post - crates.io
  40. MCP794xx - I2C - Real-time clock / calendar driver - Intro blog post - crates.io
  41. MMA7660FC - I2C - 3-axis accelerometer - Intro blog post
  42. OPT300x - I2C - Ambient light sensor family driver - Intro blog post - crates.io
  43. PAC194X - I2C - Single/multi channel power monitor - Intro blog post - crates.io
  44. port-expander - I2C - Driver for I2C port expanders (supports PCA95xx, PCF85xx) - Intro blog post - crates.io
  45. pwm-pca9685 - I2C - 16-channel, 12-bit PWM/Servo/LED controller - Intro blog post - crates.io
  46. rainbow-hat-rs - I2C/SPI/GPIO - Pimoroni Rainbow HAT driver for Raspberry Pi - github - crates.io
  47. rotary-encoder-hal - GPIO - A rotary encoder driver using embedded-hal - Intro blog post - crates.io
  48. sega-controller - GPIO - Sega controller input - github - crates.io
  49. SGP30 - I2C - Gas sensor - Intro blog post - crates.io
  50. SH1106 - I2C - Monochrome OLED display controller - Intro post crates.io
  51. shared-bus - I2C - utility driver for sharing a bus between multiple devices - Intro post crates.io
  52. shift-register-driver - GPIO - Shift register - Intro blog post - crates.io
  53. Si4703 - I2C - FM radio turner (receiver) driver - Intro blog post - crates.io
  54. SRAM23x - SPI - Microchip 23x series serial SRAM/NVSRAM driver - Intro blog post - crates.io
  55. SSD1306 - I2C/SPI - OLED display controller - Intro blog post - crates.io
  56. SSD1309 - I2C/SPI - OLED display controller - Intro blog post - crates.io
  57. STSPIN220 - STSPIN220 Stepper Motor Driver (based on Stepper) - Intro blog post - crates.io
  58. Sx127x - SPI - Long Range Low Power Sub GHz (Gfsk, LoRa) RF Transceiver - Intro blog post - crates.io
  59. Sx128x - SPI - Long range, low power 2.4 GHz (Gfsk, Flrc, LoRa) RF Transceiver - Intro blog post - crates.io
  60. TC72 - SPI - Microchip TC72 temperature sensor - crates.io
  61. TCN75A - I2C - Microchip TCN75A temperature sensor - crates.io
  62. TMP006 - I2C - Contact-less infrared (IR) thermopile temperature sensor driver - Intro post crates.io
  63. TMP1x2 - I2C - TMP102 and TMP112x temperature sensor driver - Intro blog post crates.io
  64. TSIC - GPIO - TSIC 306 temperature sensor driver - Intro blog post crates.io
  65. TSL256X - I2C - Light Intensity Sensor - Intro blog post - crates.io
  66. VEML6030/VEML7700 - I2C - Ambient light sensors - Intro blog post - crates.io
  67. VEML6075 - I2C - UVA and UVB light sensor - Intro blog post - crates.io
  68. usbd-serial - USB CDC-ACM class (serial) implementation - github - crates.io
  69. usbd-hid - USB HID class implementation - github - crates.io
  70. usbd-hid-device - USB HID class implementation without unsafe - github - crates.io
  71. usbd-human-interface-device - Batteries included embedded USB HID library for usb-device. Includes concrete Keyboard (boot and NKRO), Mouse and Consumer Control implementations as well as support for building your own HID classes - github - crates.io
  72. usbd-midi - USB MIDI class implementation - github - crates.io
  73. usbd-webusb - USB webUSB class implementation - github - crates.io
  74. SHTCx - I2C - Temperature / humidity sensors - github - crates.io
  75. ST7789 - SPI - An embedded-graphics compatible driver for the popular lcd family from Sitronix used in the PineTime watch - github - crates.io
  76. DW1000 - SPI - Radio transceiver (IEEE 802.15.4 and position tracking) - Article - crates.io
  77. Adafruit-7segment - I2C - Driver for Adafruit 7-segment LED Numeric Backpack based on the ht16k33 chip - github - crates.io
  78. ST7565 - SPI - An embedded-graphics compatible driver for LCD displays based on the ST7565 chip - github - crates.io
  79. tb6612fng - A no_std driver for the TB6612FNG motor driver - Crates.io
  80. vl53l1x-uld - I2C - A pure-rust driver for the ST VL53L1X - crates.io
  81. i2c-multiplexer - I2C - An I2C Multiplexer library that supports the PCA9546 and TCA9546A chips - github - crates.io
  82. SHT31-rs - I2C - Fully supported SHT temperature / humidity sensors - github - crates.io

NOTE You may be able to find even more driver crates by searching for the embedded-hal-driver keyword on crates.io!

WIP

Work in progress drivers. Help the authors make these crates awesome!

  1. AD9850 - Embedded driver for the AD9850 DDS synthesizer chip - crates.io
  2. AFE4400 - SPI - Pulse oximeter
  3. APDS9960 - I2C - Proximity, ambient light, RGB, and gesture sensor - crates.io
  4. AS5048A - SPI - AMS AS5048A Magnetic Rotary Encoder
  5. AXP209 - I2C - Power management unit
  6. ad57xx - SPI - Quad and dual channel DAC - crates.io
  7. BH1750 - I2C - ambient light sensor (lux meter)
  8. BME280 - A rust device driver for the Bosch BME280 temperature, humidity, and atmospheric pressure sensor and the Bosch BMP280 temperature and atmospheric pressure sensor. crates.io
  9. bme680 - I2C - Temperature / humidity / gas / pressure sensor - crates.io
  10. BMI160 - I2C / SPI - Inertial Measurement Unit - crates.io
  11. BMP280 - A platform agnostic driver to interface with the BMP280 pressure sensor crates.io
  12. CC1101 - SPI - Sub-1GHz RF Transceiver - crates.io
  13. DS3231 - I2C - real-time clock
  14. DS3234 - SPI - Real-time clock
  15. DS323x - I2C/SPI - Real-time clocks (RTC): DS3231, DS3232 and DS3234 - crates.io
  16. epd-waveshare - SPI - driver for E-Paper Modules from Waveshare crates.io
  17. embedded-morse - Output morse messages - crates.io
  18. embedded-nrf24l01 - SPI+GPIO - 2.4 GHz radio
  19. Ft6x36 - I2C - Rust driver for focal tech touch screen FT6236, FT6336 - crates.io
  20. grove-matrix-led-my9221-rs - I2C - Rust driver for Grove RGB Matrix Led with my-9221 Driver - crates.io
  21. GridEYE - I2C - Rust driver for Grid-EYE / Panasonic AMG88(33) - crates.io
  22. HC-SR04 - DIO - Ultrasound sensor
  23. HD44780-driver - GPIO - LCD controller - crates.io
  24. HD44780 - Parallel port - LCD controller
  25. HM11 - USART - HM-11 bluetooth module AT configuration crate - crates.io
  26. HRS3300 - I2C - Heart rate sensor / monitor used in the PineTime smartwatch, for example. - crates.io
  27. HDC20xx - I2C - Temperature and humidity sensor compatible with HDC2080, HDC2021 and HDC2010. - crates.io
  28. hub75 - A driver for rgb led matrices with the hub75 interface - crates.io
  29. hzgrow-r502 - UART capacitive fingerprint reader - crates.io
  30. iAQ-Core - I2C - iAQ-Core-C/iAQ-Core-P Gas and VOC sensor driver for monitoring indoor air quality.
  31. ILI9341 - SPI - TFT LCD display
  32. INA260 - I2C - power monitor - crates.io
  33. ISL29125 - I2C - RGB Color Light Sensor with IR Blocking Filter - crates.io
  34. IST7920 - SPI monochrome LCD display - crates.io
  35. LM75 - I2C - Temperature sensor and thermal watchdog (also compatible with LM75A, LM75B, LM75C, AT30TS75A, DS1775, DS75, DS7505, G751, MAX7500/1/2/3/4, MAX6625, MCP9800/1/2/3, STDS75, TCN75, PCT2075) - crates.io
  36. lp586x - I2C/SPI - LED matrix driver crates.io
  37. LS010B7DH01 - SPI - Memory LCD
  38. LSM303C - A platform agnostic driver to interface with the LSM303C (accelerometer + compass) crates.io
  39. LSM9DS1 - I2C/SPI - 9-axis motion sensor module crates.io
  40. ltr-559 - I2C - Ambient Light Sensor and Proximity sensor crates.io
  41. lvgl - no_std LittleVGL port - crates.io
  42. M95320 - SPI - STMicroelectronics Serial flash EEPROM - crates.io
  43. MAG3110 - I2C - Magnetometer
  44. MAX17048/9 - I2C - LiPo Fuel gauge, battery monitoring IC - crates.io
  45. MAX170xx - I2C - LiPo Fuel gauge, battery monitoring ICs compatible with MAX17043/4, MAX17048/9, MAX17058/9.
  46. MAX3010x - I2C - Pulse oximeter and heart-rate sensor. ATM Compatible with MAX30102. -crates.io
  47. MAX31855 - SPI - Thermocouple digital converter -crates.io
  48. MAX31865 - SPI - RTD to Digital converter - crates.io
  49. MAX44009 - I2C - Ambient light sensor - crates.io
  50. MAX7219 - SPI - LED display driver - crates.io
  51. MCP4725 - I2C - 12-bit DAC - crates.io
  52. MCP49xx - SPI - 8/10/12-bit DACs like MCP4921, MCP4922, MCP4801, etc. - crates.io
  53. MCP9808 - I2C - Temperature sensor - crates.io
  54. MFRC522 - SPI - RFID tag reader/writer
  55. midi-port - UART - MIDI input - crates.io
  56. MLX9061x - I2C - MLX90614/MLX90615 Contact-less infrared (IR) temperature sensor driver. - crates.io
  57. motor-driver - Motor drivers: L298N, TB6612FNG, etc.
  58. MPU6050 - I2C - no_std driver for the MPU6050 crates.io
  59. MPU9250 - no_std driver for the MPU9250 (and other MPU* devices) & onboard AK8963 (accelerometer + gyroscope + magnetometer IMU) crates.io
  60. MS5637 - no_std I2C driver for the MS5637 temperature and pressure sensor crates.io
  61. NRF24L01 - SPI - 2.4 GHz wireless communication
  62. OneWire - 1wire - OneWire protocol implementation with drivers for devices such as DS18B20 - crates.io
  63. PCD8544 - SPI - 48x84 pixels matrix LCD controller
  64. PCD8544_rich - SPI - Rich driver for 48x84 pixels matrix LCD controller - crates.io
  65. PCF857x - I2C - I/O expanders: PCF8574, PCF8574A, PCF8575 crates.io
  66. radio-at86rf212 - SPI - Sub GHz 802.15.4 radio transceiver crates.io
  67. RFM69 - SPI - ISM radio transceiver
  68. RN2xx3 - Serial - A driver for the RN2483 / RN2903 LoRaWAN modems by Microchip
  69. SCD30 - I2C - CO₂ sensor - crates.io
  70. SHT2x - I2C - temperature / humidity sensors
  71. SHT3x - I2C - Temperature / humidity sensors
  72. SI5351 - I2C - clock generator
  73. SI7021 - I2C - Humidity and temperature sensor
  74. SPL06-007 - I2C - Pressure and temperature sensor - crates.io
  75. spi-memory - SPI - A generic driver for various SPI Flash and EEPROM chips - crates.io
  76. SSD1320 - SPI - Graphical OLED display controller - crates.io
  77. SSD1322 - SPI - Graphical OLED display controller - crates.io
  78. SSD1351 - SPI - 16bit colour OLED display driver - crates.io
  79. SSD1675 - SPI - Tri-color ePaper display controller - crates.io
  80. st7032i - I2C - Dot Matrix LCD Controller driver (Sitronix ST7032i or similar). - crates.io
  81. ST7735-lcd - SPI - An embedded-graphics compatible driver for the popular lcd family from Sitronix crates.io
  82. ST7920 - SPI - LCD displays using the ST7920 controller crates.io
  83. stm32-eth - MCU - Ethernet
  84. SX1278 - SPI - Long range (LoRa) transceiver
  85. SX1509 - I2C - IO Expander / Keypad driver
  86. TCS3472 - I2C - RGB color light sensor - crates.io
  87. TPA2016D2 - I2C - A driver for interfacing with the Texas Instruments TPA2016D2 Class-D amplifier - crates.io
  88. VEML6040 - I2C - RGBW color light sensor - crates.io
  89. VEML6070 - I2C - UVA light sensor - crates.io
  90. VEML7700 - I2C - Ambient light sensors - crates.io
  91. vesc-comm - A driver for communicating with VESC-compatible electronic speed controllers crates.io
  92. VL53L0X - A platform agnostic driver to interface with the vl53l0x (time-of-flight sensor) crates.io
  93. w5500 - SPI - Ethernet Module with hardwired protocols : TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE - crates.io
  94. xCA9548A - I2C - I2C switches/multiplexers: TCA9548A, PCA9548A - crates.io
  95. ublox-cellular-rs - Serial - Cellular driver for the full Ublox cellular serial based family
  96. atwinc1500-rs - SPI - A host driver for the Atwinc1500 network controller
  97. HX711 - GPIO - An interrupt-based driver for the HX711 Load Cell Amplifier IC. no-std.

no-std crates

#![no_std] crates designed to run on resource-constrained devices.

  1. adskalman: Kalman filter and Rauch-Tung-Striebel smoothing implementation. crates.io
  2. atomic: Generic Atomic wrapper type. crates.io
  3. bbqueue: A SPSC, statically allocatable queue based on BipBuffers suitable for DMA transfers - crates.io
  4. bitmatch: A crate that allows you to match, bind, and pack the individual bits of integers. - crates.io
  5. biquad: A library for creating second-order IIR filters for signal processing based on Biquads, where both a Direct Form 1 (DF1) and Direct Form 2 Transposed (DF2T) implementation is available. crates.io
  6. bit_field: manipulating bitfields and bitarrays - crates.io
  7. bluetooth-hci: device-independent Bluetooth Host-Controller Interface implementation. crates.io
  8. bounded-registers A high-assurance memory-mapped register code generation and interaction library. bounded-registers provides a Tock-like API for MMIO registers with the addition of type-based bounds checking. - crates.io
  9. cam-geom: Geometric models of cameras for photogrammetry. crates.io
  10. combine: parser combinator library - crates.io
  11. console-traits: Describes a basic text console. Used by menu and implemented by vga-framebuffer. crates.io
  12. cmim, or Cortex-M Interrupt Move: A crate for Cortex-M devices to move data to interrupt context, without needing a critical section to access the data within an interrupt, and to remove the need for the "mutex dance" - crates.io
  13. cmsis-dsp-sys: Rust FFI bindings to the Arm CMSIS_5 math library - crates.io
  14. dcmimu: An algorithm for fusing low-cost triaxial MEMS gyroscope and accelerometer measurements crates.io
  15. debouncr: A simple no-std input debouncer to detect rising/falling edges with minimal RAM requirements. crates.io
  16. device-driver: A toolkit to write better device drivers, faster. crates.io
  17. drogue-device: A distribution of tools and examples for building embedded applications in Rust.
  18. dummy-pin: Dummy implementations of the input/output pin traits. crates.io
  19. crossbus: A Platform-Less, Runtime-Less Actor Computing Model.
  20. ector: An async actor framework for embedded, based on embassy.
  21. embassy: A set of embedded async tools to make async/await a first-class option for embedded development
  22. embedded-cli: CLI library with autocompletion, subcommands, options, help and history support. crates.io
  23. embedded-crc-macros: Macros implementing portable CRC algorithms and build-time lookup table generation. crates.io
  24. embedded-update: Pluggable firmware update protocol for embedded devices.
  25. embedded-tls: A TLS 1.3 implementation that runs in a no-std environment.
  26. embedded-websocket: A lightweight server and client websocket library for embedded systems. crates.io
  27. endian_codec: (En/De)code rust types as packed bytes with specific order (endian). Supports derive. - crates.io
  28. ethercrab: A Rust implementation of the EtherCAT industrial automation protocol - crates.io
  29. fixed-fft: Fixed-point Fast Fourier Transform - Crates.io
  30. gcode: A gcode parser for no-std applications - crates.io
  31. gdbstub: zero-allocation, pure Rust implementation of the GDB Remote Serial Protocol - crates.io
  32. heapless: provides Vec, String, LinearMap, RingBuffer backed by fixed-size buffers - crates.io
  33. idsp: integer DSP algorithms (trigonometry, filtering, PLL...) tuned for precision and speed - crates.io
  34. ieee802154: Partial implementation of the IEEE 802.15.4 standard - crates.io
  35. infrared: infrared remote control library for embedded rust - crates.io
  36. intrusive-collections: intrusive (non-allocating) singly/doubly linked lists and red-black trees - crates.io
  37. inverted-pin: Implementations of the input/output pin traits with inverted logic. crates.io
  38. irq: utilities for writing interrupt handlers (allows moving data into interrupts, and sharing data between them) - crates.io
  39. lakers: Microcontroller-optimized EDHOC implementation, with bindings for C and Python - crates.io
  40. lorawan-encoding: A LoRaWAN packet codec.
  41. lorawan-device: A LoRaWAN MAC implementation supporting both event-driven and async mode.
  42. managed: provides ManagedSlice, ManagedMap backed by either their std counterparts or fixed-size buffers for #![no_std]. - crates.io
  43. menu: A basic command-line interface library. Has nested menus and basic help functionality. crates.io
  44. mqtt-sn: Implementation of the MQTT-SN protocol - crates.io
  45. microfft: Embedded-friendly (no_std, no-alloc) fast fourier transforms - crates.io
  46. micromath: Embedded Rust math library featuring fast, safe floating point approximations for common arithmetic operations, 2D and 3D vector types, and statistical analysis - crates.io
  47. miniconf: Lookup/enumerate/serialize/deserialize nodes in trees of heterogeneous structs/arrays by path/key - crates.io
  48. minimq: A minimal MQTT5 client designed for no_std platforms - crates.io
  49. moonboot: OTA Bootloader Construction Framework for Rust no_std environments, especially embedded devices without an OS
  50. nalgebra: general-purpose and low-dimensional linear algebra library - crates.io
  51. nom: parser combinator framework - crates.io
  52. null-terminated: generic null-terminated arrays - crates.io
  53. num-format: Crate for producing string representations of numbers, formatted according to international standards, e.g. "1,000,000" for US English - crates.io
  54. panic-persist: A panic handler crate inspired by panic-ramdump that logs panic messages to a region of RAM defined by the user, allowing for discovery of panic messages post-mortem using normal program control flow. - crates.io
  55. pc-keyboard: A PS/2 keyboard protocol driver. Transport (bit-banging or SPI) agnostic, but can convert Set 2 Scancodes into Unicode. crates.io
  56. qei : A qei wrapper that allows you to extend your qei timers from a 16-bit integer to a 64-bit integer. - crates.io
  57. qemu-exit: Quit a running QEMU session with user-defined exit code. Useful for unit or integration tests using QEMU. - crates.io
  58. RampMaker: Stepper Motor Acceleration Ramp Generator - crates.io
  59. register-rs: Unified interface for MMIO and CPU registers. Provides type-safe bitfield manipulation. register-rs is Tock registers with added support for CPU register definitions using the same API as for the MMIO registers. This enables homogeneous interfaces to registers of all kinds. - crates.io
  60. scapegoat: Safe, stack-only alternative to BTreeSet and BTreeMap. - crates.io
  61. scroll: extensible and endian-aware Read/Write traits for generic containers - crates.io
  62. Slint: Declarative GUI framework that works on microcontrollers. crates.io
  63. smbus-pec: Minimal portable System Management Bus Packet Error Code calculation algorithm. crates.io
  64. smoltcp: a small TCP/IP stack that runs without alloc. crates.io
  65. sntpc: Rust SNTP client to get a timestamp from NTP servers. - crates.io
  66. static-bytes: Help work with buffers without dynamic allocation. Implement traits from bytes crate. crate.io
  67. Stepper: Universal Stepper Motor Interface - crates.io
  68. tinybmp: No-std, no-alloc BMP parser for embedded systems. Introductory blog post - crates.io
  69. vga-framebuffer: A VGA signal generator and font renderer for VGA-less microcontrollers. Used by Monotron to generate 48 by 36 character display using 3 SPI peripherals and a timer. crates.io
  70. usb-pd: USB-PD library, supports using the FUSB302B as a Sink driver, with Source functionality planned.
  71. wyhash: A fast, simple and portable hashing algorithm and random number generator. - crates.io
  72. adafruit-bluefruit-protocol: A no_std parser for the Adafruit Bluefruit LE Connect controller protocol. - crates.io

WIP

Work in progress crates. Help the authors make these crates awesome!

  • light-cli: a lightweight heapless cli interface crates.io
  • OxCC: A port of Open Source Car Control written in Rust
  • Rubble: A pure-Rust embedded BLE stack crates.io

Firmware projects

  • rmk: Mechanical keyboard firmware for stm32/rp2040, supports vial/dynamic keymap/eeprom, written in Rust
  • anne-key: Alternate keyboard firmware for the Obins ANNE Pro
  • μLA: Micro Logic Analyzer for RP2040
  • air-gradient-pro-rs: Bootloader, firmware, and CLI tools for the AirGradient PRO
  • Stabilizer: Firmware for a DSP tool used in quantum physics experimentation, includes telemetry via MQTT and run-time configuration
  • Booster: Firmware for an RF power amplifier, including telemetry via MQTT and run-time configuration
  • Thermostat EEM: Firmware for a multi-channel temperature controller used in physics experiments
  • Card/IO ECG: Firmware for a business-card-sized ECG device with Wifi connectivity
  • BillMock: Firmware for credit card terminal add-on hardware to install on Korean arcade machines
  • LuLuu: Firmware for a custom RP2040-based display controller that streams animated images from a microSD card to a small LCD display.
  • prinThor: 3DPrinter/CNC/Engraver firmware framework powered by rust embassy for stm32 families and rp2040.

Old books, blogs, and training materials

These materials may be outdated and reflect earlier practices, but they might still be helpful for reference.

License

This list is licensed under

Code of Conduct

Contribution to this crate is organized under the terms of the Rust Code of Conduct, the maintainer of this crate, the Resources team, promises to intervene to uphold that code of conduct.

awesome-embedded-rust's People

Contributors

adamgreig avatar andre-richter avatar astro avatar berkus avatar bors[bot] avatar david-sawatzke avatar dbrgn avatar disasm avatar eldruin avatar fmckeogh avatar hannobraun avatar huntc avatar jamesmunns avatar jamwaffles avatar japaric avatar jkristell avatar jonlamb-gh avatar kellerkindt avatar little-arhat avatar mabezdev avatar memoryruins avatar rahul-thakoor avatar robamu avatar ryankurte avatar sergiogasquez avatar tarcieri avatar tdholmes avatar thejpster avatar therealprof avatar wez avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

awesome-embedded-rust's Issues

List of general purpose no-std crates

The list of no-std crates is currently empty!

We have collected a list of such crates in rust-embedded/wg#12 but the list hasn't been
updated in a long time. It now probably contains deprecated crates, crates that are no longer under
active development or crates that never achieved a "complete" (published and documented) state.

Help us review that old list and make a new list with the best parts of the old one. Also, it would
be great if the new list was split in categories to make it easier for readers to find what they are
looking for. The awesome Rust list may provide some inspiration for this
categorization task.

Track which crates build on stable

Now that Rust 2018 is almost upon us, embedded Rust crates can hope to start working on stable Rust. We should update the awesome-embedded-rust list to track which crates do or do not work on stable.

I imagine this being either a badge (but see #32) or a note or a new section.

Hopefully many crate authors will be update their listings themselves, but if not it is also hopefully not too much work to test arbitrary crates to find out. I think ideally our standard for inclusion should be "the project's public CI indicates it builds on stable".

Reorganise list?

The awesome-embedded-rust list has grown a lot over the last few years and it might be time to think about how we could reorganise the crates to help make it easier to navigate and find the crate you're looking for.

A few specific ideas we've had in the weekly meetings:

  • New section for shared abstractions, which overlaps somewhat with the current "component abstraction crates" but should probably be more obviously highlighted, containing things like embedded-hal, embedded-dma, embedded-nal, embedded-time/fugit, embedded-graphics, ...
  • Could compact some entries to reduce the page length, e.g. all HAL implementations for a specific chip on one line
  • Sort and group drivers by type of device, e.g. a section for accelerometers, a section for CO2 sensors, etc
  • Your idea here!

Decide what to do with HD44780/clerk crate

As pointed out by @JohnDoneth, @kunerd crate HD44780 is doing custom bitbanging via sysfs instead of using the embedded-hal traits which means that this driver does not fulfil the criteria for a "driver crate" as mentioned on the page:

Platform agnostic crates to interface external components. These crates use the embedded-hal interface to support all the devices and systems that implement the embedded-hal traits.

We could move it down a section to the no_std crates.

@kunerd What do you think?

discovery book clone for micro:bit

The discovery book is an amazing resource, but it uses very specific hardware.
I want to make a similar book but for the micro:bit (and only needing the micro:bit), as it is a board specifically made for teaching, and I think has wider availability and is cheaper. I have also explicitly tried to use a different structure and style where it made sense, just to see if it would work better.
If you want to take a look at a very early state: https://github.com/droogmic/microrust, obviously contributions are welcome.
I'd appreciate some help with the licensing though, as I don't want to infringe on japaric's copyright.

Add crates.io badges

To all the crates that have been published to crates.io. The markdown to add is:

![crates.io](https://img.shields.io/crates/v/$CRATE.svg)

The result should look like this for $CRATE = l3gd20:

RF24 support

Im an arduino user, diving into the depper lever of embedded, and would be useful to have the most common radio module support, the nordic rf24l01.... I hope I've helped!

Cortex-M Quickstart needs attention.

Sorry if this is the wrong place:
The Cortex-M Quickstart guide Docs.rs build 0.3.4 is failing with the following:
error[E0658]: The attribute 'panic_implementation' is currently unknown to the compiler and may have meaning added to it in the future (see issue #29642) --> .cargo/registry/src/github.com-1ecc6299db9ec823/panic-semihosting-0.3.0/src/lib.rs:71:1 | 71 | #[panic_implementation] | ^^^^^^^^^^^^^^^^^^^^^^^ | = help: add #![feature(custom_attribute)] to the crate attributes to enable

Also, the last built version (0.3.1) references using Nightly, which is no longer required for the Cortex-M.

Removal of Badges

Previously opened an issue about formatting and badge use on the awesome-rust list rust-unofficial/awesome-rust#419.

For awesome-embedded-rust, I propose continuing with the format we have now, which is the "simpler alternative" in the above link, except without any graphical badges (the graphical logo at the top looks fantastic, however). Removing the noise of misaligned badges, It's easier to read and especially to load. Bringing up now before the lists begin to grow, especially with the many crates to be added for no-std #2.

Update repo description and labels

Suggested repo title Curated list of resources for Embedded and Low-level development in Rust programming language

Suggested tags awesome-list, awesome, rust, embedded, embedded-systems, libraries

(copied from the old list)

Drone-os

I came a cross this library yesterday, thought I might put it here as I didn't see it here:
https://github.com/drone-os
I'm not very good with embedded so I am not sure which projects should be listed in here.

Where to put panic implementations?

There's quite a few panic implementations now, so I think it'd be useful to list them here. I'm not sure where exactly they should be put though, because some of them are platform-independent while others aren't. Personally I think these belong in their own section.

List of crates:

  • panic-halt: Halts the processor on panics
  • panic-abort: Causes an abort on panics (nightly-only)
  • panic-ramdump: Writes the panic message into the beginning of RAM and enters an infinite loop; the message can be extracted by attaching a debugger (Cortex-M only)
  • panic-semihosting: Prints the panic message via semihosting to an attached debugger (Cortex-M only)
  • panic-itm: Prints the panic through the chip's ITM to a debugger attached to the SWO pin (Cortex-M with ITM only)

Address list merger issues

This PR went in a bit overly quick and just after a rough review, I left a number of comments and nits which require addressing and possibly additional discussion hence this ticket.

Split up one list into easier digestible subpages

Even though the new awesome-embedded-rust project just started, it's already getting a bit unwieldy to read and edit so I'd like to split it up in more manageable chunks so for starters I'd like to take the crate heavy sections (i.e. Device crates, HAL implementations, BSP crates and Drivers) and put them each into their own .md file, move the vendor entries from the subsections to where the individual crates are now and make them into direct links to their new location (where available, drivers should also be categorized at some point).

Once that is done I'd like to follow up with enriching the content quite a bit and also to bring back the wish list/idea pool which @japaric started in rust-embedded/wg/issues/39.

Thoughts or comments?

Interest in MPU6050 driver crate?

The MPU6050 can be accessed with the MPU930 crate in your list. Nevertheless I wrote my own driver specifically for the MPU6050. Should I create a pr nevertheless?

Adding non development boards to board support crates section??

I wrote a board support crate, betafpv-f3, for a drone flight controller. Currently, the board support crates section of this repo says Crates tailored for specific development boards..

Is there any interest in listing board crates for more specialized boards like this? I was thinking possibly an Other category could be used to group them separately from the existing boards, but I wanted to discuss it before making a PR.

Trait crates: Automatically list users and implementers

Right now, while we provide links to crates roughly structured into "implements embedded-hal" and "uses embedded-hal" (driver crates). For the crates we list, that's easily managed manually, and we only list awesome stuff and that determination can not be made automatically yet.

The utility of embedded-hal is part of the awesomeness we want to demonstrate, and that not only comes from all the awesome crates, but also from the average ones that do boring foot work. (Not every sensor crate will have a blog post or even documentation exceeding "here's the class, and these are the constructors", especially if sensor abstractions take off and then there's really nothing to document than "this struct is for that device, pass in its I2C contact point and it provides the general accelerometer traits").

For these crates, it would be nice (maybe even awesome) to have lists of "who implements traits of that crate" or "who uses traits of that crate" easily accessible. This won't be part of a-e-r, but I don't know what it will be part of yet, but I know I eventually want entries like this:


Now how do we get there? (And this is where it starts to become a bit of a scatchpad, which I hope is OK because the top half should illustrate why it belongs here too).

Starting points are:

  • We currently have this manually for one crate with the embedded-hal-impl & co keywords. (People forget that, and it doesn't scale).
  • crates.io has dependencies, which is a good starting point -- to implement and use a crate's traits you have to depend on it (at least indirectly, if the direct dependency pub uses something).
  • rustdoc has the data as it lists implementations of a crate. It doesn't list implementers across crates in the HTML version, but it lists what is implemented for a struct, and having the information in one direction is enough (the rest is indexing / database management).

I've peeked into the output of rustdoc [lot of args from strace -f -eexecve cargo doc] -Z unstable-options --output-format json --document-private-items --document-hidden-items (private and hidden items because my test crate is embedded-nal-minimal-coaptcpserver which implements coap-message, but doesn't have a public type that does so and only passes around the implementation through as an impl MinimalWritableMessage).

Gold for the "X implements Y" side was found in an item ["index"]["0:14"], which has ["kind"] = "impl" and an ["inner"] that is has the ["for"]["inner"]["id"] = "0:4" of an item of this crate (the non-public Message) and a ["trait"]["inner"]["id"] = "20:22" of the MinimalWritableMessage trait it implements.

(The other side will be a bit harder, as "uses any implementation of" can occur in lots of places, but maybe some XPath magic can help.)

The data I think makes sense to extract is in a first stage is only on the crate level:

  • "minimal_coaptcpserver implements some trait of coap-message"
  • "minimal_coaptcpserver uses (by accepting any implementation of) some trait of coap-handler"

The information is available in more detail, and could gradually be expanded to which trait is shared, and (ultimately) which item of minimal_coaptcpserver implements which trait and which item ("in which position" would be taking it too far) uses which trait. That ultimate stage is IMO best left to rustdoc only.

So, the data is there, and an extractor Can't Be That Hard^TM to write. But for where?

  • Can rustdoc be enhanced to the point where docs.rs makes this accessible?

    This would be nice but a bit backwards, as the first step would be the "ultimate" extension step of above across crates. (The "Implementors" section is currently largely empty if all implementations are in different crates -- see https://docs.rs/embedded-hal/0.2.6/embedded_hal/digital/v2/trait.InputPin.html#implementors for an example).

  • Can docs.rs provide it?

    They already provide the dependency graph, but barely look into the crates, so if they'd provide it as part of their API, I guess that data would need to come from somewhere.

  • If neither, what can host it?

    And how is it updated, especially in light of conflicting versions? (What breaks while everyone is still providing embedded-hal 0.2 but 1.0 is released?).

    For the time being, this wouldn't need to run across all crates; picking the pivot crates (embedded-hal etc) and regularly getting a list of their reverse dependencies should do for our purposes. Still, this needs to run somewhere. (Hosting as in output files is easy then, for it's just a static list of links).

Encourage common license policy with a "divergent special license" label in list

Contributions to the Embedded Rust Ecosystem should be published under the same license as Rust itself, embedded-hal and cortex-m-rtfm which is:

Licensed under either of

at your option.

Why? In a professional environment the license is of utmost importance. When you start a project and choose an ecosystem for embedded development you need to make sure that all code and drivers are released under compatible licenses. To ease this process I suggest that all code released under a divergent license should be labelled divergent special license.

At the same time the new divergent special license label will encourage code writers to join our common license policy. A common and coherent license policy constitutes the condition sine qua non for professional suitability. It supports our vision (To improve the productivity of embedded software development teams). Linux would not have been successful without its a common and coherent license policy.

In order to encourage a common license policy for Embedded Rust, I suggest that contributions are only fully accepted in this list, when they comply with the above licenses. Contributions published under divergent licenses can be listed, but should have a divergent special license label.

Is the "Adventures in Motion Control" blog series relevant here?

Over the last month or two I've been working on a blog series focused around designing and implementing a real-world embedded system (intro/all posts), primarily based on the experience I've gained programming CNC machines in the wild.

There are a lot of resources online based on the low-level details like peripheral crates and how to get code running, but I haven't seen much in the way of high-level architecture or how to make these sorts of embedded systems in a scalable way. That's what I'm trying to address with the aforementioned blog series.

However, the implementation itself is written using WASM instead of a real embedded device (everyone has a browser, not everyone has a STM32 dev board handy).

Is this sort of resource still relevant to the Awesome Embedded Rust list?

Add Sipeed as Vendor

Sipeed offers quite a few interesting very low cost RISC V boards, like the Sipeed Longan Nano.
The cpu - a GD32 - is officially supported by the RISC V Team, in this crate: https://github.com/riscv-rust/gd32vf103xx-hal

Adding Sipeed and a link to that Repo would be nice, so that people don't think there board isn't supported after they looked hear.

areWeEmbeddedYet.rs?

Just a suggestion. Let’s make this a arewe_yet website.

It would be a more “pragmatic rust” way of doing this. Generating markdown-based website from the readme won’t be hard and I am willing to do it. Forking another arewe_yet website that already has the ci setup would be good too.

Also the title is like that just for readability. I know snake case is better.

Industry success stories?

Time and again questions of "but is it production ready yet?" come up (latest).

Would it be within scope to gather links to commercial projects that publicly state that they're doing embedded Rust? I'm aware (and probably it should be pointed out) that such statements only always cover just the set of components they are using, and in the way they are using them. Still, I think it'd help answer these questions, and be a useful resource for developers who want to explore embedded Rust in their companies. It may also be a convenient place to cross-reference http://showcase.rust-embedded.org/ (which is more focused on community projects you can study).

To not send the opposite message, such a section should only be opened if there is actually material for it (which could be gathered here).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.