Raspberry Pi Pico のマルチコアの使い方

  Raspberry Pi Pico(ラズパイPico)のデュアルコア(並列処理、multicore)をArduino環境から使ってみます。デュアルコアの実行例と、どれくらい違いがあるのかも興味があるので並列処理/逐次処理で簡単な計算の速度比較も行ってみたいと思います。

▼ラズパイPicoをArduinoIDEで動かす方法はこちら▼

 earlephilhower/arduino picoのほうのボードであればマルチコアのライブラリが準備されているのでArduino言語で記述が可能です。

スポンサーリンク
スポンサーリンク

概要

 ArduinoIDEでRaspberry Pi Picoのデュアルコアを使用する方法は以下です。

void setup() {
}

void loop() {
}

void setup1() {
}

void loop1() {
}

 通常のsetup()、loop()に加えてsetup1()、loop1()内にソースを記述するだけです。setup()/loop()の内容がcore0に、setup1()/loop1()がcore1に割り当てられます。

 これだけで並列処理が実現できます。非常に簡単です。

 抜粋ですが、一応ボードのmain.cの中身見てみると。

static void main1() {
  rp2040.fifo.registerCore();
  if (setup1) {
    setup1();
  }
  while (true) {
    if (loop1) {
      loop1();
    }
  }
}

extern "C" int main() {
  if (setup1 || loop1) {
    rp2040.fifo.begin(2);
    multicore_launch_core1(main1);
  } else {
    rp2040.fifo.begin(1);
  }
  rp2040.fifo.registerCore();

  setup();
  while (true) {
    loop();
  }
  return 0;
}

 setup1()/loop1()の有無でcore1を稼働させるような感じ。C++SDKでも割と簡単に使えそうですね。

デモソースで稼働確認

 まずは試しに使ってみます。簡単なデモソースを準備。ArduinoIDEでこの記述のまま書き込み可能です。

//  2021/06/12 imo Lab.
//  https://garchiving.com/

uint16_t LEDcnt = 0;
//core0/////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  delay(3000);
  Serial.printf("core0:start....\n");
}

void loop() {
  Serial.println(LEDcnt);
  delay(2000);
}
//core1/////////////////////////////////////////////////////
void setup1() {
  pinMode(25, OUTPUT);
  delay(3000);
  Serial.printf("core1:start....\n");
}

void loop1() {
  digitalWrite(25, HIGH);
  delay(100);
  digitalWrite(25, LOW);
  delay(900);
  LEDcnt ++;
}

 ▲なんかもっといい例が良かったのですが、並列処理をうまく使える例が思い浮かばなかったです。core1では、オンボードのLED(GP25)を1秒間隔で点滅してその点滅回数をカウント。core0では、2秒置きにLEDの点滅回数をシリアル送信してます。fifo/MUTEX/semaphoreとかここら辺まだよくわかってないのでとりあえずグローバル変数使ってます。

▼結果▼

 一応想定通りの動きにはなってます。シリアル送信しているcore0側の2秒待機中でも、core1側でLED点滅、カウントを並列で処理できてます。

 Picoの並列処理(デュアルコア)は簡単に使えて便利です。Arduinoで使えるのもいいですね。ちょっと長くなるので並列処理と逐次処理での速度比較は次回行ってみたいと思います。

コメント