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
SDCC_LIB_SRC_DIR = /usr/local/stow/sdcc-gas/share/sdcc/lib/src/
SDCC_LIB_SOURCE = _mullong.c _divulong.c _mulint.c _modsint.c
#SDCC_LIB_SOURCE  = $(notdir $(wildcard /usr/local/stow/sdcc-gas/share/sdcc/lib/src/_*.c))
SDCC_LIB_OBJECTS := $(addprefix $(OUTPUT_DIR)/, $(SDCC_LIB_SOURCE:.c=.o))

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.


Související posty