この記事はリンク情報システムの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に対して行うので注意してください。
(詳しい書き込み方はこちら)
#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のおかげで簡単にマルチコア処理を実現できるので
今後の趣味プログラミングには積極的に取り入れていこうかなと思います。