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.
Co je v buildu
Sekce “Co je v buildu”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:
| Modul | Stav | Proč |
|---|---|---|
picogame (+ rychlý DMA displej) | on | nativní 2D engine |
| Wi-Fi / CYW43 stack | on | status LED + budoucí multiplayer |
ulab, synthio, audio, displayio, bitmaptools, vectorio, … | on | univerzální, vše se vejde |
nativní _stage | off | kompatibilitu ugame/stage zajišťuje v Pythonu picogame-stage, takže C modul je nadbytečný |
picodvi, _eve | off | zařízení nemá HDMI/DVI ani FT8xx hardware |
qrio | off | QR 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-pathsJá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).
Frekvence SPI displeje
Sekce “Frekvence SPI displeje”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.
Sestavení a nahrání
Sekce “Sestavení a nahrání”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.