今回比較するのは主記憶SRAM。データでもコードでも置ける普通のSRAMです。PicoのRP2040では合計264KB、Pico2のRP2350では合計524KB。でも違うのは容量だけではないみたい。バスとの接続、パワードメイン、セキュリティといろいろ差異ありっと。でも気にしなければ通り過ぎることも可?ホントか?
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
Pico、Pico2のSRAM容量がキリがよくない理由
通常、メモリの容量というのは2のべき乗ピタリ賞のキリに良い数字になる筈です。そうでないとハードが歪になってしまう。キリが良いのは256KB(ここでのK=1024バイト)とか512KBとかとなります。しかし、Picoでは264KB、Pico2では524KBです。ちょいと半端ね。その原因は
-
- PicoのRP2040では (64KB * 4) + (4KB * 2) = 264KB
- Pico2のRP2350では (64KB * 8) + (4KB * 2) = 524KB
というSRAMの「バンク構成」にあります。どちらも4KBの小さいバンクが2個あり、それがあるためにキリの良いサイズよりも8KBデカイと。そういう構成になっている主な理由は第30回の内部バスの回にあります。各SRAMバンク(32bit幅)毎にバス接続(クロスバへの)ポートを持っているようです。つまりRP2040では6バンクあるので合計6ポート、RP2350では10バンクあるので合計10ポートのバス接続があると。それらはマスタであるコアやDMAとクロスバ接続されているので、異なるマスタと異なるポート間のトラフィックではれば並行に動けるというゴージャスさです。複数のコア積んでいても交通渋滞すると性能発揮できないので流石なご配慮デス。
ちなみに各4KBの小さいサイズの領域は各コア専用にスタックにでも割り当てておけ、という思し召しのようです。スタックにアクセス行くことは多いと思うので、ここが分かれていれば衝突するタイミングも少なくなるのでしょう。
メモリマップを見てみる
さてメモリマップを見てみます。遠くからみると
-
- RP2040、0x20000000番地から264KB
- RP2350、0x20000000番地から524KB
ということで差はメモリ容量だけにも見えます。しかし細かくみるとこんな感じ。
Address | RP2040 | RP2350 |
---|---|---|
0x20000000-0x2003FFFF | SRAM0/1/2/3 striped | SRAM0/1/2/3 striped, PD0 |
0x20040000-0x20040FFF | SRAM4 | |
0x20041000-0x20041FFF | SRAM5 | |
0x20040000-0x2007FFFF | SRAM4/5/6/7 striped, PD1 | |
0x20080000-0x20080FFF | SRAM8, PD1 | |
0x20081000-0x20081FFF | SRAM9, PD1 | |
0x21000000-0x2100FFFF | SRAM0 non-striped mirror | |
0x21010000-0x2101FFFF | SRAM1 non-striped mirror | |
0x21020000-0x2102FFFF | SRAM2 non-striped mirror | |
0x21030000-0x2103FFFF | SRAM3 non-striped mirror |
まず最初の256KBに、64KB分のバンク4個が割り当てられているのは共通してます。ここでどちらも stripped と注釈入っているところがミソです。
マップ上は4バンクは連続しておらず、バンク0、1、2、3の順に繰り返し現れるようになってます。SRAMのビット幅は32ビット(4バイト)なので下のアドレス0番地がバンク0、下のアドレス4番地がバンク1、下のアドレス8番地がバンク2、下のアドレス0xC番地がバンク3という塩梅です。何も考えずに連続した番地にアクセスしても複数バンクにトラフィックが分散することになりそうです。
RP2040には記載なく、RP2350側だけ記載されているのが、PD0とかPD1とかです。勝手にPDなどと略しました。
Power Domain
です。以前の回でやったとおり、RP2350にはパワードメインというものがあり、「お休みしていてもよい」回路の電源をコントールして消費電力を削減する機能があります。RP2350のSRAMの場合、パワードメインは2つ設定されており、下の256KB分が0,上の264KB分が1です。スイッチはこまめに入り切りせよと?
一方、RP2350になく、RP2040にあるのが、より上のアドレスに設定されている「ミラー」という領域です。エイリアスと言っても良いか?ここはバンク0、1、2、3のSRAMをベタな連続した領域として見せてくれる部分です。ここを使えばバンク0だけ連続とか、アクセスパターンを限定することができます。しかし、RP2350ではこの機能は削除されたようです。どうもセキュリティ的に2つの異なるアドレスでアクセスするのを管理するのがメンドクさかったのではないかと。知らんけど。まあ、RP2040でどれだけのプログラムがこの機能を使っていたかどうかは分かりませぬが。
「容量が違う」だけの理解でも使うことはできる。でも、機能、性能を発揮させるためにはコマケー話の部分までやり切る必要ありっと。