Common Lispの系譜を継ぐuLispをラズパイPico2マイコン上で練習中。ここ数回でSPIやらI2Cやらの先に接続された「メモリ」を読み書き。しかしuLispは恐ろしいことにCPUコアから見えるメモリ空間を直接読み書きする方法も提供してくれてます。関数名からするとペリフェラルの制御レジスタへのアクセス用です。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
register関数
全てのバージョンの uLisp でサポートされているわけではないようですが、今回使用させていただいているArmプロセッサ用の 4.6b バージョンではregisterという名の関数が存在します。当然、ラズパイPico2機上でもこの関数が使えます。
その名からすると何やらレジスタを読み書きする関数に思えますが、「メモリマップされたレジスタ」を読み書きできる関数です。不用意にuLispシステムが使っているメモリを勝手に上書きなどするとどんな酷い目にあうか分からないので、フツーのメモリには使わないでね、と警告されてます。当然、つかえちゃうんだけれども。
-
- (register メモリアドレス)、という書式にてメモリアドレスからの読み取り
- (register メモリアドレス、データ)、にて書き込み
が可能。この「危ない」関数については、ターゲット機により差異があるのでドキュメントも充実してます、以下です。
CPUコアのIDとアーキテクチャの読み取り
ラズパイPico2のRP2350マイクロコントローラは、デュアル・コアのシステムです。その辺のデュアル・コアと違うユニークなところは、2つのコアに異なるアーキテクチャのArmかRISC-Vをアサインできる(アサインされなかった方はお休み)というところであります。
以下の別シリーズ回にて、今走っているコアはArmなのRISC-Vなのという問い掛けに応えるMicroPythonコードを走らせてます。
Pico三昧(52) ラズパイPico2:RP2350、MicroPythonでコア確認
また、以下では、今走っているコアはコア0なの、コア1なのという問いかけに応えてます。
Pico三昧(53) ラズパイPico2:RP2350、MicroPythonで2コア実行
MicroPythonといいつつどちらもメモリマップされた「レジスタ」を読み取っているだけなので、同様なことを uLisp でも実行できる筈。やってみました。
(defun archsel-stat () (let ((otp-base #x40120000) (archsel-status #x15c)) (register (+ otp-base archsel-status)))) (defun cpu-id () (let ((sio-base #xd0000000) (cpu-id #x000)) (register (+ sio-base cpu-id)))) (defun print-core-info () (case (cpu-id) (1 (princ "CORE 1: ")) (t (princ "CORE 0: "))) (case (archsel-stat) (1 (princ "RISC-V")) (t (princ "Arm"))) nil )
uLisp処理系は、Armアーキテクチャ(Arm Cortex-M33)のコア0の上で走っているようだね。当たり前か。
レジスタを直接読み書きできるとなると世界が広がっちゃうね。ホントか?