Closed33

「基礎から学ぶ組込みRust」を学んだ雑感

Tremendous1192Tremendous1192

はじめに

これまで数値計算メインに学んできましたが、ハードとの連携を学びたくなりました。
そこで表題の書籍を学んだ雑感をまとめてみたいと思います。

章別にまとめてみようと思います。

Tremendous1192Tremendous1192

2章 開発環境の準備

ここが一番大変ですね

Tremendous1192Tremendous1192

2節 本書での開発方法と構築する環境の概要

インストール物 分類 メモ
Rustコンパイラ(1.49以上) Rustツールチェイン 素晴らしいインストラクションに従って導入
リンカ(Cコンパイラ) Rustツールチェイン インストラクション
クロスビルドツールチェイン Rustツールチェイン rustup target add thumbv7em-none-eabihf
VS Code エディタ インストラクション
rust-analyzer エディタ インストラクション
cargo-hf2/hf2-cli(0.3.1以上) Wio Terminal開発環境 Text
シリアルデバイス Wio Terminal開発環境 Text
シリアルターミナル Wio Terminal開発環境 Text
git 開発補助ツール Text
cargo-generate 開発補助ツール Text
SDL2(2.0.0以上) 開発補助ツール Text
Tremendous1192Tremendous1192

5節 Wio Terminal開発環境と開発補助ツール

Wio Terminal向けの開発環境

セットアップ物 説明 メモ
cargo-hf2 Wio Terminalにファームウェアを書き込むためのサブコマンド Text
hf2-cli cargo-hf2と同様の機能を果たすコマンドラインインターフェースアプリケーション Text
シリアルデバイス Wio TerminalとUARTでシリアル通信するドライバのインストールや権限を設定する Text
シリアルターミナル 知り合う\るデバイスとデータの送受信を行うターミナルWindowsではTera Termをインストール 504 Time outエラーが良く出てくる

開発補助ツール

セットアップ物 説明 メモ
git ソースコード取得などに利用する Text
cargo-generate テンプレートからRustのプロジェクトを生成するCargoサブコマンド Text
SDL2 2Dグラフィックスの表示で利用する SDL2-devel-2.0.14-VC.zipをダウンロードして.libファイルをライブラリフォルダにコピーする
Tremendous1192Tremendous1192

4章 Wio Terminal

Tremendous1192Tremendous1192

2節 Lチカ

サンプルパッケージをcloneして、cloneしたディレクトリに移動する

$ git clone https://github.com/tomoyuki-nakabayashi/wio-terminal-blink-rs
$ cd wio-terminal-blink-rs

Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
青いLEDがゆっくり点滅しているとブートローダーモードの証のようだ。

ブートローダーモードになったら、下記のコマンドを実行する。

$ cargo hf2

本体のLEDが1秒間隔で点滅するとLチカ成功!

Tremendous1192Tremendous1192

Lチカのコードを眺めて、最小設定の範囲を確認する

スクラッチの場合、下記の3点を行うことで最小限の設定ができるようだ

  • .cargo/configファイルをフォルダごとコピペ
  • tomlファイルの依存関係を確認
  • no_stdなどのアトリビュートを与える

Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。

$ cargo hf2
プロジェクトフォルダ/.cargo/config
[build]
target = "thumbv7em-none-eabihf"

[target.thumbv7em-none-eabihf]
rustflags = [
  "-C", "link-arg=-Tlink.x",
]
Cargo.toml
[package]
name = "wio-terminal-blink-rs"
version = "0.1.0"
authors = ["tomoyuki-nakabayashi <tomo.wait.for.it.yuki@gmail.com>"]
edition = "2018"

[dependencies]
# Wio Terminalを使用可能にするクレート
wio_terminal = "0.3.0"
# パニック発生時に停止させない(?)
panic-halt = "0.2"

main.rs
#![no_std]
#![no_main]
// no_std: coreクレートを用いてコンパイルする宣言
// https://tomoyuki-nakabayashi.github.io/embedonomicon/smallest-no-std.html
// WindowsやmacOSなどの通常のOS以外で使用するという宣言
// C#で言う.net standardに近いのか?

