組み込みRustの作業録
組み込みRust
やっていき
書籍情報
機器情報
セットアップ
chapter 2
tools
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
links
Third party cargo subcommands:
chapter 4
Lチカ
from template
coding error
with rust-analyser:
can't find crate for `test`
can't find crate rustc (E0463)
ref: another plugin
solution:
{
"rust-analyzer.checkOnSave.allTargets": false,
"rust-analyzer.checkOnSave.extraArgs": [
"--target",
"thumbv7m-none-eabi"
]
}
no_std
なら main
を使えない以上、自動で no_main
を付けて良いのでは?
参考
!
return type、戻らないのか。継続っぽい[要出典]
HAL: 共通化インターフェイス
組み合わせ爆発の増加数を掛け算から足し算に落とす (log)。
chapter 6
from scratch
preparation
base template:
try out examples
commands are in the source.
cargo hf2 --example 6-2-led_and_button
UART
USB ↔ Serial
hardware:
USBシリアル変換モジュール (3.3V)
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文字が出るものと思い込んでた。
最初からちゃんと動いてた。
panic handler
ch. 6.3
排他 lock
panic handler
ch. 6.3
排他 lock
TODO
以下のパターンをメソッドに共通化したい
_.borrow(cs).borrow_mut().deref_mut()
インターフェイスに対して実装できそうだが…?
impl<T> Mutex<RefCell<T>> { ... }
- Mutex は bare_metal::Mutex
- cs は interrupt::free から来る
&CriticalSection
解法
- trait を定義して、それに対して実装する
- マクロを書く
- シンプルに函数にする
timer
6.4
誤植
Cargo.toml
のパッケージ定義が wio-example
なのに wio_examples::Led
で参照してる。警告が出る。
推測
cargo generate
で --name wio_examples
してなかったからかも知れない。フォルダ名が自動で wio-example
になってる。
6.5
6.6
誤植
p. 227
-
OneSho
→OneShot
疑問
-
#[cfg(feature = "unproven")]
ってなんだ?
6.7
I²C
- device ID
加速度センサー
誤植
- リアル通信 → シリアル通信
シリアル通信
ch. 7
LCD
embedded-graphics
trial
ここで別プロジェクトを作ってライブラリを試す
自前 Drawable
impl
とかが分かった。