MachiKania

Raspberry Pi Picoで、RAM領域にアプリケーションを配置する

2023年1月30日

Raspberry Pi Pico 用のアプリケーションを C で開発すると、デフォルトではメインプログラムがフラッシュ領域(アドレス 0x10000000 からの 2048 kbytes)に配置される。作成されたuf2ファイルを、Pi Pico 本体の BOOTSELボタンを押しながら PC の USB 端子に接続すると現れる RPI-RP2 ドライブにコピーすると、フラッシュ領域にプログラムが書き込まれ、2回目以降は Pi Pico に電源を供給するだけで、インストールしたプログラムが実行される。

この記事では、フラッシュ領域ではなく RAM 領域(アドレス 0x20000000 からの 256 kbytes)にプログラムを配置する方法について述べる。ソースコードに若干の変更を加えるだけでよい。(ビルドすると、uf2 ファイルだけではなく hex ファイルも作成されるが、この hex ファイルは、MachiKania type P でファイル選択すると、実行可能。)

1.フラッシュ領域を使わないリンカースクリプトをコピー

Pi Pico のアプリケーションをビルドすると、デフォルトでは「pico-sdk/src/rp2_common/pico_standard_link」ディレクトリーに存在する「memmap_default.ld」がリンカースクリプトとして使用される。同ディレクトリーにある「memmap_no_flash.ld」が目的のリンカースクリプトなので、これを「CMakeLists.txt」があるディレクトリーにコピーする。

MachiKania type P 用の HEX ファイルを作成する場合は、コピーした「memmap_no_flash.ld」の26行目、「RAM(rwx) : ORIGIN = 0x20000000, 」の次の「LENGTH = 256k」を、「LENGTH = 192k」と書き換える。他の用途に用いる場合は、この変更は必須ではない。

2.CMakeLists.txt を修正する

次の2つの行を、CMakeLists.txt のどこかに書き加える。
set(PICO_NO_FLASH 1)

pico_set_linker_script(target_name ${CMAKE_CURRENT_SOURCE_DIR}/memmap_no_flash.ld)
ただし、「target_name」は、ビルドの際の任意のターゲット名に書き換える事。

3.あとは、いつも通りビルド

以上の変更を加えたのちに、いつも通りビルドすれば、RAM 領域にアプリケーションが配置された uf2 ファイルと hex ファイルが作成される。

コメント

にゃんげ (2023年1月31日 08:33:20)

詳細なご説明をありがとうございます!
昨年末に、HEXファイルの読み込みについてのツイートを拝見したから挑戦していたのですが、拙宅の環境では何故かpico_set_linker_scriptがUnknown CMake commandとなり、諦めておりました。
本記事にてmemmap_no_flash.ldのオリジナルの場所が分かったため、直接そちらを書き換える事で無事ビルドできました。

MachiKaniaは夢のある非常に素敵なプロジェクトだと思いますので、いちファンとして今後も陰ながら応援しています。

Katsumi (2023年2月1日 11:51:46)

こんにちは。

MachiKaniaのファンの方からリアクションをいただいて、とても嬉しいです。うまく、RAMのみを使うアプリケーションがビルドできて良かったです。

今後とも、MachiKaniaにご愛顧のほどを、よろしくお願いします。

Katsumi (2024年2月18日 21:58:55)

ビルド時に"__flash_binary_end"が見つからないというエラーが出た際は、次の一文をCファイルのどこかに書き加える。

char __flash_binary_end;

コメント送信