Giter VIP home page Giter VIP logo

Rust with AVR support

Gitter

This project adds support for the AVR microcontroller to Rust.

It uses the AVR-LLVM backend.

Caveats

While the stock libcore may be compiled, certain code patterns may still exercise code in LLVM that is broken or that produces miscompiled code. Looking for existing issues or submitting a new issue is appreciated!

Building and installation

This will compile Rust with AVR support. This will not create a fully-fledged cross-compiler, however, as it does not compile any libraries such as libcore or liblibc. To do this, the --target=avr-unknown-unknown flag must be passed to configure, which is not fully supported yet due to bugs.

First make sure you've installed all dependencies for building, as specified in the main Rust repository here. Then use the following commands:

Unix/Linux/*nix

# Grab the avr-rust sources
git clone https://github.com/avr-rust/rust.git --recursive

# Create a directory to place built files in
mkdir build && cd build

# Generate Makefile using settings suitable for an experimental compiler
../rust/configure \
  --enable-debug \
  --disable-docs \
  --enable-llvm-assertions \
  --enable-debug-assertions \
  --enable-optimize \
  --enable-llvm-release-debuginfo \
  --experimental-targets=AVR \
  --prefix=/opt/avr-rust

# Build the compiler, optionally install it to /opt/avr-rust
make
make install

# Register the toolchain with rustup
rustup toolchain link avr-toolchain $(realpath $(find . -name 'stage2'))

# Optionally enable the avr toolchain globally
rustup default avr-toolchain

Notes for macOS

The conventional install directory for macOS is /usr/local/avr-rust rather than the Linux default /opt/avr-rust, so before the steps below, you must:

  1. Edit build/config.toml to set prefix = '/usr/local/avr-rust'.
  2. Ensure /usr/local/avr-rust exists and has the correct permissions: sudo mkdir /usr/local/avr-rust && sudo chown ${USER}:admin /usr/local/avr-rust

Finally, realpath isn't included by default on macOS but is included in GNU Coreutils, so you can either brew install coreutils so the rustup toolchain... step works properly, or just use the explicit path (rustup toolchain link avr-toolchain /usr/local/avr-rust).

# Grab the avr-rust sources
git clone https://github.com/avr-rust/rust.git --recursive

# Create a directory to place built files in
mkdir build && cd build

# Generate Makefile using settings suitable for an experimental compiler
../rust/configure \
  --enable-debug \
  --disable-docs \
  --enable-llvm-assertions \
  --enable-debug-assertions \
  --enable-optimize \
  --enable-llvm-release-debuginfo \
  --experimental-targets=AVR \
  --prefix=/usr/local/avr-rust

# Build the compiler, install it to /usr/local/avr-rust
make
make install

# Register the toolchain with rustup
rustup toolchain link avr-toolchain /usr/local/avr-rust

# Optionally enable the avr toolchain globally
rustup default avr-toolchain

Usage

With Xargo (recommended)

Take a look at the example blink program.

Vanilla rustc

AVR support is enabled by passing the --target avr-unknown-unknown flag to rustc.

Note that the Rust libcore library (essentially required for every Rust program), must be manually compiled for it to be used, as it will not be built for AVR during compiler compilation (yet). Work is currently being done in order to allow libcore to be automatically compiled for AVR.

The AVR-Rust project's Projects

avr-config icon avr-config

Retrieve the target CPU frequency at runtime on Rust AVR projects

avr-mcu icon avr-mcu

Pragmatic access to AVR chip specifications

avr-rust.com icon avr-rust.com

avr-rust frontpage (to be made public once next official Rust nightly is released)

avr-std-stub icon avr-std-stub

Contains simple implementations of required language items that `libstd` normally defines on other targets

blink icon blink

A blinking LED program written in Rust for the AVR

compiler-rt icon compiler-rt

A fork of compiler-rt supporting AVR and compatible with Rust

delay icon delay

arduino-like delay routines based on busy-wait loops

libcore icon libcore

[deprecated, not needed anymore] A stripped-down version of Rust's libcore that used to be required for the AVR target

llvm icon llvm

"Temporary" fork of LLVM for Rust

ruduino icon ruduino

Reusable components for the Arduino Uno.

rust-legacy-fork icon rust-legacy-fork

[deprecated; merged upstream] A fork of the Rust programming language with AVR support

scripts icon scripts

A collection of avr-rust related scripts.

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.