前回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))
実行結果
当然ながら両コアともRISC-V。OTP制御レジスタも読めたみたいだし。