This post is also available in: en
Tento post je součástí série článků o vývoji pro STM8 s OpenSource nástroji. Přehled celého toolchainu najdete v postu Vývoj STM8 s OpenSource nástroji.
Historická řešení
Postupy popsané v tomto článku jsou historická řešení. Fungují, ale projekty jsou neudržované a dnes je v naprosté většině případů nepotřebujete — stačí použít SPLSPL. Článek jsem ponechal pro úplnost a pro rozšíření obzoru, aby bylo vidět, jak se dá problém řešit i jinak.
Kompilátor SDCC neumí odstranit
nepoužívaný (mrtvý) kód, a proto je výsledný program při použití knihovny
jako SPL zbytečně velký. Základní řešení (rozdělená knihovna SPLSPL)
je popsáno v hlavním článku.
Zde jsou dvě další cesty, jak mrtvý kód odstranit.
SDCC-gas¶
https://github.com/hainguyen8y/sdcc-gas
Projekt je nejspíš mrtvý
Původní repozitář XaviDCR92/sdcc-gas z GitHubu zmizel (404), proto odkazuji
na kopii od jiného uživatele (stejná historie, poslední commit z 10. 11. 2019).
Původní stránka je uchována i ve
Wayback Machine.
Vývoj byl dávno zastaven a budoucnost tohoto řešení je nejistá. GNU Assembler pro
STM8, na kterém sdcc-gas stojí, žije dál (jako experimentální projekt) v
repozitáři vdudouyt/stm8-gas.
Mrtvý kód se tímto způsobem odstraňuje nejlépe, ale za cenu komplikací. Řešení vzniklo
přidáním podpory GNU Assembleru,
tedy gas, do SDCC 3.9.0. gas je
výhodou i nevýhodou tohoto řešení. Na jednu stranu to znamená, že můžeme
používat klasické nástroje z GNU
binutils, na druhou stranu to
znamená, že nelze použít ty části sdcc-libraries, které jsou napsané v STM8
assembleru a je nutné použít méně optimální kód napsaný v C nebo STM8 assembler
přepsat do GNU assembleru. …no a zřídka se stane, že nějaká vnitřní
funkcionalita (například násobení 64-bitových integerů) je napsaná jen v STM8
assembleru a vám nezbude, než to nějak obejít nebo danou funkci přepsat do GNU assembleru.
Pokud vás to zajímá více, můžete si počíst diskusi k issue #2 (archiv) nebo si prohlédnout ukázkový projekt stm8-dce-example (moje kopie původního repozitáře). Druhá související diskuse (issue #4) se bohužel nezachovala.
Toto je důvod, proč v Makefile-sdcc-gas jsou tyto řádky:
1 2 3 4 | |
Případné problémy chybějících funkcí lze tedy vyřešit doplněním jména souboru
do proměnné SDCC_LIB_SOURCE.
Instalace¶
SDCC-gas si musíte buildnout ze zdrojových kódů. Potřebuje k tomu i stm8-binutils-gdb. Postup je popsán zde.
sdccrm¶
sdccrm je nástroj pro optimalizaci mrtvého kódu pro port stm8 SDCC, který
odstraňuje nepoužívané funkce.
https://github.com/sealj553/sdccrm
Původní repozitář zmizel
Repozitář XaviDCR92/sdccrm z GitHubu zmizel (404) a vývoj je nejspíš
mrtvý. Odkazuji proto na funkční kopii od jiného uživatele. Původní stav je
uchován i ve
Wayback Machine.
Jak to funguje? Kód se nejprve zkompiluje do assembleru klasickým
SDCC, poté se pomocí sdccrm vymaže kód, který se nepoužívá,
celý proces se dokončí a kód se převede z assembleru do strojového kódu.
Je to řešení tak nějak na půl cesty: Funguje, strojový kód je opravdu menší, ale tato možnost vylučuje použití debuggeru. To někdy, někomu vadit může, jindy jinému to vadit nemusí.
Dále je nutné ručně zadat funkce, které nechcete “optimalizovat” — tedy vyhodit.
Proto je třeba sledovat chybová hlášení a název chybějící funkce zadat do souboru exclude_reference uvnitř projektového adresáře.
Instalace¶
sdccrm si musíte buildnout ze zdrojových kódů. Windows binárka je součástí
toolchainu a je v souboru .make/sdccrm.exe. Postup je popsán
zde.