ラズピコでRust(10) assert!()マクロとパニックハンドラ

ラズピコでRust(10) assert!()マクロとパニックハンドラ

皆さん こんにちは。
ポンコツRustacean の moon です。

今回は前回作成したプロジェクトにパニックハンドラを追加してみました。

この記事は開発環境を構築することを前提にしています。
環境構築について知りたい方は こちらの記事 をご覧になってください。

このサイトは 書籍 基礎から学ぶ組込みRust を参考にしています。

assert!マクロとは

assert!()内に式を書き、実行時に式の評価が false になるとパニックが発生します。

通常 false になり得ない式を書いておきます。

パニックハンドラ

パニック(panic)はプログラムの異常終了処理を安全に行うためのしくみです。

例えばassert!()をプログラムの複数個所に仕掛けておき実装次第では、どこでパニックが発生したのか調べることができたりします。

パッケージの複製を作成する

まず私のGitHubリポジトリにあるRustのひな形をベースに別名でパッケージをつくります。
ひな形はデバッグ環境用のものですから、その複製もデバッグできるようになります。

新しいパッケージ名を rp2040-panic-bme280 として git clone します。
xxxxは皆さんのユーザー名です。
カレントディレクトリを rp2040-panic-bme280 に移します。

今回は元プロジェクトを前回作成した rp2040-spi-bme280 にしました。
構成が同じなのでライブラリクレートを作成したりする手間が省けます。

C:\Users\xxxx>cd pprp
C:\Users\xxxx\pprp>git clone https://github.com/moons3925/rp2040-spi-bme280.git rp2040-panic-bme280
C:\Users\xxxx\pprp>cd rp2040-panic-bme280

上位のCargo.tomlを編集する

rp2040-spi-bme280ディレクトリにある Cargo.toml のnameを rp2040-panic-bme280に変更します。

lib.rsを編集する

次にrp2040-lib\srcディレクトリにある lib.rs を以下のように編集します。

最後に pub mod panic; を追加します。

lib.rsのあるディレクトリにpanic.rsを作成する

lib.rsのあるディレクトリに panic.rs を作成し、次のように編集します。

メソッドの戻り値 ! はメソッドが終了しないことを意味しています。
ですからメソッドの最後に loop {} を記述しておく必要があります。

use core::panic::PanicInfo;

use crate::print;
use crate::println;

#[panic_handler]
fn panic(panic_info: &PanicInfo) -> ! {
    println!("{}", panic_info);
    loop {}
}

上位のCargo.tomlを編集する

rp2040-panic-bme280ディレクトリにある Cargo.toml のnameを rp2040-panic-bme280に変更します。

launch.jsonを編集する

.vscode にある launch.json を編集します。
executable: の名称を rp2040-spi-bme280 から rp2040-panic-bme280 に変更します。

"executable": "./target/thumbv6m-none-eabi/debug/rp2040-panic-bme280",

main.srを編集する

パニックハンドラーを実装するので、以下をコメントにするか削除します。

//use panic_halt as _;

わざとパニックを起こすコードを loop {} の前あたりに記述しておきます。

let a = 5;
let b = 7;
assert!(a == b);

PC側の準備

通信の確認用として Tera Term を使います。

インストール後、 Tera Term を起動し、シリアルポートでUSBシリアル変換モジュールのCOMポートを選択します。

もしCOMポートが複数ある場合には、USBシリアル変換モジュールのケーブルをはずしてデバイスマネージャーでCOMポート番号を確認しておきます。

起動後、設定メニューのシリアルポートから以下の設定を行います。

スピート : 9600
データ : 8 bit
パリティ : なし
ストップビット : 1
フロー制御 : none

これらの値は送受信する相手と合わせておく必要があります。

改行コードを設定する

設定 – 端末 で改行コードを LF に設定します。

ビルドして実行する

Run – Start Debugging (F5) からプログラムを実行します。

パニック発生時のメッセージは以前実装したprintln!マクロによってPCに送られます。
以下のように表示されれば成功です。

皆さんの環境でもパニックが発生した箇所を検出できたでしょうか。
お疲れさまでした。

panicカテゴリの最新記事