皆さん こんにちは。
今回はコアを2つ動かしてみます。
私の場合マルチコアの製品を使うのは ESP32 に続いて今回が2回目になります。
ラズピコのマイコン RP2040 の場合、比較的簡単にマルチコアの動作が実現できます。
プロジェクトの作成
以下の設定でプロジェクトを作成します。
Project Name: picoMulticore
Console Options の Console over UART をチェックする
IDE Options の Create VSCode project をチェックする
Debugger: は PicoProbe を選択する

VSCodeを起動する
起動後、何かファイルが開いてたら File – Close Folder で閉じた後、File – Open Folder から picoMulticore のフォルダーを辿って選択します。
こちらの環境では C:\Users\m3925\Documents\Pico\pico-project-generator\picoMulticore です。
m3925の部分は皆さんのユーザー名に置き換えてください。
vscode関連の json ファイルは前回作成済のプロジェクトのものをドラッグ&ドロップでコピー&ペーストすると楽です。
ソースコードを書く
#include <stdio.h>
#include "pico/multicore.h"
#include "pico/stdlib.h"
#define FLAG_VALUE 123
#define LED_PIN 25
void core1_entry() {
multicore_fifo_push_blocking(FLAG_VALUE);
uint32_t g = multicore_fifo_pop_blocking();
while (true) {
if (g == FLAG_VALUE) {
gpio_put(LED_PIN, 1);
sleep_ms(500);
gpio_put(LED_PIN, 0);
sleep_ms(500);
}
}
}
int main() {
stdio_init_all();
puts("Hello, Dual core!");
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, true);
gpio_put(LED_PIN, 0);
multicore_launch_core1(core1_entry);
uint32_t g = multicore_fifo_pop_blocking();
while (true) {
if (g == FLAG_VALUE) {
gpio_put(LED_PIN, 1);
sleep_ms(200);
gpio_put(LED_PIN, 0);
sleep_ms(100);
gpio_put(LED_PIN, 1);
sleep_ms(2000);
gpio_put(LED_PIN, 0);
multicore_fifo_push_blocking(FLAG_VALUE);
while (true) {
;
}
}
}
return 0;
}
PC側の準備
マルチコアの動作確認用として Tera Term を使います。
API関数がうまく動作したか否かなどの結果をUARTのputs()やprintf()でログ出力するようにしてみました。
Tera Termをお持ちでない方は こちら からダウンロードしてお使いください。
インストール後、 Tera Term を起動し、シリアルポートでPicoprobeのCOMポートを選択します。
もしCOMポートが複数ある場合には、Picoprobe以外の通信ケーブルをはずしてデバイスマネージャーでCOMポート番号を確認しておきます。

起動後、設定メニューのシリアルポートから以下の設定を行います。
スピート : 115200
データ : 8 bit
パリティ : なし
ストップビット : 1
フロー制御 : none
(設定値からスピードだけ変更すれば良いはずです)
と言っても今回は puts(“Hello, Dual core!”); するだけでした。
お手数おかけしました。
今回使ったMulticoreのAPI
multicore_launch_core1()
コア1を起動します。
第1引数:コア1で動作させる関数を void func(void) 型 で指定します。
multicore_fifo_push_blocking()
もうひとつのコアに向けて、FIFOにデータをプッシュします。
(プッシュするまでブロッキングします)
第1引数:uint32_t型の値
multicore_fifo_pop_blocking()
もうひとつのコアから届くデータを、FIFOからポップします。
(ポップするまでブロッキングします)
戻り値:uint32_t型の値
動作させてみる
それでは F5キーを押してプログラムを動作させてみます。
LEDがフラッシュした後、500msec毎にLチカすれば成功です。
(コア1の方でLチカします)
皆さんは うまくデュアルコアできましたか?
お疲れさまでした。