課題

あなたは今、課題に取り組むための準備ができています! あなたのタスクは、この章の初めに見せたアプリケーションを実装することです。

GIF画像を再掲載します。

こちらも助けになるでしょう。

これはタイミング図です。この図は、どのLEDがどの時点で点灯しているか、および、各LEDを点灯させる時間を示しています。 X軸はミリ秒単位です。このタイミング図は、1周期を示しています。このパターンを、800ミリ秒ごとに繰り返します。 Y軸は、各LEDのラベルを北、東、などの方位で名づけています。 課題の一部として、Leds配列のどの要素が、これらの方位点にマッピングされるかを見つけ出す必要が有ります(ヒント:cargo doc --open ;-))。

この課題に取り組む前に、最後の助言です。GDBセッションでは、常に同じコマンドを最初に入力することになります。 GDBを起動した直後に、いくつかのコマンドを実行するために、.gdbファイルを使うことができます。 この方法により、各GDBセッションごとに手動でコマンド入力する労力を、減らすことができます。

次のopenocd.gdbファイルをCargoプロジェクトのルート、つまりCargo.tomlのすぐ隣に、置いて下さい。。

$ cat openocd.gdb
target remote :3333
load
break main
continue

次に、.cargo/configファイルの2行めを修正します。

$ cat .cargo/config
[target.thumbv7em-none-eabihf]
runner = "arm-none-eabi-gdb -q -x openocd.gdb" # <-
rustflags = [
  "-C", "link-arg=-Tlink.x",
]

これで、自動的にプログラムをFlashに書き込んで、mainの先頭にジャンプするgdbセッションを開始できるはずです。

$ cargo run --target thumbv7em-none-eabihf
     Running `arm-none-eabi-gdb -q -x openocd.gdb target/thumbv7em-none-eabihf/debug/led-roulette`
Reading symbols from target/thumbv7em-none-eabihf/debug/led-roulette...done.
(..)
Loading section .vector_table, size 0x188 lma 0x8000000
Loading section .text, size 0x3b20 lma 0x8000188
Loading section .rodata, size 0xb0c lma 0x8003cc0
Start address 0x8003b1c, load size 18356
Transfer rate: 20 KB/sec, 6118 bytes/write.
Breakpoint 1 at 0x800018c: file src/05-led-roulette/src/main.rs, line 9.
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, main () at src/05-led-roulette/src/main.rs:9
9           let (mut delay, mut leds): (Delay, Leds) = aux5::init();
(gdb)