Spresenseのマルチコア


Spresenseのマルチコアを試す

SonyのSpresenseボードは、ARM Cortex M4Fを6個搭載している。ここでは、マルチコアプログラミングを試してみる。

環境

Arduino IDE利用。サンプルコードは下記にあるものを参考に作成。

また、こちらに、マルチコアプログラミングについて詳しい説明あり。

サンプル

MaincoreとSubcore(ここでは2番目)とがメッセージの送受信を行い、受信時にLEDを点灯させるもの。

ソースコード

Maincore

Main.ino
#ifdef SUBCORE  // ①
#error "Core selection is wrong!!"
#endif

#include <MP.h>

int subcore = 2; /* Communication with SubCore2 */  // ② 

void setup()
{
  int ret = 0;

  Serial.begin(115200);
  while (!Serial);

  /* Launch SubCore2 */
  ret = MP.begin(subcore);  // ③
  if (ret < 0) {
    printf("MP.begin error = %d\n", ret);
  }

  randomSeed(millis());
}

void loop()
{
  int      ret;
  uint32_t snddata;
  uint32_t rcvdata;
  static int8_t   sndid = 0;
  int8_t   rcvid;

  snddata = random(32767);

  ret = MP.Send(sndid, snddata, subcore);  // ④
  printf("MainCore Send: id=%d data=0x%08x\n", sndid, snddata);
  sndid = (sndid != 127)? (sndid+1): 0;
  if (ret < 0) {
    printf("MP.Send error = %d\n", ret);
  }

  MP.RecvTimeout(3000); // Timeout 3000 msec

  ret = MP.Recv(&rcvid, &rcvdata, subcore);  // ⑤
  ledOn(LED0);  // ⑥
  delay(500);
  ledOff(LED0);
  if (ret < 0) {
    printf("MP.Recv error = %d\n", ret);
  }

  printf("MainCore Recv: id=%d data=0x%08x : %s\n\n", rcvid, rcvdata,
         (snddata == rcvdata) ? "Success" : "Fail");

  delay(1000);
}
  • ①:Subcore指定時にはエラー
  • ②:Subcore2の指定
  • ③:Subcore2を指定してマルチコア起動
  • ④:Subcore2へメッセージ(ランダム数値)送信
  • ⑤:Subcore2からメッセージ受信
  • ⑥:LED0点灯

Subcore

Sub2.ino
#if (SUBCORE != 2)  // ⑦ 
#error "Core selection is wrong!!"
#endif

#include <MP.h>

void setup()
{
  int ret = 0;

  Serial.begin(115200);
  while (!Serial);

  ret = MP.begin();  // ⑧
  if (ret < 0) {
    printf("MP.begin error = %d\n", ret);
  }
}

void loop()
{
  int      ret;
  int8_t msgid;
  uint32_t msgdata;

  /* Echo back */

  ret = MP.Recv(&msgid, &msgdata);  // ⑨
  if (ret < 0) {
    printf("MP.Recv error = %d\n", ret);
  }

  delay(100);
  printf("SubCore2 Recv: id=%d data=0x%08x\n", msgid, msgdata);
  ledOn(LED2);  // ⑩
  delay(2000);
  ledOff(LED2);

  ret = MP.Send(msgid, msgdata);  // ⑪
  if (ret < 0) {
    printf("MP.Send error = %d\n", ret);
  }
}
  • ⑦:Subcore2の指定(それ以外はエラー)
  • ⑧;マルチコア起動
  • ⑨:Maincoreからメッセージ受信
  • ⑩:LED2点灯
  • ⑪:Maincoreへメッセージ送信(ループバック)

Build

Build時に対象となるCoreを指定する必要がある。間違えるとBuildエラーとなる。(ソースコードの①、⑦参照。)

Maincore

Subcore2

実験

シリアルコンソール表示。

MaincoreのLED点灯。

Subcore2のLED点灯。

成功。