Vývojové nástroje jsou asi největší slabinou celého ekosystému STM8. Výrobce dodává vývojové prostředí STVD (návod zde), které je sice dostačující, ale staré a již nevyvíjené. Navíc se občas stane, že na nějakém PC je problém to rozjet. Kompilátor Cosmic sice funguje, ale ta neustálá kontrola licence, je fakt opruz; … a jeho chybová hlášení mi taky nepřišla úplně srozumitelná.
A to jsem ještě nezmínil to hlavní: Na Linuxu to nejede!

tools %%

Takže, co s tím? Použijeme OpenSource nástroje! Co je potřeba?

  1. Vývojové prostředí
  2. Kompilátor
  3. Programátor/Flasher — software, kterým program do čipu nahraju
  4. Debuger

Když jsem to celé tvořil hodně mi pomohla tato stránka, tak se tam můžete mrknout: https://github.com/hbendalibraham/stm8_started.

Předpřipravená instalace

Připravil jsem pro vás výukovou image systému Devuan Linux, kde je vše již nastaveno a nainstalováno. Nemusíte tedy vše ručně instalovat, stačí:

  1. nainstalovat VirtualBox
  2. do VirtualBoxu doinstalovat Extension Pack
  3. stáhnout si připravený image: Devuan-X-MIT.ova a importovat si ho.

Něco málo o obrazu:

Jak použít Virtualbox a předpřipravený image:
MIT-Virtualbox

… i tak si ale přečtěte následující text ať víte, jak to máte použít.

Toolchain

Připravil jsem startovací strom zdrojových kódů a Makefile.

https://gitlab.com/spseol/mit-no/STM8S-toolchain

Tento toolchain se dá použít v Linuxu, v MacOS i ve Windows. Nutno ale říct, že toolchain je vyvíjen a primárně určen pro Linux.

Instalace

Pozor na verzi SDCC

V překladači SDCC (nezávisle na OS) je ve verzi 4.5.0 chyba, díky které je nepoužitelný pro platformu STM8. Chyba je již opravená, ale je třeba si dát pozor a nainstalovat verzi 4.4.0 nebo noční build.

Linux

V Linuxu zavoláte něco jako:

1
sudo apt install sdcc sdcc-libraries git make openocd
installace SDCC ze zdrojových kodů

Někdy se snane, že ve vaší distribuci není SDCC v té správné vezi, nebo si chcete nainstalovat noční build. Já pro instalaci nedistribuční balíčků používám program Stow.

1
sudo apt install stow

Knihovny a závislosi nutné pro build se dají nainstalovat takto:

1
sudo apt build-dep sdcc

Potom už jen stáhnete zdrojaky, rozbalíte a instalujete:

1
2
3
4
5
6
7
cd sdcc-sources-4.5.12  # tady je jméno adresáře se zdrojáky 
./configure --prefix=/usr/local/stow/sdcc-4.5.12
make
sudo make install

cd /usr/local/stow
sudo stow sdcc-4.5.12

Ještě málá poznámka: SDCC podporuje mnoho různých platforem, které jsou pro mě nepotřebné. Proto moje ./configure vypadá takto:

1
2
3
4
5
6
7
8
./configure --prefix=/usr/local/stow/sdcc-4.5.12 \
--disable-z180-port --disable-r2k-port --disable-r2ka-port --disable-r3ka-port \
--disable-gbz80-port --disable-tlcs90-port --disable-ez80_z80-port --disable-z80n-port \
--disable-ds390-port --disable-ds400-port --disable-pic14-port --disable-pic16-port \
--disable-hc08-port --disable-s08-port --disable-pdk13-port --disable-pdk14-port \
--disable-pdk15-port --disable-mos6502-port --disable-sm83-port --disable-f8-port \
--disable-mos65c02-port --disable-r800-port --disable-f8l-port --disable-r4k-port \
--disable-r5k-port --disable-r6k-port --disable-ez80-port

MacOS

V MacOS by to měla být pohoda, protože je to také Unix. Stačí HomeBrew:

