Pico三昧(52) ラズパイPico2:RP2350、MicroPythonでコア確認

Joseph Halfmoon

前回RISC-Vモード用のMicroPythonをラズパイPico2にインストール。しかしRISC-Vだろうが、ArmだろうがMicroPythonなので見た目は変りませぬ。処理系自体はRISC-Vで走っていると表示してます。しかし疑り深いので、今回は本当にRISC-Vで走っているのだよね、と確認してみたいと思います。

※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。

※Pico2対応のMicroPython処理系(バイナリ、uf2形式)は以下のURLからダウンロード可能です。

https://micropython.org/download/RPI_PICO2/

※動作確認に使用しているMicroPython処理系は以下です。

MicroPython-1.24.0-riscv–with-newlib4.3.0

走っているコアがArmなのかRISC-Vなのかの確認

ラズパイPico2搭載のマイクロコントローラ RP2350は、Arm Cortex-M33コアを2個、RISC-V Hazard3コアを2個、合計4個を搭載しています。しかし同時に走れるコアはコア0とコア1の2個だけです。そこでコア0をArmにするのかRISC-Vにするのか、コア1をArmにするのかRISC-Vにするのか選択する制御が含まれてます。この選択はブート時に専用ステートマシンの制御下で行われています。このとき参照されるのが、OTPブロック内の制御レジスタです。以下の過去回でOTPについて調べてます。

Pico三昧(28) ラズパイPico2:RP2350、OTP、ワンタイムプログラミング記憶

OTP自体はメモリですが、その制御レジスタ内にどちらのコアをイネーブルにする(イネーブルにされない方は動かない)のか指定するレジスタ(ARCHSEL)が存在します。また、現在どちらのコアがArmかRISC‐Vかを知るためのレジスタ(ARCHSEL_STATUS)も存在します。以下はOTPの制御レジスタのベースアドレスとARCHSEL_STATUSレジスタのオフセット・アドレスです。

      • OTP_BASE 0x40120000
      • ARCHSEL_STATUS 0x15c

MicroPythonで上記のレジスタを読み取って現在走っているコアがArmかRISC-Vか識別するコードが以下に。

import machine
from micropython import const

OTP_BASE = const(0x40120000)
ARCHSEL_STATUS = const(0x15c)

stat = machine.mem32[OTP_BASE + ARCHSEL_STATUS]
c0="Arm"
c1="Arm"
if stat & 1:
    c0="RISC-V"
if stat & 2:
    c1="RISC-V"
print("Core 0 is currently {0}. Core 1 is currently {1}.".format(c0, c1))
実行結果

結果が以下に。DetectCoreTypeResults

当然ながら両コアともRISC-V。OTP制御レジスタも読めたみたいだし。

Pico三昧(51) ラズパイPico2:RP2350、MicroPythonでRISC-V へ戻る

Pico三昧(53) ラズパイPico2:RP2350、MicroPythonで2コア実行 へ進む