Pi Pico でマルチコアを使ってみる(コア間通信)


前回(base)ではPico のCPUのデュアルコアそれぞれで独立してジョブを実行させていましたが、今回は2つのコア間で通信させてみます。

Pico にはコア間で通信させるのに便利な共有メモリがあって、FIFOでデータ送信できます。

こんな感じです。

 

 

 

 

 

 

出典:Conceptual diagram of the communication between cores on the RP2040

出典にあるサンプルプログラムやFIFOが分かりやすいLチカプログラムをやってみます。C/C++ を使います。

 


母艦にpico-sdkをインストール

picoのファームウェア作成や結果表示用にラズパイ4を母艦に使います。

Raspberry Pi OS の最新はBookworm ですがまだ何か不安定な所が見られるので、1つ前のBullseyeのDesktop を使います。

 

 

 

 

 

 

 

 

インストール

 


内臓温度センサーを使ってみる

コア 0 を使用して Pico 上のオンチップ温度センサーを読み取るマルチコア プログラムを作成してみます。 データはコア 1 に送信され変換されて、シリアル USB 接続経由で母艦のラズパイ4のディスプレイに表示されます。

pico-sdk をインストールしたpicoフォルダーに作業用のmulticore_fifo_tempというフォルダーを作ります。

ここに CMakeLists.txtファイルとソースファイルを作成します。

以下を記述します。

次にソースファイル。

コードは以下のとおり。

コア0で生のデータを読んで、FIFO経由でコア1に渡し、変換してシリアルに吐き出して表示します。

ここで使われるFIFOを使ったpush , pop などの関数の意味。

multicore_fifo_rvalid()
読み取り FIFO をチェックして、(他のコアから送信された) 利用可能なデータがあるかどうかを確認します。
multicore_fifo_pop_blocking()
読み取り FIFO からデータをポップします (他のコアからのデータ)。この関数は、データを読み取る準備ができるまでブロックします。
ブロックしたくない場合は、multicore_fifo_rvalid() を使用してデータを読み取る準備ができているかどうかを確認します。
multicore_fifo_clear_irq()
FIFO 割り込みのクリアこれは ROE または WOF フラグによって引き起こされた割り込みのみをクリアすることに注意してください。
        VLD フラグをクリアするには、「ポップ」 または「ドレイン」機能のいずれかを使用する必要があります。
multicore_fifo_push_blocking(raw)
データを書き込み FIFO にプッシュします (データを他のコアに送信します)。この関数は、データを送信するためのスペースができるまでブロックされます。
        ブロックしたくない場合は、multicore_fifo_wready() を使用して、FIFO に書き込むことが可能かどうかを確認します。
multicore_fifo_wready()
書き込み FIFO をチェックして、さらにデータを格納できるスペースがあるかどうかを確認します。

詳細は以下を参照

Raspberry Pi Pico fifo

 

ファームウェアを作成します。

buildフォルダー内にファームウェアのuf2ファイルが作成されます。

Pico のBOOTSELボタンを押しながら母艦に再接続して、フォルダーが開いたらuf2ファイルをドラッグ・ドロップします。

 

 

 

 

 

 

 

 

 

ラズパイでminicomなどを使ってモニターします。

 

 

 

 

 

 

 

 

 


内臓LEDを使ってみる

コンソールアプリを作り、コア0ではキーボードからの入力を受け、取得した数値をコア1に送って、その数値の回数だけLEDを点滅させてみます。

入力と点滅は独立したジョブなので、連続して数値を入力させた場合、値はFIFOバッファーに入れられ、点滅ジョブが終了する毎に順番に取り出されます。

全体の手順は上記と同じです。

【 CMakeLists.txt】

【 multicore_fifo_led.c】

ビルド

Pico のBOOTSELボタンを押しながら母艦に再接続してフォルダーが開いたらuf2ファイルをドラッグ・ドロップでコピー。

ラズパイでminicomなどを使ってUSBポートをモニターします。

初期画面は真っ黒です。

 

 

 

 

 

 

 

 

試しにキーボードから5を入力してリターンキーを押すと、メッセージが表示されてLEDが5回点滅します。

 

 

 

 

 

 

 

 

 

 

また、順にリターンキーで9,8,7,6,5,4,3,2,1と入力してそのままほっとけば、点滅が終了する毎に8,7,6,5,4,3,2,1が順に取り出され、メッセージが表示されてその数値の回数LEDが点滅します (入力値は1桁でなくてもかまいません)。

0を入力すればendメッセージが出て終了です。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Pico の構成

 

 

 

 

 

 

 

 

 

 

 

 


Reference

Pi Pico でマルチコアを使ってみる(base)

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*