1
brew install open-ocd make git coreutils

U toho sdcc pozor na verzi 4.5.0!. V současné době je tedy třeba sdcc buildnou ze zdrojových kódů.

Takže místo…

1
brew install sdcc

… si stáhnete zdrojáky, rozbalíte, a ….

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
brew install stow
cd sdcc-sources-4.5.12  # tady je jméno adresáře se zdrojáky 
export CPPFLAGS="-I/opt/homebrew/include"
export LDFLAGS="-L/opt/homebrew/lib"

./configure --prefix=/usr/local/stow/sdcc-4.5.12 \
--disable-z180-port --disable-r2k-port --disable-r2ka-port --disable-r3ka-port \
--disable-gbz80-port --disable-tlcs90-port --disable-ez80_z80-port --disable-z80n-port \
--disable-ds390-port --disable-ds400-port --disable-pic14-port --disable-pic16-port \
--disable-hc08-port --disable-s08-port --disable-pdk13-port --disable-pdk14-port \
--disable-pdk15-port --disable-mos6502-port --disable-sm83-port --disable-f8-port \
--disable-mos65c02-port --disable-r800-port --disable-f8l-port --disable-r4k-port \
--disable-r5k-port --disable-r6k-port --disable-ez80-port

make && sudo make install

cd /usr/local/stow/sdcc-4.5.12/
stow sdcc-4.5.12

sdcc -v

Windows

Věnoval jsem hodně času portu na Windejs. Mrkvosoft mi ale hází dost klacky pod nohy: odladím to — chodí to, příjde aktualizace — a já můžu zase ladit další problém. Prostě to zlobí a já nemám absolutně žádnou motivaci to ladit, ptotože nevím, kdy mi zase Mrkvosoft práci zničí; a na W11 jsem to ani nezkoušel. Kompilace je děsně pomalá. Takže moje rada zní:

Hint

Pokud skutečně trváte na Windejs a máte nějaký dobrý důvod, proč tento nedovyvynutý OS používáte, nainstalujte si VirtualBox a použijte, předpřipravenou instalaci.

Niméně v současné době se zdá, že Toolchain na Windejs funguje, takže pokud máte odvahu, dejte se do toho:

Ve Windows je nejsnadnější instalovat pomocí Chocolatye:

1
2
3
choco install make git 
choco install openocd
choco install vscodium  mingw

Pokud ještě nemáte Python, můžete i Python:

choco install python

Bash je součásti balíčku Git. Ve Windows ještě stojí za to malinko si Bash připravit, aby fungoval dobře s make. Proto si si nakopírujte konfiguraci s .make/bashrc do domovského adresáře.

1
cp .make/bashrc ~/.bashrc

Instalace SDCC se musí naklikat. Instalátor stáhnete zde: https://sourceforge.net/projects/sdcc/files/sdcc-win64/

Pro flashování se na Windows používá STVP. Pokud už jste nainstalovali STVD máte už STVP nainstalováno, protože je součástí jeho instalace. Je možné ho naistalovat i zvlášť — bez STVD.

Projekty a knihovna SPL

Adresářová struktura jednotlivých projektů vypadá takto:

MIT
├── Projekt-1
│   ├── inc
│   ├── lib
│   └── src
├── Projekt-blikblik
│   ├── inc
│   ├── lib
│   └── src
├── SPL
│   ├── inc
│   └── src
└── SPLSPL
    ├── inc
    └── src

Udělejte si adresář, kde budou všechny vaše projekty — v uvedeném příkladu je to MIT. V tom stejném adresáři budou i adresáře nazvané SPL a SPLSPL. V SPL adresářích je Standard peripheral library od firmy ST. Tato knihovna má dost divnou licenci a proto vám ji nemůžu jen tak dát. Měli byste si ji najít a stáhnout. Pak je třeba ještě aplikovat patch, který knihovnu předělá tak, aby se dala použít s naším SDCC kompilátorem. Celé je to docela pracné, … ale zkuste napsat make spl třeba se to zařídí samo.

