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

Hello, world!

注意 STM32F3DISCOVERY 上の「ソルダーブリッジ」SB10(ボード裏面を参照)は、 以下に示す ITM と iprint! マクロを使用するために必要ですが、デフォルトでははんだ付けされていませんUser Manual の 21 ページを参照)。 (より正確には、これは実際にはボードのリビジョンに依存します。ボードが 旧版の User Manual に 書かれている古いバージョンであれば、SB10 ははんだ付けされています。修正が必要かどうかを判断するために、 自分のボードを確認してください。)

要点 これを修正するには 2 つの方法があります。SB10 のソルダーブリッジをはんだ付けするか、 以下の図のように SWO と PB3 の間をメス-メスのジャンパーワイヤで接続してください。


低レベルなことを始める前に、もう少しだけ便利な魔法を使いましょう。

LED を点滅させることは、組み込みの世界における “Hello, world” のようなものです。

しかし、この節では、コンピューターのコンソールに出力する、ちゃんとした “Hello, world” プログラムを実行します。

06-hello-world ディレクトリに移動してください。そこにはスターターコードがいくつかあります:

#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux6::{entry, iprint, iprintln};

#[entry]
fn main() -> ! {
    let mut itm = aux6::init();

    iprintln!(&mut itm.stim[0], "Hello, world!");

    loop {}
}

iprintln マクロはメッセージを整形し、マイクロコントローラーの ITM に出力します。ITM は Instrumentation Trace Macrocell の略で、SWD (Serial Wire Debug) の上に成り立つ通信プロトコルです。これは、マイクロコントローラーからデバッグホストへ メッセージを送るために使用できます。この通信は 一方向 です。つまり、デバッグホストから マイクロコントローラーへデータを送ることはできません。

デバッグセッションを管理している OpenOCD は、この ITM チャネル を通して送られたデータを受信し、 それをファイルにリダイレクトできます。

ITM プロトコルは フレーム で動作します(Ethernet フレームのようなものだと考えてください)。 各フレームはヘッダーと可変長のペイロードを持ちます。OpenOCD はこれらのフレームを受信し、解析せずに そのままファイルへ書き込みます。したがって、マイクロコントローラーが iprintln マクロを使って 文字列 “Hello, world!” を送信しても、OpenOCD の出力ファイルにはその文字列がそのまま 入るわけではありません。

元の文字列を取り出すには、OpenOCD の出力ファイルを解析する必要があります。新しいデータが到着するたびに この解析を行うために、itmdump プログラムを使います。

installation chapter で、すでに itmdump プログラムをインストールしているはずです。

新しいターミナルで、*nix OS を使っている場合は /tmp ディレクトリ内で、Windows を使っている場合は %TEMP% ディレクトリ内で、このコマンドを実行してください。これは OpenOCD を実行している ディレクトリと同じである必要があります。

注記 itmdumpopenocd の両方が 同じディレクトリから実行されていることが非常に重要です!

$ # itmdump 用ターミナル

$ # *nix
$ cd /tmp && touch itm.txt

$ # Windows
$ cd %TEMP% && type nul >> itm.txt

$ # 共通
$ itmdump -F -f itm.txt

itmdump は現在 itm.txt ファイルを監視しているため、このコマンドはブロックします。このターミナルは 開いたままにしておいてください。

STM32F3DISCOVERY ボードがコンピューターに接続されていることを確認してください。OpenOCD を起動するために、 /tmp ディレクトリ(Windows では %TEMP%)から別のターミナルを開き、chapter 3 で説明したのと 同様に進めます。

では、スターターコードをビルドしてマイクロコントローラーに書き込みましょう。

これからアプリケーションをビルドして実行します。cargo run を使います。そして next を使って ステップ実行します。openocd.gdb には monitor コマンドが含まれているので、OpenOCD は ITM の出力を itm.txt にリダイレクトし、itmdump はそれを自身のターミナルウィンドウに書き出します。 また、ブレークポイントを設定してトランポリンをステップ実行するので、fn main() の最初の実行可能な 文で停止します:

~/embedded-discovery/src/06-hello-world
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `arm-none-eabi-gdb -q -x ../openocd.gdb ~/embedded-discovery/target/thumbv7em-none-eabihf/debug/hello-world`
Reading symbols from ~/embedded-discovery/target/thumbv7em-none-eabihf/debug/hello-world...
hello_world::__cortex_m_rt_main () at ~/embedded-discovery/src/06-hello-world/src/main.rs:14
14          loop {}
Loading section .vector_table, size 0x194 lma 0x8000000
Loading section .text, size 0x2828 lma 0x8000194
Loading section .rodata, size 0x638 lma 0x80029bc
Start address 0x08000194, load size 12276
Transfer rate: 18 KB/sec, 4092 bytes/write.
Breakpoint 1 at 0x80001f0: file ~/embedded-discovery/src/06-hello-world/src/main.rs, line 8.
Note: automatically using hardware breakpoints for read-only addresses.
Breakpoint 2 at 0x800092a: file /home/wink/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-rt-0.6.13/src/lib.rs, line 570.
Breakpoint 3 at 0x80029a8: file /home/wink/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-rt-0.6.13/src/lib.rs, line 560.

Breakpoint 1, hello_world::__cortex_m_rt_main_trampoline () at ~/embedded-discovery/src/06-hello-world/src/main.rs:8
8       #[entry]
hello_world::__cortex_m_rt_main () at ~/embedded-discovery/src/06-hello-world/src/main.rs:10
10          let mut itm = aux6::init();

(gdb)

ここで next コマンドを実行すると、aux6::init() が実行され、main.rs の次の実行可能な文で 停止します。つまり 12 行目に移動します:

(gdb) next
12	    iprintln!(&mut itm.stim[0], "Hello, world!");

次にもう一度 next コマンドを実行すると、12 行目、つまり iprintln が実行され、14 行目で停止します:

(gdb) next
14	    loop {}

これで iprintln が実行されたので、itmdump のターミナルウィンドウには Hello, world! という文字列が表示されるはずです:

$ itmdump -F -f itm.txt
(...)
Hello, world!

すばらしいでしょう? 以降の節では、iprintln をロギングツールとして自由に使ってください。

次へ: それだけではありません! ITM を使うのは iprint! マクロだけではありません。:-)