Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ターゲット

では、これをビルドしてみましょう。あれ、まだビルドできず、次のエラーが表示されます。

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);
    }
}