Tip

Vytvoření projektu je možné automatizovat s jednodchou sadou skriptů dostupnou v repositáři STM8S new project automation.

Další automatizace je dostupná v repositáři GitLab project interactive CLI, pomocí kterého si můžete velmi usnadnit založení nového projektu na GitLabu.

Použití

  • make spl — stáhne a nachystá knihovny
  • make — provede kompilaci
  • make flash — nahraje program do chipu
  • make clean — smaže všechno, co nakompiloval
  • make rebuild — smaže vše a znovu zkompiluje
  • make openocd — spustí openocd pro debug
  • make debug — spustí STM8-gdb

Konkurence :)

Ještě bych měl zmínit, že kolega Wykys vytvořil také toolchain, který je o dost jednodušší a tím pádem i přehlednější:

https://gitlab.com/wykys/stm8-tools

Vývojové prostředí

Já používám Vim respektive Neovim. Ne každému ofšem toto prostředí vyhovuje, takže jako editor a vývojové prostředí doporučuji VScodium/VScode.

Instalace je popsána zde.

Kompilace

K dispozici jsou celkem tři Makefile v adresáři .make. Je to proto, že kompilátor SDCC nedokáže odstranit mrtvý kód. Existují asi tři řešení. To první je nejoptimálnější, další dvě řešení jsem tu nechal pro strýčka příhodu. Když poprve zavoláte make přepne se toolchain do tohoto nejoptimálnějšího řešení zvaného sdcc.

K dispozici jsou tedy celkem tři Makefile v adresáři .make. Přepnutí jen realizováno jako symlink Makefile do root-adresáře projektu.

1
2
$ ls -l Makefile
lrwx 1 mar 23 14. led 21.14 Makefile -> .make/Makefile-sdcc-gas

Na divných systémech, které symlink neumí (například Windows) se natvrdo kopíruje, takže tato operace může být ztrátová. V Makefile je vše připraveno, takže stačí volat make.

1
2
3
    make switch-sdcc      # respektive
    make switch-sdccrm    # respektive
    make switch-sdcc-gas  # respektive

Pokud váháte který zvolit, zvolte hned první řešení: SDCC

Řešení 1: SDCC

