やはりクロス環境はDockerが簡単(失敗編)

本命だろうと思うDockerでやってみる。以前に、

https://isehara-3lv.sakura.ne.jp/blog/2023/04/22/dockerでgolangのbuild環境を作る/

で作成しているDockerのコンテナ起動して、コンソールからRustインストールすると当たり前にコンパイルできる。crossを使わなくてcargoで普通に管理できるからやはりこれが本命。

ペリフェラルを使うためのライブラリは、

https://github.com/golemparts/rppal

を使うのが一般的のようなのでこれを使ってみます。基本のLチカというサンプルがあったので、GPIOを使ったサンプルプログラムをビルドしてみました。

https://misoji-engineer.com/archives/rust-led.html

このソースのままでmain.rsにコピーしてcargo buildでコンパイルが完了しました。

コンパイル前には、Cargo.tomlの[dependencies]にrppalの追加が必要です。Rustは必要なライブラリをソースコードとは別に定義ファイルで管理するようになっています。

# cat Cargo.toml
[package]
name = "led_blink"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rppal = "0.14.0"

初回はrppalのコンパイルも入るので多少時間はかかりますが、次回からは短縮されるはずです。

# cargo build
    Updating crates.io index
  Downloaded rppal v0.14.1
  Downloaded libc v0.2.147
  Downloaded 2 crates (766.8 KB) in 0.86s
   Compiling libc v0.2.147
   Compiling rppal v0.14.1
   Compiling led_blink v0.1.0 (/root/rust/led_blink)
    Finished dev [unoptimized + debuginfo] target(s) in 21.72s

P.S. (2023/8/5)

ラズパイzeroに転送して実行させると、

$ ./led_blink
Illegal instruction

と言われた、ラズパイzero上にRustをインストールしてビルドさせるとおよそ2分でビルド出来たから、実機ビルドでも取り敢えず許容範囲。

<実行させたコード:0.1秒ごとにハイ・ローを切り替え>

extern crate rppal;

use std::error::Error;
use std::thread;
use std::time::Duration;

use rppal::gpio::Gpio;

const GPIO_LED1: u8 = 17;
const GPIO_LED2: u8 = 27;

fn main() -> Result<(), Box> {

    let mut led1 = Gpio::new()?.get(GPIO_LED1)?.into_output();
    let mut led2 = Gpio::new()?.get(GPIO_LED2)?.into_output();

    // Blink the LED by setting the pin's logic level high for 1000 ms.
    loop{
        led2.set_high();
        led1.set_high();
        thread::sleep(Duration::from_millis(100));
        
        led1.set_low();
        led2.set_low();
        thread::sleep(Duration::from_millis(100));
    }
}

確認はピンの信号波形をオシロで観察、

 

admin

カテゴリーRust