// no_main: エントリポイントとして標準のmain関数を使わないプログラムであることを意味するアトリビュート
// どういうことだ?

//! Wio TerminalのLチカサンプルプログラム

// パニック時対応のクレート
// as _; という使い方を初めて見た
use panic_halt as _;
// wio_terminalを使用するためのクレート
// 書籍の情報は0.3.0である
// https://crates.io/crates/wio_terminal/0.3.0
// https://docs.rs/wio_terminal/0.3.0/wio_terminal/
use wio_terminal as wio;

//
use wio::hal::clock::GenericClockController;
// Wio Terminalの遅延機能を使えるようにする
use wio::hal::delay::Delay;
// よくわからない中核機能
use wio::pac::{CorePeripherals, Peripherals};
use wio::prelude::*;
// entry: 組込み用のエントリーポイントのアトリビュート
// Pins, Sets: 入出力用の構造体
use wio::{entry, Pins, Sets};

#[entry]
fn main() -> ! {
    // よくわからない核
    let mut peripherals = Peripherals::take().unwrap();
    let core = CorePeripherals::take().unwrap();

    // Wio Terminal内部の時計インスタンスの生成
    let mut clocks = GenericClockController::with_external_32kosc(
        peripherals.GCLK,
        &mut peripherals.MCLK,
        &mut peripherals.OSC32KCTRL,
        &mut peripherals.OSCCTRL,
        &mut peripherals.NVMCTRL,
    );
    let mut delay = Delay::new(core.SYST, &mut clocks);

    // 入出力機能インスタンスの生成
    let mut sets: Sets = Pins::new(peripherals.PORT).split();
    let mut user_led = sets.user_led.into_push_pull_output(&mut sets.port);

    // 定期的に内臓LEDを点滅させる
    let interval: u16 = 1000u16;
    loop {
        user_led.toggle();
        delay.delay_ms(interval);
    }
}

Tremendous1192Tremendous1192

5章 組込みRustの基礎知識

Tremendous1192Tremendous1192

1節 「no_std」なRust

組込みの常識を学びました

#![no_std] // WindowsやmacOS等の通常のOS以外で動作することの宣言
#![no_main] // 通常はコンパイラがmain関数を起動するコードを生成するらしいが、no_mainは起動コード生成を中止する宣言のようだ

use panic_halt as _; // どうやらno_stdにpanicの設定がないらしいので、組込みRustにpanicを持ち込む宣言のようだ
#[entry] // 組込みRustのエントリーポイント宣言

fn main() -> ! // ファームウェアはmain関数を戻してはいけないらしいので、戻さない(!)宣言
Tremendous1192Tremendous1192

3節 3mbedded-hal (HAL: Hardware Abstraction Layer, ハードウェア抽象化レイヤ)

よくわからないが、組込みにおけるlibクレート相当のこと?

Tremendous1192Tremendous1192

6章 Wio Terminal搭載のデバイスを使う

Tremendous1192Tremendous1192

2節 LEDとボタン/GPIO

一週目の読書ではよくわからなかったので先駆者のコードをコピペして勉強する。

プログラム6-2 ボタン1(上側の一番右側のボタン)を押したときにLEDを点灯させるプログラム

最初に脳死でテンプレート作成。

  • プロジェクトフォルダ/.cargo/configファイルをフォルダごとコピペ
  • tomlファイルの依存関係を確認
  • サポートサイトのmain.rsをコピペ

main.rsにおいて注意すべき点は、下記の2点

  • 入出力関係の初期化が手間だが、横着しないこと
  • 入出力でエラーがでない(!?)ので、unwrap()を末尾につけること

Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。

$ cargo hf2
プロジェクトフォルダ/.cargo/config
[build]
target = "thumbv7em-none-eabihf"

[target.thumbv7em-none-eabihf]
rustflags = [
  "-C", "link-arg=-Tlink.x",
]
Cargo.toml
[package]
name = "button_led_test"
version = "0.1.0"
edition = "2021"

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

[dependencies]
# Wio Terminalを使用可能にするクレート
wio_terminal = "0.3.0"
# 組込みRustの世界でpanicを使用できるようにするクレートのようだ
panic-halt = "0.2"
main.rs
//! Windows, macOS以外のOS宣言
#![no_std]
//! main関数を最初に実行させるコードの生成を阻止する
#![no_main]

