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


以下3つの環境で基本コードのみ実行してみます。

Arduino IDE

C/C++

MicroPython

 

母艦にラズパイ4を使います。

Raspberry Pi Pico のCPU はデュアルコア(2 core)の構成になっています。

2つのコアを使った並列処理をやってみます。

 

 

 

 

 

 

 


Arduino IDE

ラズパイ4 + Arduino IDE でマルチコアのコードを実行してみます。

この環境でPicoをサポートするため、ボードはRaspberry Pi RP2040 Boards を使います。

Arduino IDE でPi Pico Wの開発用にEarle Philhower版を使う

baseになるコードは以下を参照します。

ファイル ー>スケッチ例ー>rp2040 ー> Multicore

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

特に何も宣言せずにマルチコアが使えます。

setupとloopの組み合わせを2個使います。setup(),loop() とsetup1(),loop1()。

RP2040 チップの2 つのコアは互いに独立して実行でき、周辺機器とメモリを互いに共有します。 Arduino コードは通常、コア 0 でのみ実行され、2 番目のコアは低電力状態でアイドル状態になります。

setup1() 関数とloop1() 関数をスケッチに追加すると、2 番目のコアを利用できます。 setup1() ルーチンまたはloop1() ルーチン内から呼び出されたものはすべて 2 番目のコアで実行されます。

 

 

 

 

 

 

 

 

 

Pico がシングル コア モードで実行されている場合、コア 0 には 8KB のスタック スペースがすべて利用可能です。 マルチコア setup1/loop1 を使用する場合、8KB はコアごとに 1 つずつ、2 つの 4K スタックに分割されます。 この場合、4K の制限を超えると、コア 0 のスタックがコア 1 のスタックを上書きする可能性があります。

コア 1 に別の 8K スタックを割り当てて、両方のコアで 8K スタックを利用できるようにするには、スケッチで次の変数を定義して true に設定するだけです。
bool core1_separate_stack = true;
他のボードの環境下(例:ArducamPico4ML)だと以下の様にmulticoreライブラリをincludeして使います。この場合はCore0からCore1を起動しています(pico-SDK のC/C++ のコードと同じ)。

 

 

 

 

 

 

 

 


C/C ++

pico-SDK とpico-examples を使ってみます。

pico-examples には多くのサンプルコードが紹介されていて、何かを作りたいという場合のひな型を提供してくれます。

以前もやってます。Pi Pico W でWi-Fi 通信をやってみる(3)

が、あらためて書いてみます。

pico-sdkのインストール

pico-examplesをクローンしてcmakeまでやっておき、makeは各サンプルで個別に実行することにします。

baseになるコードは以下を参照して使います。

pico-examples -> hello_multicore

pico-examples ー> hello_world

マルチコア でHello Core 1 とCore 2 をやってみます。

Hello World サンプルではUSBのシリアルからそのままメッセージを取れるので便利で確認しやすいです。

マルチコアの基本コードはこんな感じです。

 

まず、Hello World のソースを改変します。

ソースの場所はココです。

~/pico/pico-examples/hello_world/usb/hello_usb.c

こういう感じに変更します。

 

次に、CMakeLists.txtにライブラリを追加します。エディターで以下を編集します。

~/pico/pico-examples/hello_world/usb/CMakeLists.txt

下記の様にpico_multicoreを追加

target_link_libraries(hello_usb pico_stdlib pico_multicore)

buildに移動してmakeを実行します。

uf2ファイルが生成されます。

 ~/pico/pico-examples/build/hello_world/usb/hello_usb.uf2

PicoのBOOTSELボタンを押しながらUSBケーブルで母艦(ラズパイ4)に接続。

 

 

 

 

 

 

 

 

 

 

RPI-RP2フォルダーが開いたらuf2をドラッグ・ドロップ。

シリアルモニターを使って確認します。

Arduino IDE インストール済ならシリアルモニターも簡単に使えます。

 

 

 

 

 

 

 

 

 

 

Arduino IDE がインストールされていない場合は、minicomを使ってみます。シリアルポートをモニターできます。

 

 

 

 

 

 

 

 

 

 

 


MicroPython

Pi Pico にMicroPython 実行用のファームウェアをインストールしておきます。

ラズパイ4ではプレインストールされているThonny をMicroPython のコーディング環境に使います。

baseになるコードは以下を参照して使います。

Multi Thread Coding on the Raspberry Pi Pico in Micropython

MicroPython の界隈ではマルチスレッドと呼んでいるようですが、Pico に限ってはThread = Core と考えていいようです。

 

 

 

 

 

 

 

 

 

 

 

 

 


Next

2つのコア間でコミュニケーションしたり同期処理したりする場合はセマフォやミューテックスなどを使う必要があります。

次回参照

 


Reference

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

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*