yunipocket: メモリ捻出のためにXIP(eXecute In Place)前提にする
ちょっと作るものに対してメモリが足りなさすぎるので、XIP、つまり外付けフラッシュメモリからの直接実行を前提にプランを考えなおす。
XIP導入後のメモリプラン
SoC | SAMD51P19 | nRF52 | ESP32 | RPi Pico |
---|---|---|---|---|
OS | 512KiB | 1MiB | 0 | 0 |
OS Cache | 0 | 2KiB(Inst) | 0 | 0 |
XIP Cache | 4KiB(CPU) | 0 | 32+32KiB | 16KiB |
Frame Buffer | 0 | 0 | 0 | 38KiB |
Free RAM | 192KiB | 256KiB | 128(SRAM0)+128(SRAM1)+200(SRAM2)KiB | 226KiB |
- OS : OSを格納するフラッシュメモリ。Arduinoのブートローダやプロトコルスタック等で20KiB程度はリザーブされる。
- XIP Cache : XIPによってアクセスされたコードのキャッシュ。
- OS Cache : CPU内蔵フラッシュのキャッシュ。nRF52には命令キャッシュしかない。
- Frame buffer : RPi PicoではソフトウェアでVGA出力するので、そのためのバッファが必要。
source:
- SAMD51P19: Wio Terminal用。https://www.microchip.com/en-us/product/ATSAMD51P19A ... もしかしてXIP offsetを設定できなかったりする。。?
- nRF52: nRF52840。 https://www.nordicsemi.com/Products/nRF52840?lang=ja-JP https://infocenter.nordicsemi.com/pdf/nRF52840_PS_v1.7.pdf というかXIPにキャッシュ無いのかよ!これでは流石に使えない(と思う)のでユーザアプリはRAMに置くしかないな。。
- ESP32: 言わずと知れた。 https://www.espressif.com/en/products/socs/esp32 https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf XIPキャッシュはSRAM0から拠出する。SRAM0はInstバス、SRAM1は両方、SRAM2はDataバス専用。XIPキャッシュは2コアで分割、合計64KiB。
- RPi Pico: https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
こうして見てみると192KiBが最低保証されているように見えるが、ESP32ではSRAM2にはコードを置けないので、なんだかんだでコードサイズ制約が存在することになる。
XIP
XIPはRaspberry Pi PicoのようなARM搭載ボードでは一般的な、外付けのフラッシュメモリからキャッシュを介してプログラムを実行することを指す。
Raspberry Pi Picoの場合、フラッシュメモリコントローラ側に16KiBのキャッシュがあり、このキャッシュが通常のメモリとして使用できなくなる代りに、フラッシュメモリをメモリ空間に直接mapできる。
メリット
大きなプログラムをCPU内蔵Flash/RAMのサイズを気にせずに実行できるようになる。今までのプランでは、ユーザアプリケーションのプログラム用に64KiBを確保していたのを丸ごと空けられるためメリットは非常に大きい。
XIPは略語に eXecute を含んでいるが、当然プログラムコード以外にデータにも使用できる。
デメリット
キャッシュなのでタイミングや消費電力の面では不利になる。また、 タイミングが不定になる 。例えばカーネルやソフトシンセ類はRAM常駐にした方が良いかもしれない。
XIPを有効にしている間はFlashに書き込めない?と思う。
nRF52840がヤバい
XIPキャッシュゼロってのは予想外だった。。まぁ確かに冷静に考えると超低消費電力をウリにしたプロセッサにキャッシュ山盛りって事は無いよな。。通常のアプリケーションでは要らない(外部からプログラムをロードするのは電力がもったいない)し。
というかプロダクト比較表では "Cache" って明言されてるのに内蔵フラッシュにしか効かないとは。。コアクロックも遅い(64MHz)し、ターゲットから外してしまう or 内蔵フラッシュにアプリをインストールする前提にしてしまっても良いかもしれない。(ただしFlashの保証寿命は超短い -- 1万回消去すると寿命になる)
後継のnRF53シリーズではCortexM33になってCPUキャッシュも搭載されている。
フラッシュの寿命
メモリ上にユーザコードを置かなくなると、
- デバッグ実行のたびにフラッシュの書き換えが必要になる
- ブレークポイントの設定のたびにフラッシュの書き換えが必要になる
という問題があり、どちらもフラッシュの寿命に効いてきてしまう。ただ、後者はハードウェアブレークポイントが大抵のCPUで使えるのでそこまで深刻ではない。
- Wio Terminal: W25Q32JVZPIM https://www.mouser.jp/datasheet/2/949/w25q32jv_dtr_revg_03272018_plus-1489786.pdf
- m5Stack ATOM Lite = ESP32-PICO-D4 ... flashの品番がわからん。。(PSRAMをipusから買ってるのと同じように、flashもどっかから買ってるのではないか)
- Raspberry Pi Pico: W25Q16JV https://www.mouser.jp/datasheet/2/949/w25q16jv_spi_revg_03222018_plus-1489727.pdf
WinbondのNORフラッシュはminimumで消去10万回に耐える仕様。CPU内蔵フラッシュの10倍長寿命となっている。