VSCode+ラズピコ拡張 プログラムサイズを確認する2つの方法

VSCode+ラズピコ拡張 プログラムサイズを確認する2つの方法

皆さん こんにちは

ラズピコ研究員の moon です。

この記事は「初心者必見! Raspberry Pi Picoの C/C++デバッグ環境を容易に構築する」によって環境構築していることを前提にしています。

プログラムが大きくなって来ると、そのサイズが気になりませんか?
まあラズピコでは最低でも2MByteとかなりFlashメモリー(ROM)のサイズが大きいので、さほど心配する必要はないでしょう。

とは言え、サイズの確認方法は知っておくのが良いですね。

初級編

SDKに含まれている picotool を使うことでプログラムサイズを確認することができます。

picotool を使うためにはラズピコを BOOTSELモードにする必要があります。

BOOTSELボタンを押しながらラズピコに電源を供給するとBOOTSELモードに入ります。
(D & Dでuf2ファイルを書き込む時の、あの状態です)

BOOTSELモードにした状態で、picotool info -a とコマンドを打ち込みます。

ただし、picotoolは外部コマンドでもなく通常はファイルパスも通っていませんので picotool.exe のあるディレクトリからコマンドプロンプトを開いて実行するのが良いでしょう。

こちらの環境では以下のディレクトリに picotool.exe がありました。
m3925の部分を皆さまのユーザー名で置き換えてください。

C:\Users\m3925\.pico-sdk\picotool\2.2.0\picotool

実行結果は以下の通りです。

binary end から binary start の値を差し引いたものがプログラムサイズになります。

0x4594 ですから10進数では 17,812Byte となることがわかりました。

「もう少し詳細な情報を知る方法はないの?」と思われる方は次をご覧ください。

上級編

上級と言っても、研究員のやることですからたいしたことありません w

それでは elfファイル から情報を取得する方法を試してみましょう。
elf は Executable and Linakble Format の略です。

elfファイルはプロジェクトのあるディレクトリ下の buildディレクトリの中につくられます。
elfファイルは実行可能形式であり、かつ様々な情報を持っているファイルです。

elfファイルから情報を得るためにはSDKに含まれている readelf.exe を使います。

こちらの環境では以下のディレクトリに readelf.exe がありました。
m3925の部分を皆さまのユーザー名で置き換えてください。

C:\Users\m3925\.pico-sdk\toolchain\14_2_Rel1\arm-none-eabi\bin

readelf.exe もファイルパスが通っていないので、てっとり早い方法はこのディレクトリに対象の elfファイルをコピーして実行後、ファイルを削除します。

今回は split.elf をこのディレクトリにコピーし、コマンドプロンプトを開き、次のコマンドを実行します。

readelf -S split.elf

実行結果を以下にしめします。

確認後、コピーした elfファイル は削除してください。

なぜ上級なのか?
そうです16進数の足し算が必要だからです w

プログラムサイズを計算するのに必要なセクションのサイズの合計を求めてみます。

boot2 : 100
text : 3a40
rodata : 86c
binary_info : 20
data : 1c8

boot2 はブートローダーのサイズです(多分 w)
ピタリ256とは怪しいですね(0でパディングしてませんでしたっけ w)

text は命令や定数が格納されている領域(サイズ)です。
rodata は文字列リテラル等の定数が格納されている領域(サイズ)です。
binary_info はボードやSDKバージョン等のメタ情報のサイズです。
data は初期値のあるRAMに使われる変数のサイズです。

これらの合計は 0x4594 (hex) == 17,812 (dec) となりました。

おお、初級編の値とピタリですね。
足し算しかしてないのに、何か感動です!

というわけで、プログラムサイズを確認する2つの方法をご紹介しました。

お疲れさまでした。

Environmentカテゴリの最新記事