// 組込みRustの世界にpanicを持ち込む
use panic_halt as _;
// Wio Terminalを扱うためのあれこれ
use wio_terminal as wio;

// エントリーポイント宣言
use wio::entry;
// ペリフェラルアクセスクレート
// 多重アクセスを防ぐ仕組み(?)
use wio::pac::Peripherals;
use wio::prelude::*; // 主要な構造体やトレイトをインポートする

#[entry]
fn main() -> ! {
    // 初期化
    // ペリフェラルアクセスクレートのインスタンス
    let peripherals = Peripherals::take().unwrap();
    // 入出力制御インスタンス
    let mut pins = wio::Pins::new(peripherals.PORT);
    // ユーザLEDを出力状態に設定する
    let mut led = pins.user_led.into_push_pull_output(&mut pins.port);
    // ボタン1を入力状態に設定する
    let button1 = pins.button1.into_floating_input(&mut pins.port);

    // 繰り返し処理
    loop {
        if button1.is_low().unwrap() {
            // ボタンが押されていればユーザLEDを点灯する
            led.set_high().unwrap();
        } else {
            // ボタンが押されていなければユーザLEDを消灯する
            led.set_low().unwrap();
        }
    }
}
Tremendous1192Tremendous1192

5節 ブザー/PWM

プログラム6-5 一定の周波数のブザーを鳴らし続けるプログラム

いつものテンプレート作成。

main.rsにおいて注意すべき点

  • ブザーがPins構造体のフィールド扱いとのこと

Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。

$ cargo hf2
プロジェクトフォルダ/.cargo/config
# configファイルの内容は、脳死でコピペしても良さそうだ。
[build]
target = "thumbv7em-none-eabihf"

[target.thumbv7em-none-eabihf]
rustflags = [
  "-C", "link-arg=-Tlink.x",
]
Cargo.toml
[package]
name = "wio_buzzer_test"
version = "0.1.0"
edition = "2021"

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

[dependencies]
# Wio Terminalを使用可能にするクレート
wio_terminal = "0.3.0"
# 組込みRustの世界でpanicを使用できるようにするクレートのようだ
panic-halt = "0.2"
main.rs
//! Windows, macOS以外のOS宣言
#![no_std]
//! main関数を最初に実行させるコードの生成を阻止する
#![no_main]

// 組込みRustの世界にpanicを持ち込む
use panic_halt as _;
// Wio Terminalを扱うためのあれこれ
use wio_terminal as wio;

// Wio Terminal内部の時計を使用する
use wio::hal::clock::GenericClockController;
// 時計内部の遅延機能の仕様
use wio::hal::delay::Delay;
// ペリフェラルアクセスクレート
// 多重アクセスを防ぐ仕組み(?)
// コアのほうはよくわからない
use wio::pac::{CorePeripherals, Peripherals};
// なんか色々と読み込む
use wio::prelude::*;
// エントリーポイントと入出力
use wio::{entry, Pins};

#[entry]
fn main() -> ! {
    // 初期化
    // ペリフェラルアクセスクレートのインスタンス
    let mut peripherals = Peripherals::take().unwrap();
    // 何らかのコア.遅延処理に使用する
    let core = CorePeripherals::take().unwrap();

    // 時計インスタンス
    let mut clocks = GenericClockController::with_external_32kosc(
        peripherals.GCLK,
        &mut peripherals.MCLK,
        &mut peripherals.OSC32KCTRL,
        &mut peripherals.OSCCTRL,
        &mut peripherals.NVMCTRL,
    );
    // 遅延処理
    let mut delay = Delay::new(core.SYST, &mut clocks);
    // 入出力
    let mut pins = Pins::new(peripherals.PORT);
    // ブザーはPins構造体のbuzzer_ctrフィールドとして定義されている
    let mut buzzer =
        pins.buzzer_ctr.into_push_pull_output(&mut pins.port);

    // 繰り返し処理
    let interval: u8 = 20u8;
    loop {
        // interval msec毎にbuzzerのオンオフを切り替える
        buzzer.toggle();
        delay.delay_ms(interval);
    }
}
Tremendous1192Tremendous1192

