【Arduino工作〜発展編】RustでATmega328pのプログラムをビルドしてみる
※ 当ページには【広告/PR】を含む場合があります。
2021/03/22
目次
- 1. AVR-Rustでより簡単に組込プログラミング
- 2. Rustプログラミング手順
- 3. LLVM ERRORで止まる(2021年1月頃の報告)
- 4. まとめ
- 4-1. 参考サイト
- Arduinoへ直接書き込みする
- Raspberry Pi Pico関連
- 4-1. 参考サイト
AVR-Rustでより簡単に組込プログラミング
toolchainの環境構築
Debian/Ubuntu
apt-get
$ rustup --version
rustup 1.23.1 (3df2264a9 2020-11-30)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.51.0-nightly (c2de47a9a 2021-01-06)`
$ sudo apt-get install binutils gcc-avr avr-libc avrdude
$ rustup update
$ rustup toolchain install nightly
$ rustup component add rust-src --toolchain nightly
$ rustup override set nightly
$ rustc -Vv
rustc 1.51.0-nightly (c2de47a9a 2021-01-06)
binary: rustc
commit-hash: c2de47a9aa4c9812884f341f1852e9c9610f5f7a
commit-date: 2021-01-06
host: x86_64-unknown-linux-gnu
release: 1.51.0-nightly
avr-unknown-gnu-atmega328
$ rustc --print target-spec-json -Z unstable-options \
--target avr-unknown-gnu-atmega328 > avr-atmega328p.json
avr-atmega328p.json
{
"arch": "avr",
"atomic-cas": false,
"cpu": "atmega328",
"data-layout": "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8",
"eh-frame-header": false,
"exe-suffix": ".elf",
"executables": true,
"is-builtin": true,
"late-link-args": {
"gcc": [
"-lgcc"
]
},
"linker": "avr-gcc",
"linker-is-gnu": true,
"llvm-target": "avr-unknown-unknown",
"max-atomic-width": 0,
"pre-link-args": {
"gcc": [
"-mmcu=atmega328",
"-Wl,--as-needed"
]
},
"target-c-int-width": "16",
"target-pointer-width": "16"
}
cpu
-mmcu
{
//...
"cpu": "atmega328p",
//...
"pre-link-args": {
"gcc": [
"-mmcu=atmega328p",
//...
]
},
//...
}
Rustプログラミング手順
$ tree
.
├── Cargo.toml
├── src
│ └── main.rs
└── avr-atmega328p.json
[package]
name = "blink"
version = "0.1.0"
authors = ["Dylan McKay <me@dylanmckay.io>"]
edition = '2018'
[dependencies]
ruduino = "0.3"
ruduino
src/main.rs
#![feature(llvm_asm)]
#![no_std]
#![no_main]
use ruduino::Pin;
use ruduino::cores::current::{port};
#[no_mangle]
pub extern fn main() {
port::B5::set_output();
loop {
port::B5::set_high();
ruduino::delay::delay_ms(1000);
port::B5::set_low();
ruduino::delay::delay_ms(1000);
}
}
$ export AVR_CPU_FREQUENCY_HZ=16000000
$ cargo build -Z build-std=core --target avr-atmega328p.json --release
target/[デバイスのタイトル]/release
blink.elf
$ sudo avrdude -p m328p -c atmelice_isp -P usb -U flash:w:target/avr-atmega328p/release/blink.elf:e
LLVM ERRORで止まる(2021年1月頃の報告)
compiler_builtins
$ cargo build -Z build-std=core --target avr-unknown-gnu-atmega328 --release
Compiling compiler_builtins v0.1.39
Compiling nb v1.0.0
#...
Compiling embedded-hal v0.2.4
LLVM ERROR: Not supported instr: <MCInst 258 <MCOperand Reg:1> <MCOperand Imm:15> <MCOperand Reg:40>>
error: could not compile `compiler_builtins`
To learn more, run the command again with --verbose.
warning: build failed, waiting for other jobs to finish...
error: build failed
nightly-2021-01-07
$ rustup toolchain install nightly-2021-01-07
$ rustup component add rust-src --toolchain nightly-2021-01-07
$ rustup override set nightly-2021-01-07
まとめ
参考サイト
Arduinoへ直接書き込みする
Raspberry Pi Pico関連
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー