概要
ESP32の開発をしていて、ESP-IDFだと.mapファイルをかんたんに生成できますが、Arduino IDEでは標準では生成されません。
.mapファイルをWindows環境のArduino IDEで生成できるようにする方法を調べました。
.mapファイルとは?
Arduinoのスケッチを端末に転送する場合には、ざっくりと以下の流れになります。
- inoファイルをC++言語ファイルに変換
- C++言語のファイルをコンパイラがコンパイル
- コンパイルしたできたオブジェクトをリンカがリンク
- リンクしたファイルを端末に転送
.mapファイルとは、プログラムをコンパイルしたあとで、リンクする際にどの変数や関数をどこに配置したのかを記述したファイルになります。
.mapファイルをみることで、大きな変数やデータなどを探すことができます。
仕組み
Arduino IDEでESP32をリンクするプログラムには.mapファイルを生成するオプションがありますが、標準では指定されていません。
設定ファイルを書き換えることで、.mapファイルの生成オプションを追加したいと思います。
設定ファイルの場所
Arduino IDEの環境設定を開いて、上記の赤い枠で囲まれたファイルをクリックしてください。Windowsだと「C:\Users\%USERNAME%\AppData\Local\Arduino15」などのフォルダが開いたと思います。
そこから「packages」、「esp32」、「hardware」、「esp32」、「1.0.4」とひらくと「C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4」が開くと思います。
「platform.txt」ファイルが入っていれば正解です。ESP32のライブラリのバージョンが更新されると最後の数字の場所が変わると思います。
「platform.txt」を開き、「Combine gc-sections」を検索します。
## Combine gc-sections, archives, and objects recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group -Wl,-EL -o "{build.path}/{build.project_name}.elf"
上記が検索した結果です。このファイルを直接編集すると、環境が壊れたときに治すことができなくなるので「platform.local.txt」ファイルを新規作成し、その中に変更後のオプションを設定したいと思います。
- C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\platform.txt (編集しない)
- C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\platform.local.txt (新規作成して追記する)
## Combine gc-sections, archives, and objects recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group -Wl,-EL -o "{build.path}/{build.project_name}.elf" -Wl,-Map=arduino.map # "C:\Users\%USERNAME%\AppData\Local\VirtualStore\Program Files (x86)\Arduino"
私が追記した内容が上記になります。
-Wl,-Map=arduino.map
上記のオプションを最後に追加しています。コンパイルオプションは今後変わることがあるので、オリジナルのオプションに上記文字を最後に追記するのがよいと思います。
最後の行にコメントで、.mapファイルが生成される場所が書いてありますが必須ではありません。
コンパイルしてみる
Arduino IDEでなにかスケッチをコンパイルしてみてください。
- C:\Users\%USERNAME%\AppData\Local\VirtualStore\Program Files (x86)\Arduino
上記ディレクトリを開いてみてください。中に「arduino.map」があれば生成成功です。
(追記)上記にない場合
いま試したところ、inoファイルがある場所に保存されていました。なんでだろう?
Windows環境以外の人
Windows環境では権限の関係で、arduino.map以外の名前で作成すると失敗します。esp32.mapなどに変更するとコンパイル時にオープンできなかったとエラーがでると思います。
また、生成したファイルも「VirtualStore」配下に生成されてしまいます。Windows環境以外の人は作成するオプションを変更して、わかりやすい場所に生成したほうが便利だと思います。
-Wl,-Map="{build.path}/{build.project_name}.map"
本当は上記の指定がよかったのですが、現状Windows10だと指定するとエラーになってしまいました。
まとめ
.mapファイルの生成方法を調べてみました。.mapファイルの分析方法は別の記事でそのうち書きたいと思います。
コメント