5節(続) ブザー/PWM

プログラム6-5-2 ドレミを鳴らし続けるプログラム

いつものテンプレート作成。

  • プロジェクトフォルダ/.cargo/configファイルをフォルダごとコピペ
  • tomlファイルの依存関係を確認
  • サポートサイトのmain.rsをコピペ

main.rsにおいて注意すべき点

  • ブザーやモーターを作動させ続ける場合、オーバーヒート対策としてデューティ比を設定する

Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。

$ cargo hf2
プロジェクトフォルダ/.cargo/config
# configファイルの内容は、脳死でコピペしても良さそうだ。
[build]
target = "thumbv7em-none-eabihf"

[target.thumbv7em-none-eabihf]
rustflags = [
  "-C", "link-arg=-Tlink.x",
]
Cargo.toml
[package]
name = "wio_buzzer_test"
version = "0.1.0"
edition = "2021"

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

[dependencies]
# Wio Terminalを使用可能にするクレート
wio_terminal = "0.3.0"
# 組込みRustの世界でpanicを使用できるようにするクレートのようだ
panic-halt = "0.2"
main.rs
//! Windows, macOS以外のOS宣言
#![no_std]
//! main関数を最初に実行させるコードの生成を阻止する
#![no_main]

// 組込みRustの世界にpanicを持ち込む
use panic_halt as _;
// Wio Terminalを扱うためのあれこれ
use wio_terminal as wio;

// Wio Terminal内部の時計
use wio::hal::clock::GenericClockController;
// 時計内部の遅延処理
use wio::hal::delay::Delay;
// 
use wio::hal::pwm::Channel;
// ペリフェラルアクセスクレート
// 多重アクセスを防ぐ仕組み(?)
// コアのほうはよくわからない
use wio::pac::{CorePeripherals, Peripherals};
// なんか色々と読み込む
use wio::prelude::*;
// エントリーポイントと入出力
use wio::{entry, Pins};

#[entry]
fn main() -> ! {
    // 初期化
    // ペリフェラルアクセスクレートのインスタンス
    let mut peripherals = Peripherals::take().unwrap();
    // クロックを初期化する
    let core = CorePeripherals::take().unwrap();
    let mut clocks = GenericClockController::with_external_32kosc(
        peripherals.GCLK,
        &mut peripherals.MCLK,
        &mut peripherals.OSC32KCTRL,
        &mut peripherals.OSCCTRL,
        &mut peripherals.NVMCTRL,
    );
    // 遅延処理
    let mut delay = Delay::new(core.SYST, &mut clocks);

    // ブザー(PWM)ドライバオブジェクトを初期化する
    let mut sets = Pins::new(peripherals.PORT).split();
    let mut buzzer = sets.buzzer.init(
        &mut clocks,
        peripherals.TCC0,
        &mut peripherals.MCLK,
        &mut sets.port,
    );

    //           ド   レ    ミ   ファ  ソ   ラ   シ   ド
    let freqs = [261, 294, 329, 349, 392, 440, 494, 523];

    // 繰り返し処理
    loop {
        // ドレミの音を1秒ずつ鳴らす
        for freq in freqs.iter() {
            // 周期(周波数)を設定する
            buzzer.set_period(freq.hz());
            // デューティ比を50%に設定する
            // 周期的な現象において、"ある期間" に占める "その期間で現象が継続される期間" の割合
            // オーバーヒート対策
            let max_duty = buzzer.get_max_duty();
            buzzer.set_duty(Channel::_4, max_duty / 2);

            // 1秒鳴らして止める
            buzzer.enable(Channel::_4);
            delay.delay_ms(1000u16);
            buzzer.disable(Channel::_4);
        }
    }
}
Tremendous1192Tremendous1192

7章 LCD表示

Tremendous1192Tremendous1192

2節 embedded-graphicsの基礎

上手くいかなかったから、rustup self uninstallしてやり直すことにしました。
難しい。

プログラム番号無し 画面に直線をプログラム

テンプレート作成。

  • プロジェクトフォルダ/.cargo/configファイルをフォルダごとコピペ
  • Cargo.tomlファイルと同じディレクトリにSDL2.dllをコピペする
  • tomlファイルの依存関係を確認
  • サポートサイトのmain.rsをコピペ

