ラズピコ デュアルコアしてみる

ラズピコ デュアルコアしてみる

皆さん こんにちは。

今回はコアを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チカします)

皆さんは うまくデュアルコアできましたか?
お疲れさまでした。

Dual Coreカテゴリの最新記事