SDCC - Small Device C Compiler je kompilátor pro různé, více či méně známé 8-bitové architektury. Z hlediska STM8 má jednu zásadní nevýhodu: nedokáže odstranit nepoužívaný kód. Co to znamená? No… pokud si všechno píšete sami, tak to prakticky neznamená nic. Pokud ovšem použijete nějakou knihovnu (jako například SPL), tak už vám to začne hodně vadit, protože výsledný strojový kód obsahuje spoustu funkcí, které jste kompilovali jen proto, že byli součástí knihovny a ne proto, že jste je chtěli použít. Tyto funkce nejsou nikde volány a proto by je měl linker odstranit. No a to je přesně to, co se nestane :-(. Ve výsledku program, který by mohl mít cca 2-3 kB má 30 kB.

Naštěstí existuje jeden hack, který funguje asi takto: Knihovna SPL se rozdělí do malých souborů (co funkce, to soubor) a každý se kompiluje jako samostatný modul. Z těchto modulů se udělá knihovna, se kterou SDCC linker už umí správně pracovat. Proto je v adresářové struktuře knihovna SPL dvakrát. SPLSPL znamená SPLit SPL a používá se právě na toto.

Další řešení tohoto problému je použít níže uvedené SDCC-gas nebo sdccrm.

Instalace SDCC v Linuxu je poměrně snadná, protože SDCC je součásti většiny Linuxových distribucí; takže zavoláte něco jako:

1
apt install sdcc sdcc-libraries

Ve Windows si stáhnete instalátor a pokračujte, ve Windows oblíbeným klikáním.

Řešení 2: SDCC-gas

https://github.com/XaviDCR92/sdcc-gas

Note

Toto řešení je v současné době spíše historický pozůstak a v 98,45% případů není třeba se jim zabývat. Klidně si tento odstavec přečtěte, ale asi toto řešení nebudete chtít použít…

Toto je asi nejlepší řešení optimalizace (vyhození) mrtvého kódu. 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 zde a zde

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.

Aby vše fungovalo musíte si stáhnout výše zmíněné zdrojové kódy a buildnout je. Já to dělám takto (používám stow):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo apt install stow
sudo apt build-dep sdcc

cd sdcc-gas
./configure --prefix=/usr/local/stow/sdcc-gas
make
sudo make install

cd /usr/local/stow
sudo stow sdcc-gas

Podobný postup použijete pro STM8 port GNU binutils, který je potřeba pro linkování a debug.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
tar xzf stm8-binutils-gdb-sources-2021-07-18.tar.gz
cd stm8-binutils-gdb-sources
export PREFIX=/usr/local/stow/stm8-binutils-gdb
./patch_binutils.sh
cd binutils-2.30
make
sudo make install

cd /usr/local/stow
sudo stow  stm8-binutils-gdb

Tato výše popsaná kompilace ze zdrojových kódů je teoreticky možná i na Windows, pomocí projektu Cygwin. Prakticky jsem to nikdy nezkoušel. Osobně bych šel (tedy pokud by mě někdo donutil používat Widejs) spíše cestou Windows Subsystem for Linux. Instalace WSL 2 je velice jednoduchá. Bohužel do WSL se nativně nedá připojit USB — ale dá se to řešit.

Řešení 3: sdccrm

Poznámka:

Toto řešení je v současné době spíše historický pozůstak a v 99,974653% případů není třeba se jim zabývat. S klidem tuto kapitolu přeskočte…

sdccrm je nástroj pro optimalizaci mrtvého kódu pro port stm8 SDCC, který odstraňuje nepoužívané funkce.

https://github.com/XaviDCR92/sdccrm

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í debugeru. 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ů. Jde o celkem malý program bez závislostí, takže jde jednoduše kompilovat v Linuxu i ve Windows — nicméně pro jistotu je Windows binárka součástí startovacího toolsetu a je v souboru .make/sdccrm.exe.

Ve Windows:

1
choco install mingw

nebo v Linuxu:

1
apt install gcc

a pak jen:

1
2
cd sdccrm
make

Flashing

STVP

STVP je software od výrobce čipů ST. Umožňuje přístup do všech částí paměti mikrokontrolérů. Má grafickou verzi i verzi pro příkazový řádek. Právě na verze pro příkazový řádek se spoléhá zde zmiňovaný toolchain.

OpenOCD

Open On-Chip Debugger je nástroj pro debug a krokování programu přímo na čipu. openocd umí i nahrát program do paměti zařízení. Funguje v Linuxu i ve Windows.

Instalaci zajistí na Linuxu jednoduchý příkaz:

1
sudo apt install openocd

na Windows je to díky Chocolatye podobně jednoduché.

1
choco install openodc

Toto se řeší v Makefile pomocí proměnné OPENOCD, takže si ji případně upravte.

Aby openodc umělo i pouhé flashování, je třeba přidat skript, který to umí. Ten je buď součástí startovacího toolsetu nebo ho můžete přidat na konec konfiguračního souboru stm8s.cfg:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
proc program_device {filename flashstart} {
  halt
  wait_halt
  load_image $filename $flashstart
  sleep 10
  reset halt
  resume
  sleep 10
  shutdown
};

V Linuxu by celá cesta mohla vypadat takto: /usr/share/openocd/scripts/target/stm8s.cfg. Pokud jste do Windows instalovali pomocí Chocolatye, bude to nejspíš tato cesta: C:\ProgramData\chocolatey\lib\openocd\tools\OpenOCD-20190828-0.10.0\share\openocd\scripts\target\stm8s.cfg.

stm8flash

Druhá možnost je program stm8flash. Ve většině linuxových distribucí je třeba ho ručně buildnout.

https://github.com/vdudouyt/stm8flash

Debuging — Ladění

GDB maskot >>

GDB (GNU Debugger) je standardní nástroj na hledání chyb v software. Pokud budeme chtít program krokovat a za běhu se dívat do proměnných budeme potřebovat právě upravený STM8-GDB z GNU binutils a OpenOCD (Open On Chip Debuger).

OpenOCD

openocd tedy Open On-Chip Debugger je nástroj, pomocí kterého komunikujeme s čipem a spouštíme/zastavujeme/krokujeme program. Pouští se to takto:

1
openocd -f interface/stlink-dap.cfg -f target/stm8s.cfg -c "init" -c "reset halt"

Nebojte nemusíte to vždy znovu vypisovat. Je to napsané v Makefile, takže stačí zavolat

1
make openocd

STM8-GDB

Zdrojáky si stáhnete na SourceForge. Instalaci jsem popsal výše. Pro přehlednost ještě jednou:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
tar xzf stm8-binutils-gdb-sources-2021-07-18.tar.gz
cd stm8-binutils-gdb-sources
export PREFIX=/usr/local/stow/stm8-binutils-gdb
./patch_binutils.sh
cd binutils-2.30
make
sudo make install

cd /usr/local/stow
sudo stow  stm8-binutils-gdb

Pokud je vše nainstalováno můžeme zavolat stm8-gdb:

Takže… v dalším terminálu otevřeme gdb a dáme se do ladění. Než provedete toto, ujistěte se, že openocd již běží.

1
stm8-gdb --tui build-STM8S208/out-STM8S208.elf

opět stačí zavolat make

1
make debug

Rychlokurz STM8-GDB

Takže máme dva terminály: v jednom běží OpenOCD a ve druhém běží GDB.

Nenechte se odradit

Ano, je to textové rozhraní, žádná klikátka ani pouťové efekty. Pouze textové příkazy. Nicméně v dalším kroku vám ukážu gdbgui, což je krásné klikátko. Ale i v tomto klikátku se vám textové příkazy můžou dobře hodit.

V programu funguje tabulátor. To znamená, že při stisku klávesy TAB se GDB pokusí uhodnout, co chcete napsat a doplní slova tak, aby byla smysluplná.

list main, list main.c:20, list main.c:setup
nalistuje ve zdrojovém kódu příslušné místo, řádek, funkci
b main, break main
nastaví breakpoint na vstup do funkce main
b 48, break 48
nastaví breakpoint na řádek 48
b milis.c:48, break milis.c:48
nastaví breakpoint na řádek 48 v souboru milis.c
info b, info breakpoints
vypíše informace o breakpointech
info sources
vypíše seznam zdrojových souborů
d 2. delete 2
vymaže breakpoint 2
r, run
spustí program
interrupt, Ctrl+C
přeruší program, program se zastaví tam, kde zrovna teď je
s, step
vykoná jeden příkaz/řádek zdrojového kódu
n, next
vykoná jeden příkaz/řádek zdrojového kódu, funkci vykoná jako jeden příkaz — nebude vstupovat do funkce
fin, finish
dokončí funkci, ve které se program právě nachází (pokud v ní není další breakpoint)
c, cont, continue
pokračuje v běhu programu, dokud nenarazí na breakpoint
p time, print time
vypíše obsah proměnné time
p time, print time
vypíše obsah proměnné time
display time
vypíše obsah proměnné time pokaždé, když se program zastaví
undisplay 2
už nebude vypisovat řádek 2, když se program zastaví

Zde něco málo více k příkazům print a display.

GDB %%

gdbgui

gdbgui je browser-based frontend pro gdb. Je to napsané v Pythonu a instaluje se přes pip.

1
pip install gdbgui

nebo lépe

1
pipx install gdbgui

opět je vše zapsáno v Makefile, takže pokud běží openocd stačí zavolat

1
make gdbgui

STM8 Debugger for vsCode/Codium

https://marketplace.visualstudio.com/items?itemName=CL.stm8-debug


Související posty