pages

ArduinoでMultiCore通信

前に戻る

FIFO 通信の方法

#include "pico/multicore.h"
#include "Arduino.h"

void setup() {
    // GPIO25をLED制御用に設定
    pinMode(25, OUTPUT);
}

void loop() {
    // FIFOからCore1のメッセージを受信してLED状態を変更
    if (rp2040.fifo.available()>0) {  // ★★★
        uint32_t data = rp2040.fifo.pop(); // ★★★
        if (data == 0x80) {digitalWrite(25, HIGH);}
        else {digitalWrite(25, LOW);}
    }
}

bool state = false;
void setup1() {
}

void loop1() {
    // Core1側: 200msecごとにon/off状態をFIFOで送信
    uint32_t data = 0x80;
    if (state) {data = 0xc0;}
    rp2040.fifo.push(data);  // ★★★
    state = !state;         // 状態反転
    delay(200);
}

共有メモリによる通信方法

// Core間通信用
volatile uint32_t midiRcvRingBuffer[BUFFER_SIZE];
volatile int midiRcvWritePtr = 0;
volatile int midiRcvReadPtr = 0;

// 送る側
  int nextHead = (midiRcvWritePtr + 1) % BUFFER_SIZE;
  if (nextHead == midiRcvReadPtr) return false;  // バッファ満杯
  midiRcvRingBuffer[midiRcvWritePtr] = data;
  midiRcvWritePtr = nextHead;

// 受ける側
  if (midiRcvWritePtr == midiRcvReadPtr) return false;  // バッファ空
  uint32_t data = midiRcvRingBuffer[midiRcvReadPtr];
  midiRcvReadPtr = (midiRcvReadPtr + 1) % BUFFER_SIZE;