「基礎から学ぶ組込みRust」を学んだ雑感
1章 Rustと組込みシステム
2章 開発環境の準備
ここが一番大変ですね
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 |
3節 Rustツールチェインのインストール
省略
4節 エディタのインストール
省略
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ファイルをライブラリフォルダにコピーする |
3章 Rustの基本
4章 Wio Terminal
1節 ハードウェアの構成
省略
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チカ成功!
Lチカのコードを眺めて、最小設定の範囲を確認する
スクラッチの場合、下記の3点を行うことで最小限の設定ができるようだ
-
.cargo/config
ファイルをフォルダごとコピペ - tomlファイルの依存関係を確認
-
no_std
などのアトリビュートを与える
Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。
$ cargo hf2
[build]
target = "thumbv7em-none-eabihf"
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=-Tlink.x",
]
[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"
#![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);
}
}
組込みRustの場合configファイルが重要なようだ
5章 組込みRustの基礎知識
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関数を戻してはいけないらしいので、戻さない(!)宣言
2節 ビルド&書き込み
省略
3節 3mbedded-hal (HAL: Hardware Abstraction Layer, ハードウェア抽象化レイヤ)
よくわからないが、組込みにおけるlibクレート相当のこと?
6章 Wio Terminal搭載のデバイスを使う
1節 本章の読み方
省略
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
[build]
target = "thumbv7em-none-eabihf"
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=-Tlink.x",
]
[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"
//! 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();
}
}
}
3節 シリアル入出力/UART
スキップ
4節 タイマ/割り込み
スキップ
5節 ブザー/PWM
プログラム6-5 一定の周波数のブザーを鳴らし続けるプログラム
いつものテンプレート作成。
- プロジェクトフォルダ/.cargo/configファイルをフォルダごとコピペ
- tomlファイルの依存関係を確認
- サポートサイト](https://github.com/tomoyuki-nakabayashi/Embedded-Rust-from-Basics/blob/main/examples/wio_examples/examples/6-5-buzzer_simple.rs)のmain.rsをコピペ
main.rs
において注意すべき点
- ブザーがPins構造体のフィールド扱いとのこと
Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。
$ cargo hf2
# configファイルの内容は、脳死でコピペしても良さそうだ。
[build]
target = "thumbv7em-none-eabihf"
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=-Tlink.x",
]
[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"
//! 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);
}
}
5節(続) ブザー/PWM
プログラム6-5-2 ドレミを鳴らし続けるプログラム
いつものテンプレート作成。
- プロジェクトフォルダ/.cargo/configファイルをフォルダごとコピペ
- tomlファイルの依存関係を確認
- サポートサイトのmain.rsをコピペ
main.rs
において注意すべき点
- ブザーやモーターを作動させ続ける場合、オーバーヒート対策としてデューティ比を設定する
Wio TerminalとホストPCをUSBケーブルでつないで、電源スイッチを素早く2回下に押し込んで、Wio Terminalをブートローダーモードに切り替える。
ブートローダーモードになったら、下記のコマンドを実行すると、プログラムがコンパイルされる。
$ cargo hf2
# configファイルの内容は、脳死でコピペしても良さそうだ。
[build]
target = "thumbv7em-none-eabihf"
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=-Tlink.x",
]
[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"
//! 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);
}
}
}
6節 光センサ/ADC
スキップ
7節 加速度センサ
スキップ
7章 LCD表示
1節 embedded-graphics
スキップ
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;
- error[E0412]: cannot find type
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0425]: cannot find function, tuple struct or tuple variant
- 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;
- error[E0425]: cannot find function, tuple struct or tuple variant
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0425]: cannot find function, tuple struct or tuple variant
- 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;
- error[E0425]: cannot find function
- 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;
- error[E0412]: cannot find type
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0425]: cannot find function
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0412]: cannot find type
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0425]: cannot find function
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0405]: cannot find trait
- 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;
- error[E0405]: cannot find trait
- 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 cratelibc
- 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;
- error[E0412]: cannot find type
- 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 cratelibc
- 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;
- error[E0412]: cannot find type
- 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 cratelibc
- 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;
- error[E0412]: cannot find type
- 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 cratelibc
- 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;
- error[E0412]: cannot find type
- 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;
- error[E0531]: cannot find tuple struct or tuple variant
- 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;
- error[E0531]: cannot find tuple struct or tuple variant
- 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;
- error[E0425]: cannot find function, tuple struct or tuple variant
- 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 cratelibc
- 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,
他にもたくさん
- error[E0412]: cannot find type
- C:\Users\「ユーザーフォルダ」.cargo\registry\src\index.crates.io-6f17d22bba15001f\weezl-0.1.7\src\error.rs:20:17
8章 アプリケーション作成
その他
画面に直線を描画するだけでも四苦八苦しているので、最小構成を調べて逐次付け足していくことにします。
最小構成(何も起きない)プログラム
コンパイルが通る最低限の構成は下記のようだ。
# 必須ファイル
# .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必須
{
}
}