main.rsにおいて注意すべき点

  • 2023年7月14日時点ですごい量のエラーメッセージが出るので、適宜修正する
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\weezl-0.1.7\src\error.rs:20:17
      • error[E0412]: cannot find type Result in this scope
      • pub status: Result<LzwStatus, LzwError>,
      • help: consider importing one of these items
      • 1 + use core::fmt::Result;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:472:16
      • error[E0405]: cannot find trait Sync in this scope
      • unsafe impl<T> Sync for ScopedJoinHandle<'_, T> {}
      • 114 + use core::marker::Sync;
      • 114 + use core::marker::Send;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:464:9
      • error[E0425]: cannot find function, tuple struct or tuple variant Ok in this scope
      • 464 | Ok(ScopedJoinHandle {
      • 114 + use core::result::Result::Ok;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:458:46
      • error[E0425]: cannot find function, tuple struct or tuple variant Some in this scope
      • 458 | let handle = Arc::new(Mutex::new(Some(handle)));
      • 114 + use core::option::Option::Some;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:451:38
      • error[E0405]: cannot find trait FnOnce in this scope
      • 451 | let closure: Box<dyn FnOnce() + Send + 'static> =
      • 114 + use core::ops::FnOnce;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:193:17
      • error[E0425]: cannot find function, tuple struct or tuple variant Err in this scope
      • 193 | Err(Box::new(panics))
      • 114 + use core::result::Result::Err;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:170:5
      • error[E0425]: cannot find function drop in this scope
      • 170 | drop(scope.wait_group);
      • 114 + use core::mem::drop;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\thread.rs:131:34
      • error[E0412]: cannot find type Option in this scope
      • 131 | type SharedOption<T> = Arc<Mutex<Option<T>>>;
      • 114 + use core::option::Option;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\wait_group.rs:129:6
      • error[E0405]: cannot find trait Clone in this scope
      • 129 | impl Clone for WaitGroup {
      • 1 + use core::clone::Clone;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\wait_group.rs:119:6
      • error[E0405]: cannot find trait Drop in this scope
      • 119 | impl Drop for WaitGroup {
      • 1 + use core::ops::Drop;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\wait_group.rs:111:9
      • error[E0425]: cannot find function drop in this scope
      • 111 | drop(self);
      • 1 + use core::mem::drop;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\wait_group.rs:59:6
      • error[E0405]: cannot find trait Default in this scope
      • 59 | impl Default for WaitGroup {
      • 1 + use core::default::Default;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:608:6
      • error[E0405]: cannot find trait Drop in this scope
      • 608 | impl Drop for Registration {
      • 1 + use core::ops::Drop;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:573:23
      • error[E0412]: cannot find type Option in this scope
      • 573 | fn current_index() -> Option<usize> {
      • 1 + use core::option::Option;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:559:10
      • error[E0405]: cannot find trait Sized in this scope
      • 559 | impl<T: ?Sized> DerefMut for ShardedLockWriteGuard<'_, T> {
      • 1 + use core::marker::Sized;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:531:17
      • error[E0425]: cannot find function drop in this scope
      • 531 | drop(guard);
      • 1 + use core::mem::drop;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:525:25
      • error[E0405]: cannot find trait Sync in this scope
      • 525 | unsafe impl<T: ?Sized + Sync> Sync for ShardedLockWriteGuard<'_, T> {}
      • 1 + use core::marker::Sync;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:480:9
      • error[E0405]: cannot find trait From in this scope
      • 480 | impl<T> From<T> for ShardedLock<T> {
      • 1 + use core::convert::From;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:476:26
      • error[E0405]: cannot find trait Default in this scope
      • 474 | impl<T: Default> Default for ShardedLock<T> {
      • 1 + use core::default::Default;
    • C:\Users\「ユーザーフォルダ」\source\RustApps\wio_draw_line_test\target\thumbv7em-none-eabihf\debug\build\sdl2-sys-60eaa7ebee90c4fa\out/sdl_bindings.rs:29511:35
      • error[E0412]: cannot find type c_void in crate libc
      • 29511 | pub reg_save_area: *mut libc::c_void,
      • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\sdl2-sys-0.32.6\src/lib.rs:12:1
      • 12 + use core::ffi::c_void;
    • C:\Users\「ユーザーフォルダ」\source\RustApps\wio_draw_line_test\target\thumbv7em-none-eabihf\debug\build\sdl2-sys-60eaa7ebee90c4fa\out/sdl_bindings.rs:29509:26
      • error[E0412]: cannot find type c_uint in crate libc
      • 29509 | pub fp_offset: libc::c_uint,
      • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\sdl2-sys-0.32.6\src/lib.rs:12:1
      • 12 + use core::ffi::c_uint;
    • C:\Users\「ユーザーフォルダ」\source\RustApps\wio_draw_line_test\target\thumbv7em-none-eabihf\debug\build\sdl2-sys-60eaa7ebee90c4fa\out/sdl_bindings.rs:29497:23
      • error[E0412]: cannot find type c_int in crate libc
      • 29497 | h: *mut libc::c_int,
      • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\sdl2-sys-0.32.6\src/lib.rs:12:1
      • 12 + use core::ffi::c_int;
    • C:\Users\「ユーザーフォルダ」\source\RustApps\wio_draw_line_test\target\thumbv7em-none-eabihf\debug\build\sdl2-sys-60eaa7ebee90c4fa\out/sdl_bindings.rs:29437:35
      • error[E0412]: cannot find type c_char in crate libc
      • 29437 | pNames: *mut *const libc::c_char,
      • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\sdl2-sys-0.32.6\src/lib.rs:12:1
      • 12 + use core::ffi::c_char;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:461:13
      • error[E0531]: cannot find tuple struct or tuple variant Err in this scope
      • 461 | Err(TryLockError::WouldBlock) => {
      • 1 + use core::result::Result::Err;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:453:13
      • error[E0531]: cannot find tuple struct or tuple variant Ok in this scope
      • 453 | Ok(guard) => f
      • 1 + use core::result::Result::Ok;
    • C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\crossbeam-utils-0.8.16\src\sync\sharded_lock.rs:432:25
      • error[E0425]: cannot find function, tuple struct or tuple variant Some in this scope
      • 432 | *dest = Some(guard);
      • 1 + use core::option::Option::Some;
      • 1 + use crate::sync::sharded_lock::Option::Some;
    • C:\Users\「ユーザーフォルダ」\source\RustApps\wio_draw_line_test\target\thumbv7em-none-eabihf\debug\build\sdl2-sys-60eaa7ebee90c4fa\out/sdl_bindings.rs:29511:35
      • error[E0412]: cannot find type c_void in crate libc
      • 29511 | pub reg_save_area: *mut libc::c_void,
      • 29511 - pub reg_save_area: *mut libc::c_void,
      • 29511 + pub reg_save_area: *mut c_void,
        他にもたくさん
Tremendous1192Tremendous1192

その他

画面に直線を描画するだけでも四苦八苦しているので、最小構成を調べて逐次付け足していくことにします。

Tremendous1192Tremendous1192

最小構成(何も起きない)プログラム

コンパイルが通る最低限の構成は下記のようだ。

「プロジェクト名」\.cargo\config
# 必須ファイル
# .cargoフォルダごとCargo.tomlファイルがあるディレクトリにコピペする
[build]
target = "thumbv7em-none-eabihf"

[target.thumbv7em-none-eabihf]
rustflags = [
  "-C", "link-arg=-Tlink.x",
]
[package]
name = "wio_lchika_2023_jul"
version = "0.1.0"
edition = "2021"

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

[dependencies]
wio_terminal = "0.6.1" # 必須クレート
panic-halt = "0.2" # 必須クレート
//! 組込みRustのおまじない
#![no_std] // 必須アトリビュート
#![no_main] // 必須アトリビュート
use panic_halt as _; // 必須クレート
use wio_terminal as wio; // 必須クレート
use wio::entry; // 必須クレート

#[entry] // 必須アトリビュート
fn main() -> ! {
    loop // 組込みはloop必須
    {

    }
}
このスクラップは2023/07/16にクローズされました