Kanade Electronicskanaelecom
🏗

メモリ空間

RK16のメモリ空間を定義します

Addr
レジスタ
0x0000ゼロレジスタ
0x0001割込復帰アドレス
0x0002pc プログラムカウンタ
0x0003sp スタックポインタ
0x0004ra 関数復帰アドレス
0x0005rp 関数復帰ポインタ
0x0006:0x0007a0-a1 引数 / 返り値
0x0008:0x000Bt0-t3 一時 (caller-save)
0x000C:0x000Fs0-s3 保存 (callee-save)
状態制御レジスタ
0x0010HALT (1 を書くと停止)
入出力レジスタ
0x0100serial_tx
0x0101serial_rx
0x1000:0x2FFF映像メモリ
0x3000:0x4FFF定数メモリ
0x5000:0xffff変数メモリ

レジスタ

メモリ空間先頭の 16 word はレジスタとしてアドレス指定できます。

ゼロレジスタ zero

値が 0x0000 に固定されたレジスタです。書き込みは無視されます。mov(rd, rs)add(rd, rs, z) で、loadi(rd, imm)addi(rd, z, imm) で実現するためのレジスタです。

割込復帰アドレス ira (Interrupt Return Address)

割り込みが受理された瞬間、ハードウェアが現在の PC をこのレジスタに退避します。iret 命令は PC を ira に書き戻して元の処理に復帰します。

プログラムカウンタ pc (Program Counter)

通常の load/store から読み書きはできず、PC を更新するには jump / call / ret 等の制御命令を使う必要があります。

制御レジスタ csr (Control & Status Register)

プロセッサの状態を管理するためのレジスタです。

bit機能
bit 0割り込み許可 (ENABLE)
bit 2-5割り込みマスク (MASK0-MASK3)
bit 8intr0 発火フラグ
bit 9intr1 発火フラグ
bit 10intr2 発火フラグ
bit 11intr3 発火フラグ

CSR はレジスタなので、andi(csr, csr, mask) / ori(csr, csr, flag) という形で 1 命令で制御できます。

復帰アドレス ra (Return Address)

call 命令が次に実行すべき PC (PC + 1) を書き込みます。ret 命令は ra を読んで PC に書き戻します。

関数フレームポインタ fp (Frame Pointer)

関数フレームの基底アドレスです。RK16 ABI ではスタックは FP のみで管理し、subi(fp, fp, n) でフレームを伸ばし、リターン時に元の FP を書き戻します。

汎用レジスタ a0:a1, t0:t3, s0:s3

 汎用レジスタは 10 本。RISC-V 風に役割を 3 グループに分けます。

  • a0-a1 (caller-save): 引数および返り値
  • t0-t3 (caller-save): 一時計算用。関数呼出で破壊されうる
  • s0-s3 (callee-save): callee が prologue/epilogue で退避・復元するので、caller から見れば呼出を跨いで値が保たれる

 呼出規約の詳細は 関数呼び出し規約 を参照。

状態制御レジスタ

入出力レジスタ

メモリマップド I/O はアドレス 0x1000 以降に並びます。シリアル送受信は serial_tx (0x1000) に書き込めば送信、serial_rx (0x1001) を読めば受信 (受信バッファが空なら 0xFFFF) という単純な仕様です。

映像メモリ VRAM

定数メモリ EEPROM

変数メモリ SRAM