ターゲット
では、これをビルドしてみましょう。あれ、まだビルドできず、次のエラーが表示されます。
rustc: found duplicate lang item `panic_impl`
the lang item is first defined in crate `std` (which `test` depends on)
解決策は簡単です。ターゲットプラットフォームを明示的に指定するだけで済みます。ターゲットを指定しない場合、コンパイラはデフォルトでホストマシン向けにビルドします。ホストマシン向けのビルドには、std に含まれる独自のパニックハンドラが含まれます。これにより、あなたのコード側でもパニックハンドラを提供しているため競合が発生し、duplicate lang item エラーになります。
micro:bit は浮動小数点ユニット (FPU) を備えた ARM Cortex-M4 の 32 ビットプロセッサを使用しているため、使用すべき正しいターゲットは thumbv7em-none-eabihf です。このターゲットは、クイックスタートのセクションですでに追加しました。
そのため、次のコマンドでそのままビルドできます。
cargo build --target thumbv7em-none-eabihf
.cargo/config.toml
修正すべき点が 2 つあります。1 つ目は、コードエディタがまだ panic 関数をハイライトし、重複エラーを表示する可能性があることです。2 つ目は、ビルドのたびに毎回ターゲットを入力するのが不便なことです。
これを解決するために、.cargo ディレクトリ内に config.toml ファイルを作成し、そこでデフォルトのターゲットを設定できます。
.cargo ディレクトリを作成するために、プロジェクトのルート(Cargo.toml があるのと同じディレクトリ)で次のコマンドを実行してください。続いて、.cargo ディレクトリ内に config.toml を作成します。
mkdir .cargo
cd .cargo
config.toml を次の内容に更新します。
[build]
target = "thumbv7em-none-eabihf"
次に、ターゲットを指定せずにビルドコマンドを実行してみてください。正常にコンパイルされるはずです。
cargo build
ここで、ここまでに作成した src/main.rs のコードを見てみましょう。
#![no_std] #![no_main] use cortex_m_rt::entry; use embedded_hal::{delay::DelayNs, digital::OutputPin}; use microbit::{board::Board, hal::timer::Timer}; #[panic_handler] fn panic(_: &core::panic::PanicInfo) -> ! { loop {} } #[entry] fn main() -> ! { let mut board = Board::take().unwrap(); let mut timer = Timer::new(board.TIMER0); let _ = board.display_pins.col1.set_low(); let mut row1 = board.display_pins.row1; loop { let _ = row1.set_low(); timer.delay_ms(500); let _ = row1.set_high(); timer.delay_ms(500); } }