解答例
あなたの解答は、どのようになりましたか?
私の解答は、次の通りです。
#![deny(unsafe_code)] #![no_main] #![no_std] use aux5::{Delay, DelayMs, LedArray, OutputSwitch, entry}; #[entry] fn main() -> ! { let (mut delay, mut leds): (Delay, LedArray) = aux5::init(); let ms = 50_u8; loop { for curr in 0..8 { let next = (curr + 1) % 8; leds[next].on().ok(); delay.delay_ms(ms); leds[curr].off().ok(); delay.delay_ms(ms); } } }
もうひとつ!あなたの解答が「release」モードでコンパイルしても動作するか、確認して下さい。
$ cargo build --target thumbv7em-none-eabihf --release
次のgdb
コマンドでテスト可能です。
$ # or, you could simply call `cargo run --target thumbv7em-none-eabihf --release`
$ arm-none-eabi-gdb target/thumbv7em-none-eabihf/release/led-roulette
$ # ~~~~~~~
バイナリサイズは、常に注意を払う必要があります!あなたの解答では、どの程度の大きさになりましたか?
リリースバイナリにsize
コマンドを使うことで、確認できます。
$ # size target/thumbv7em-none-eabihf/debug/led-rouletteと等価です
$ cargo size --target thumbv7em-none-eabihf --bin led-roulette -- -A
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
led-roulette :
section size addr
.vector_table 404 0x8000000
.text 21144 0x8000194
.rodata 3144 0x800542c
.data 0 0x20000000
.bss 4 0x20000000
.uninit 0 0x20000004
.debug_abbrev 19160 0x0
.debug_info 471239 0x0
.debug_aranges 18376 0x0
.debug_ranges 102536 0x0
.debug_str 508618 0x0
.debug_pubnames 76975 0x0
.debug_pubtypes 112797 0x0
.ARM.attributes 58 0x0
.debug_frame 55848 0x0
.debug_line 282067 0x0
.debug_loc 845 0x0
.comment 147 0x0
Total 1673362
$ cargo size --target thumbv7em-none-eabihf --bin led-roulette --release -- -A
Finished release [optimized + debuginfo] target(s) in 0.03s
led-roulette :
section size addr
.vector_table 404 0x8000000
.text 5380 0x8000194
.rodata 564 0x8001698
.data 0 0x20000000
.bss 4 0x20000000
.uninit 0 0x20000004
.debug_loc 9994 0x0
.debug_abbrev 1821 0x0
.debug_info 74974 0x0
.debug_aranges 600 0x0
.debug_ranges 6848 0x0
.debug_str 52828 0x0
.debug_pubnames 20821 0x0
.debug_pubtypes 18891 0x0
.ARM.attributes 58 0x0
.debug_frame 1088 0x0
.debug_line 15307 0x0
.comment 19 0x0
Total 209601
注記 このCargoプロジェクトは、LTOを使ってリリースバイナリをビルドするように設定されています。
この出力をどう読めばよいか知っていますか?text
セクションは、プログラムの命令を含んでいます。私の場合、約2KBです。
一方、data
とbss
セクションは、RAMに静的に割り当てられた変数(static
変数)を含みます。
aux5::init
でstatic
変数を1つ使っています。そのため、bss
のサイズは4バイトとなっています。
最後にもうひとつ!プログラムをGDB内で実行していますが、プログラムはGDBに全く依存していません。 GDBとOpenOCDを両方とも終了して、ボード上の黒いボタンを押してボードをリセットすることで、このことを確認できます。 LEDルーレットアプリケーションは、GDBの介入なしに動作します。