Přeskočit na obsah

Sestavení firmwaru

Jak je nakonfigurovaný a vyladěný oficiální PicoPad firmware. Je to build, který obsahuje nativní engine picogame — co je zkompilované dovnitř, plus dvě RP2040-specifická build rozhodnutí: optimalizace kompilátoru a frekvence SPI displeje.

Na psaní her nic z toho nepotřebuješ — je to pro sestavení nebo pochopení samotného firmwaru.

Firmware je univerzální CircuitPython build s přidaným enginem — cílem je jeden image, kde funguje všechno, co zařízení umí, ne ořezaný herní ROM. Takže ulab, synthio, celá audio rodina, displayio, bitmaptools, vectorio, Wi-Fi, keypad a zbytek zůstávají zapnuté. Pár modulů je vypnutých — ale jen ty, co zařízení neumí použít, nebo jsou dostupné jinak:

ModulStavProč
picogame (+ rychlý DMA displej)onnativní 2D engine
Wi-Fi / CYW43 stackonstatus LED + budoucí multiplayer
ulab, synthio, audio, displayio, bitmaptools, vectorio, …onuniverzální, vše se vejde
nativní _stageoffkompatibilitu ugame/stage zajišťuje v Pythonu picogame-stage, takže C modul je nadbytečný
picodvi, _eveoffzařízení nemá HDMI/DVI ani FT8xx hardware
qriooffQR dekódování potřebuje kameru, kterou PicoPad nemá; vypadne i jeho ~32 KB backend quirc (QR generování přes adafruit_miniqr to neovlivní)

Se vším výše uvedeným image zabírá kolem 88 % z 1,5 MB firmware regionu.

Optimalizace kompilátoru: laděné −O2, ne −O3

Sekce “Optimalizace kompilátoru: laděné −O2, ne −O3”

rp2 port CircuitPythonu defaultně používá -O3. Na Cortex-M0+ PicoPadu (žádné SIMD, žádná FPU, malá 16 KB XIP flash cache) je většina toho, co -O3 přidává nad -O2, pro tenhle kód mrtvá váha:

  • auto-vektorizér (-ftree-loop-vectorize / -ftree-slp-vectorize) — nejsou žádné SIMD instrukce, na které by cílil, takže nepomůže;
  • -fipa-cp-clone (klonování funkcí) a těžké unroll/peel/version smyčkové passy — nafukují flash, aniž by zrychlily těsné skalární pixel smyčky enginu.

Na M0+ dává -O2 plus pět levných smyčkových passů stejný výkon enginu jako -O3 (v rámci zhruba 1 %) a přitom ušetří ~150 KB flash:

OPTIMIZATION_FLAGS = -O2 -funswitch-loops -fpredictive-commoning -fgcse-after-reload \
-ftree-partial-pre -fsplit-paths

Jádro interpretu MicroPythonu (gc.o, vm.o) zůstává na -O3 bez ohledu na to, díky nastavení SUPEROPT_* v CircuitPythonu, takže rychlost běhu Pythonu je nedotčená.

Navíc nejteplejší smyčka enginu — plain sprite blit, nejčastější operace — nese #pragma GCC unroll 4: na M0+ o ~6 % rychlejší za +0,6 KB. Aplikuje se jen na tu jednu smyčku, ne globálně (-funroll-loops přes celý firmware by přetekl flash region).

Board žádá 62,5 MHz pro ST7789, ne 60. RP2040 PL022 SPI periferie umí dělit clk_peri (125 MHz) jen sudými celými čísly a požadovaný baudrate je strop zaokrouhlený dolů — takže požadavek na 60 MHz tiše dá 125/4 = 31,25 MHz, poloviční rychlost, zatímco 62,5 MHz je přesně 125/2 a běží na plné rychlosti (~2× propustnost displeje). Plné odvození, příběh overclockingu i případ RP2350 jsou v Hodiny, SPI a limity displeje.

Engine žije ve forku CircuitPythonu; sestav z něj board pajenicko_picopad a výsledný .uf2 nahraj přes BOOTSEL jako jakýkoliv CircuitPython firmware. Zařízení viz Spuštění na zařízení a paměťový rozpočet Vejít se do paměti.