16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

お試しマルチコア(Spresense)

Last updated at Posted at 2020-01-06

この記事はリンク情報システムの2020新春アドベントカレンダー Tech Connectのリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
(リンク情報システムのFacebookはこちらから)

2020新春アドベントカレンダー Tech Connect インデックスはこちら

はじめに

最初の記事を担当します、mk-takahashiです。
当初はあれやこれやと企画を考えていたんですが、
結局いつも通り時間が取れなかったので簡単な記事を書きたいと思います。

2019年6月5日にSpresenseのArduino IDE環境においてマルチコアプログラミング環境が使えるようになりました。
今後この機能を使ってみたいなぁと思っているので、とりあえずお試しでマルチコア機能を使った簡単なコードを作成します。
ちょっと試して今後の使い方が見えてくるかなと思っているので、難しいことは一切していないです。

とりあえず作るものの構想

Spresenseには1つのmaincoreと5つのsubcoreがあります。
Spresenseメインボード上にある4つのLEDをそれぞれsubcoreに制御させ、
maincoreはシリアル通信、各subcoreの制御を行います。

ユーザーはシリアルモニターを使い、
制御するLEDの番号(1~4)と点灯間隔([1~255]*10ms)で指定できます。

これにより4つのLEDを異なるタイミングで、
しかも簡単にLチカできるようになるはずです。

コード

コードの先の方に出てくるsetupとloopはsubcore用の処理です。
後の方に出てくるsetupとloopはmaincore用の処理です。

同じソースコード上に書いていますが、
書き込みは各coreに対して行うので注意してください。
(詳しい書き込み方はこちら

mp_test.ino
#include <MP.h>

#ifdef SUBCORE

#if   (SUBCORE == 1)
#define LED LED0
#elif (SUBCORE == 2)
#define LED LED1
#elif (SUBCORE == 3)
#define LED LED2
#elif (SUBCORE == 4)
#define LED LED3
#endif

byte interval;

void setup()
{
  MP.begin();
  MP.RecvTimeout(MP_RECV_POLLING);
}

void loop()
{
  int        ret;
  int8_t     msgid;

  ret = MP.Recv(&msgid, &interval);

  ledOn(LED);
  delay(interval*10);
  ledOff(LED);
  delay(interval*10);
}

#else  /* MAINCORE */

void setup()
{
  int ret = 0;
  int subid;

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

  /* Boot SubCore */
  for (subid = 1; subid <= 4; subid++) {
    ret = MP.begin(subid);
    if (ret < 0) {
      printf("MP.begin(%d) error = %d\n", subid, ret);
    }
  }

  /* Polling */
  MP.RecvTimeout(MP_RECV_POLLING);
}

void loop()
{
  byte     subcore = 0;
  byte     interval = 0;
  int8_t   msgid = 0;
  int      len = 0;

  Serial.print("LED NUMBER:");
  while(Serial.available() <= 0);

  subcore = Serial.read()-48;
  Serial.println(subcore);

  Serial.print("Lighting interval:");
  while(Serial.available() <= 0);
  len = Serial.available();

  while(len){
    interval = interval*10 + Serial.read()-48;
    len--;
  }
  Serial.println(interval);

  MP.Send(msgid, interval, subcore);
}

#endif

最後に

今までのシングルコアでは実現させるのが面倒だった処理が、
割とあっさりと実装できました。
ArduinoとSpresenseのおかげで簡単にマルチコア処理を実現できるので
今後の趣味プログラミングには積極的に取り入れていこうかなと思います。

16
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?