Open3

yunipocket: メモリ捻出のためにXIP(eXecute In Place)前提にする

okuokuokuoku

ちょっと作るものに対してメモリが足りなさすぎるので、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:

こうして見てみると192KiBが最低保証されているように見えるが、ESP32ではSRAM2にはコードを置けないので、なんだかんだでコードサイズ制約が存在することになる。

XIP

XIPはRaspberry Pi PicoのようなARM搭載ボードでは一般的な、外付けのフラッシュメモリからキャッシュを介してプログラムを実行することを指す。

Raspberry Pi Picoの場合、フラッシュメモリコントローラ側に16KiBのキャッシュがあり、このキャッシュが通常のメモリとして使用できなくなる代りに、フラッシュメモリをメモリ空間に直接mapできる。

メリット

大きなプログラムをCPU内蔵Flash/RAMのサイズを気にせずに実行できるようになる。今までのプランでは、ユーザアプリケーションのプログラム用に64KiBを確保していたのを丸ごと空けられるためメリットは非常に大きい。

XIPは略語に eXecute を含んでいるが、当然プログラムコード以外にデータにも使用できる。

デメリット

キャッシュなのでタイミングや消費電力の面では不利になる。また、 タイミングが不定になる 。例えばカーネルやソフトシンセ類はRAM常駐にした方が良いかもしれない。

XIPを有効にしている間はFlashに書き込めない?と思う。

okuokuokuoku

nRF52840がヤバい

XIPキャッシュゼロってのは予想外だった。。まぁ確かに冷静に考えると超低消費電力をウリにしたプロセッサにキャッシュ山盛りって事は無いよな。。通常のアプリケーションでは要らない(外部からプログラムをロードするのは電力がもったいない)し。

https://infocenter.nordicsemi.com/topic/struct_nrf52/struct/nrf52.html

というかプロダクト比較表では "Cache" って明言されてるのに内蔵フラッシュにしか効かないとは。。コアクロックも遅い(64MHz)し、ターゲットから外してしまう or 内蔵フラッシュにアプリをインストールする前提にしてしまっても良いかもしれない。(ただしFlashの保証寿命は超短い -- 1万回消去すると寿命になる)

後継のnRF53シリーズではCortexM33になってCPUキャッシュも搭載されている。

okuokuokuoku

フラッシュの寿命

メモリ上にユーザコードを置かなくなると、

  • デバッグ実行のたびにフラッシュの書き換えが必要になる
  • ブレークポイントの設定のたびにフラッシュの書き換えが必要になる

という問題があり、どちらもフラッシュの寿命に効いてきてしまう。ただ、後者はハードウェアブレークポイントが大抵のCPUで使えるのでそこまで深刻ではない。

WinbondのNORフラッシュはminimumで消去10万回に耐える仕様。CPU内蔵フラッシュの10倍長寿命となっている。