RP2040をC言語で使用する場合にpico-sdk+pico-project-generatorを使用することが多いと思います。先日、pico-sdkを使用していて、意図通りにRP2040が動かないことがありました。この原因として最適化オプションが働いて意図せず、変数等が削除されてしまったことでした。多くはvolatile等のオプションを変数に付与することで解決しますが、プロジェクトが大きくなるとプロジェクト全体の最適化オプションを変更した方が楽な場合が多々あります。
今回はpico-sdk+pico-project-generatorでビルドのオプションを変更する方法について紹介します。多くの方法としては下記のようにcmakeの引数でビルドオプションを指定することが一般的ですが、毎回、ビルドの度に指定するのは面倒です。
cmake -DCMAKE_BUILD_TYPE=Debug -DPICO_DEOPTIMIZED_DEBUG=1
make -j4
pico-sdk+pico-project-generatoの場合、自動的にプロジェクトフォルダ内にCMakeLists.txtが生成されます。今回はプロジェクトフォルダ内のCMakeLists.txtにビルドオプションを書き込んで、ビルドオプション指定を自動化する方法を紹介します。
プロジェクトフォルダ内のCMakeLists.txtをテキストエディタで開き、先頭のset部分に下記のスクリプトを追加します。
set(CMAKE_BUILD_TYPE "Debug")
set(OPTIMIZATION_FLAG 1)
set(OPTIMIZATION_FLAG 1)
実際に書き込んだイメージは下記です。
なお、デフォルトは
set(OPTIMIZATION_FLAG "-Os")
になっているようでサイズ最適化のため、最適化オプションが働いて意図せず変数が削除される可能性があります。
急に意図通りにRP2040が動かなくなり、最初はpico-sdkのバージョンやcmakeのバージョン等が原因と思いましたが、結局、ビルドの最適化オプションが原因であると分かりました。eclipseベースの開発環境では簡単にビルドの最適化オプションを確認、変更できますが、cmakeベースでは気づきにくいため、注意が必要だと思いました。