panic!

panic!マクロも出力をITMに送信します!

main関数を次のように変更して下さい。

#[entry]
fn main() -> ! {
    panic!("Hello, world!");
}

上のプログラムを試してみましょう。ただ、その前に、monitorに関連する処理をGDB起動時に実行するように、openocd.gdbを更新しましょう。

 target remote :3333
 set print asm-demangle on
 set print pretty on
 load
+monitor tpiu config internal itm.txt uart off 8000000
+monitor itm port 0 on
 break main
 continue

それでは、実行します。

$ cargo run
(..)
Breakpoint 1, main () at src/06-hello-world/src/main.rs:10
10          panic!("Hello, world!");

(gdb) next

itmdump端末に新しい出力が見えるでしょう。

$ # itmdump terminal
(..)
panicked at 'Hello, world!', src/06-hello-world/src/main.rs:10:5

他にも、rust_begin_unwindシンボルにブレイクポイントを置くことで、ログ出力するにパニックを捕捉することができます。

(gdb) monitor reset halt
(..)
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080026ba msp: 0x10002000

(gdb) break rust_begin_unwind
Breakpoint 2 at 0x80011d2: file $REGISTRY/panic-itm-0.4.0/src/lib.rs, line 46.

(gdb) continue
Continuing.

Breakpoint 2, rust_begin_unwind (info=0x10001fac) at $REGISTRY/panic-itm-0.4.0/src/lib.rs:46
46          interrupt::disable();

今回は、itmdumpコンソールに何も表示されないことに気づくでしょう。 continueを使ってプログラムを再開すると、新しい行が表示されます。

後のセクションでは、他のより簡単な通信プロトコルを検討します。