概要
TOPPERSプロジェクトが公開しているオープンソースのリアルタイムOSであるASP3カーネルとFMP3カーネルをRaspberry Pi Picoで実行する方法を解説します。
ASP3カーネルはシングルコア動作、FMP3カーネルはデュアルコア動作をサポートします。
必要ハードウェア
- Raspberry Pi Pico
- デバッグアダプタ(デバッガを使う場合)
- デバッグアダプタ用にもう一台Raspberry Pi Picoを用意するのが一番手軽です。JLink等も使えます。
- USB-UART変換器(オプション)
必要ソフトウェア
- ネイティブのビルド環境
- ネイティブのRuby
- ARMv6-Mのクロスビルド環境(いわゆるarm-none-eabi-gcc系)
- シリアルモニタ
デバッグ環境の準備
OpenOCDのビルド
デバッガを利用する場合は、公式ガイドGetting started with Raspberry Pi PicoのAppendix Aに従ってOpenOCDをビルドします。
$ git clone https://github.com/raspberrypi/openocd.git --branch picoprobe --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure --enable-picoprobe --disable-werror --prefix=<path to install>
$ make
$ make install
Windows環境の場合はビルドにMYSYS2が必要となるため、以下ページからWindows版のOpenOCDのバイナリをダウンロードして使う方法もあります。
ただしこちらのバイナリを利用する場合、openocd-w64/share/openocd/scripts/target/rp2040.cfg に下記を追加してください。
targets rp2040.core0
デバッグアダプタの接続
Raspberry Pi Picoを二台用意し、片方をデバッグアダプタ(Picoprobe)として利用する場合は、公式ガイドGetting started with Raspberry Pi PicoのAppendix Aに従って配線を行います。
PCとはデバッガ側PicoのUSBによって接続します。
デバッガ側 | ターゲット側 |
---|---|
VBUS | VBUS |
GND | GND |
GP2 | SWCLK |
GP3 | SWDIO |
GP4 | GP1 |
GP5 | GP0 |
デバッガファームウェアの書き込み
Raspberry Pi公式からPicoprobeのUF2イメージをダウンロードします。
(2021/10/19現在、次のリンクからダウンロードできます。 https://datasheets.raspberrypi.com/soft/picoprobe.uf2)
デバッガ側PicoのBOOTSELスイッチを押下しながらPCとUSB接続することで、PCにマスストレージが現れます。
このストレージにPicoprobeのUF2イメージを書き込むことで、Raspberry Pi Picoがデバッグアダプタ兼USB-UART変換器になります。
カーネルのビルド
TOPPERS公式からASP3もしくはFMP3カーネルのRaspberry Pi Pico簡易パッケージをダウンロードします。
ASP3 https://www.toppers.jp/asp3-e-download.html
FMP3 https://www.toppers.jp/fmp3-e-download.html
サンプルプログラムは以下のようにビルドすることができます。
# ASP3カーネルの場合
$ mkdir obj
$ cd obj
$ ruby ../configure.rb -T raspberrypi_pico_gcc
$ make
# FMP3カーネルの場合
$ mkdir obj
$ cd obj
$ ruby ../configure.rb -T raspberrypi_pico_gcc -w -S "syslog.o banner.o serial.o logtask.o chip_serial.o"
$ make
Rubyのエラーが出る場合
ASP3ではRubyのバージョンによって以下のようなエラーが発生する可能性があります。
$ ruby ../configure.rb -T raspberrypi_pico_gcc
Traceback (most recent call last):
2: from ../configure.rb:47:in `<main>'
1: from /usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- shell (LoadError)
この場合、以下のようにGemをインストールします。
$ sudo gem install shell
ターゲットへの書き込み
Picoprobeを利用する場合
Picoprobeを利用する場合はOpenOCDにPATHを通した後に以下のコマンドで書き込みが行えます。
$ make run
デバッガを利用しない場合
デバッガなしで実行する場合は、まずELFファイルをUF2ファイルに変換する必要があります。
これを行うには、以下の手順で公式の変換ツールであるelf2uf2をビルドします。
$ git clone git@github.com:raspberrypi/pico-sdk.git
$ cd pico-sdk/tools/elf2uf2
$ mkdir build
$ cd build
$ cmake ..
$ make
ビルドされたelf2uf2にPATHを通した上で(フルパス指定でも良いです)ASP3またはFMP3のビルドディレクトリに戻り、以下のコマンドでUF2ファイルを生成します(WindowsではELFファイルはasp.exeのような名前かもしれません)。
$ elf2uf2 asp asp.uf2 # ASP3の場合
$ elf2uf2 fmp fmp.uf2 # FMP3の場合
Raspberry Pi PicoのBOOTSELスイッチを押下しながらPCとUSB接続することで、PCにマスストレージが現れます。
このストレージに生成されたUF2イメージを書き込むことで、ターゲットにプログラムがダウンロードされます。
動作確認
GP0をTX、GP1をRXとしてUARTが動作するので、適当な手段でPCから接続するとサンプルプログラムの出力が見られます。
シリアルポートの設定はデータ8ビット、ストップ1ビット、パリティなし、ボーレート115200bpsです。
サンプルプログラムの動作についてはsample/sample1.cをご覧ください。
デバッグアダプタは以下のように起動します。
# OpenOCD + Picoprobeの場合
$ openocd -f interface/picoprobe.cfg -f target/rp2040.cfg
# JLinkの場合
$ JLinkGDBServer -device RP2040_M0_0 -if SWD -speed auto -ir -nogui
Picoprobeを使う場合はGDBからスレッドとして各コアが見られます。
USB-UART変換器がない場合
USB-UART変換器がない場合は、Raspberry Pi PicoのUSBをUSB-CDCとして動作させることができます。
公式のSDKとTOPPERS OSを組み合わせ、TOPPERSのシリアルドライバをUSB-CDCで実装するサンプルを用意しました。
ASP3 https://github.com/komori-t/RPi_Pico_ASP3
FMP3 https://github.com/komori-t/RPi_Pico_FMP3
以下のようにしてビルドできます(TOPPERS公式バージョンとはconfigureの引数が異なります)。
$ mkdir obj
$ cd obj
$ ruby ../configure.rb -T raspberrypi_pico_gcc -w -S "syslog.o banner.o serial.o logtask.o"
$ make
書き込みやデバッグについてはTOPEPRS公式版と同様です。
また、一部SDKの機能を使うこともできます。
利用できる機能については target/raspberrypi_pico_gcc/pico-sdk ディレクトリを参照ください。