Open18

組み込みRustの作業録

wintwint

セットアップ

chapter 2

tools

https://crates.io/crates/cargo-generate

https://crates.io/crates/hf2-cli

https://crates.io/crates/cargo-hf2

Install:

cargo install cargo-generate
cargo install hf2-cli cargo-hf2

udev rules

/etc/udev/rules.d/99-seeed-boards.rules:

ATTRS{idVendor}=="2886", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2886", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2886", MODE="0666"

Reload:

sudo udevadm control --reload-rules

serial devices r/w

sudo adduser $USER dialout

https://github.com/tomoyuki-nakabayashi/Embedded-Rust-from-Basics

https://docs.rust-embedded.org/book/intro/install.html

Third party cargo subcommands:
https://github.com/rust-lang/cargo/wiki/Third-party-cargo-subcommands

wintwint

chapter 4

Lチカ

https://github.com/tomoyuki-nakabayashi/wio-terminal-blink-rs

from template

https://github.com/tomoyuki-nakabayashi/wio-blink-template

coding error

with rust-analyser:

can't find crate for `test`
can't find crate rustc (E0463)

ref: another plugin

https://github.com/rust-lang/vscode-rust/issues/729#issuecomment-591350776

solution:

https://github.com/rust-analyzer/rust-analyzer/issues/3801#issuecomment-607145286

{
    "rust-analyzer.checkOnSave.allTargets": false,
    "rust-analyzer.checkOnSave.extraArgs": [
        "--target",
        "thumbv7m-none-eabi"
    ]
}
wintwint

DEBUG UART

事象

echo back されないんだが…

1文字ずつされてました

ログ

  • writeln! をコピペして適当にデバッグ出力を入れたら表示が出た
  • 読み取りのたびにLEDを光らせられた
      let mut user_led = sets.user_led.into_push_pull_output(&mut sets.port);
    
  • 完全に共通コードなのに表示されないのはなぜ?
      nb::block!(serial.write(c)).unwrap();
    

結論

リモートエコーバックでちゃんと1文字ずつ出てた。ローカルエコーバックが有効になってると思い込んでた。そのため、1キー入力のたびに2文字が出るものと思い込んでた。

最初からちゃんと動いてた。

wintwint

panic handler

ch. 6.3

排他 lock

https://docs.rust-embedded.org/book/concurrency/

TODO

以下のパターンをメソッドに共通化したい

_.borrow(cs).borrow_mut().deref_mut()

インターフェイスに対して実装できそうだが…?

impl<T> Mutex<RefCell<T>> { ... }
  • Mutex は bare_metal::Mutex
  • cs は interrupt::free から来る &CriticalSection

解法

  • trait を定義して、それに対して実装する
  • マクロを書く
  • シンプルに函数にする
wintwint

timer

6.4

誤植

Cargo.toml のパッケージ定義が wio-example なのに wio_examples::Led で参照してる。警告が出る。

推測

cargo generate--name wio_examples してなかったからかも知れない。フォルダ名が自動で wio-example になってる。

wintwint

6.6

誤植

p. 227

  • OneShoOneShot

疑問

  • #[cfg(feature = "unproven")] ってなんだ?
wintwint

6.7

I²C

  • device ID

加速度センサー

誤植

  • リアル通信 → シリアル通信
wintwint

ch. 7

LCD

embedded-graphics

trial

ここで別プロジェクトを作ってライブラリを試す

自前 Drawable

impl とかが分かった。