Řízení překladu pomocí MAKEFILE

Adresářová struktura projektu  web51_manual.html  Pořadí linkování
Celý projekt Web51 je rozdělen na mnoho částí a ty jsou rozvrženy do mnoha souborů. Celkově je při překladu nutné používat nějaký projektový management, z mnoha zdrojových souborů a knihoven vytvoří podle zadaných podmínek přeložený jediný soubor .HEX pro CPU (případně soubory pro sériové eeprom a další).

MAKE - Makefile

Při překladu projektu používáme z Unixu přenesenou utilitu MAKEFILE, která je obsažena v balíku BINUTILS a funguje samozřejmě i pod Win32. Funkčně by ji bylo možné přirovnat k velmi chytrému .BAT souboru z MS DOSu. MAKEFILE řeší celkem složitý management všech zdrojových souborů pro kompilaci výsledného kódu.
Podrobný popis utility najdete v DOWNLOADU v sekci Dokumentace související s projektem.

Utilita MAKEFILE je obsažena v adrešáři /bin, měla by být v cestě a po svém spuštění vždy hledá v aktuálním adresáři soubor "make" (bez jakékoli přípony) který obsahuje dále podrobně popsaný předpis pro sestavení projektu.

Pokud pracujete pod Windows, dejte si pozor na program Windows Commander, který nevolá korektně příkazový řádek, takže doporučujeme makefile spouštět z spuštěné aplikace DOS shellu "Příkazový řádek".

Jako popis rozebereme projektový adresář příkladu LED2 a ukážeme si na něm, jak psát podobné, nebo i složitější aplikace.

MAKE - popis struktury

Dále popisovaný soubor je vždy postupně komentován. Skutečný výpis souboru make pro projekt LED2 proto doporučujeme otevřít si do druhého okna. Zde popíšeme příklad souboru Makefile k projektu LED2. (Obsah souboru Makefile je psán neproporcionálním písmem, pod kódem je vždy jeho vysvětlivka.)

PROJ = www8051
PROJFILE = Makefile

SCRIPT = ../../bin INCDIR = ../../include LIBDIR = ../../lib CGIDIR = ../../cgi BINDIR = ../../bin
CA = $(BINDIR)/mcs51-as LINKER = $(BINDIR)/mcs51-ld OBJCOPY = $(BINDIR)/mcs51-objcopy PERL = $(BINDIR)/perl BIN2HEX = $(BINDIR)/bin2hex RM = $(BINDIR)/rm
CAOPT =

Nastavení systémových proměnných s umístěním jednotlivých souborů a případných globálních parametrů překladu, které budou používány v průběhu překladu. Makefile si cesty nastavuje, ale práce je výrazně pohodlnější, pokud cestu k adresáři /BIN z projektu Web51 nastavíte do vaší systémové proměnné cesty (PATH) v autoexec.bat. Můžete pak jednodušeji spouštět i další programy z vývojového systému, především ale samotný program MAKE.

FILES = www8051.asm index.html LEDsetup.asm
OBJS  = www8051.obj index.obj LEDsetup.obj
CGI   = $(CGIDIR)/testP3.obj

Zde je uveden výčet .ASM souborů, s nimiž bude projekt pracovat a které bude překladač překládat do .OBJ souborů v řádce pod nimi. Pokud váš projekt rozšíříte o použití nového .CGI scriptu z naší nabídky, nebo si napíšete svůj, nezapomeňte jej přidat do makefile na toto místo. Všimněte si, že jsou zde zahrnuty i HTML soubory, s nimiž musí makefile také pracovat. Pokud si používáte vlastní .CGI scripty, nechte je klidně v projektovém adresáři, ale nezapomeňte přidat názvy jejich souborů do proměnné OBJS a FILES.

Za těmito základními deklaracemi následuje řada příkazů pro zpracování v rámci Makefile ve tvaru:

Co_chci_získat: Na_čem_to_závisí
Jak_to_získat

Při volání MAKE je možno zadat cíl, aneb co_chci_získat, nicméně MAKE automaticky při neuvedení cíle vytváří cíl daný první definicí, takže když jako první definici uvedeme soubor ve formátu :

hex: www8051.hex

Pak při zpracování, bude mít MAKE snahu implicitně vytvořit soubor www8051.hex Co všechno MAKE přeloží, závisí na tom jaké je datování souborů ze kterých je výsledný soubor tvořen. MAKE vždy znovu přeloží zdrojové soubory, na kterých závisí výsledný soubor, pokud jsou tyto soubory novější než soubor, který má vytvořit. Lze vytvářet také soubory BIN apod. ale vzhledem k lepší možnosti kontroly neporušenosti souboru a bezproblémovému přenosu je preferován HEX

Soubor MAKE může obsahovat i několik výsledných cílů, jedním z může být i příkaz mazající pracovní soubory např.

.PHONY: clean
clean:
        $(BASH) -c "rm -f *.obj"
        $(BASH) -c "rm -f *.lst"
        $(BASH) -c "rm -f ether.inc"
        $(BASH) -c "rm -f ip.inc"
        $(BASH) -c "rm -f index.asm"
        $(BASH) -c "rm -f www8051.o"
        $(BASH) -c "rm -f www8051.rom"
        $(BASH) -c "rm -f www8051.eep"
        $(BASH) -c "rm -f www8051.hex"
        $(BASH) -c "rm -f map"

Pokud v příkazové řádce použijete syntaxi „make clean“ vykoná se tato část kódu ze souboru makefile. V tomto případě se smažou všechny vygenerované soubory. Tím vyčistíte adresář a zpřehledníte soubory projektu například před distribucí projektového adresáře dalším uživatelům.

.SUFFIXES: .obj .c .asm .inc .h .ina .html

www8051.obj : www8051.asm $(INCDIR)/8019.inc $(INCDIR)/param.inc ip ether $(BASH) -c "rm -f ether.inc" $(BASH) -c "rm -f ip.inc" $(PERL) $(SCRIPT)/mac2hex.pl -v -equ -binutils - <ether >ether.inc $(PERL) $(SCRIPT)/ip2hex.pl -v -equ -binutils - <ip >ip.inc $(CA) www8051.asm -o www8051.obj $(CAOPT) -a=www8051.lst

Tato část makefile zabezpečuje vlastní překlad souboru www8051.asm. Soubor www8051.obj získaný překladem však závisí na celé řade dalších souborů, při jejichž změně je nutno spustit překlad znovu. Tyto soubory jsou uvedeny na řádku za znakem „:“

Pokud MAKE zjistí novější datum některého ze zdrojových souborů, spustí tuto část scriptu, která postupně vytvoří www8051.obj, tj. jeden ze souborů ze kterých je složen výsledný “www8051.hex“. V tomto případě je do kódu je třeba vložit nezbytné definice konstant a parametrů, což zajišťují právě vkládané definice “param.inc“ a “8019.inc“ (vložené do www8051.asm). Dalšími vloženými definicemi jsou soubory ether.inc a ip.inc. Tyto dva soubory jsou pro zlepšení čitelnosti generovány z textového konfiguračního souboru pomocí skriptů v jazyku Perl.

V tomto místě se ze souborů „ether“ a „ip“ které mají syntaxi (ether):

00:00:E8:EE:10:34

Vytvoří pomocí utility PERL dále vypsaný soubor „ether.inc“ a soubor „ip.inc“ které již lze implementovat do .ASM zdrojového kódu.. Podrobnosti o ip2hex.pl a mac2hex.pl utilitě najdete v sekci SOFTWARE / IP -> HEX & MAC-> HEX v podrobné WWW dokumentaci.

.global MAC_MSB, MAC_NSB, MAC_LSB
.equ    MAC_MSB, 0x0000            ; MAC address 
.equ    MAC_NSB, 0xE8EE
.equ    MAC_LSB, 0x1034

Zároveň si všimněte souboru „param.inc“ kterým se vkládá do zdrojového kódu základní nastavení pro krystalový oscilátor (používá pouze UART pro linku RS232). Zároveň jsou zde definována slova jako SDA, SCL což jsou piny pro připojení I2C linky atd.. V tomto souboru však nenajdete definici „.global reset“ která definuje počáteční stav portů po resetu. To je občas nutné znát pro nastavení periférií. Tuto část kódu, stejně jako část průběžně běžící přerušení od časovače najdete v souboru „web51.asm“ v adresáři LIB.

Všimněte si generování .LST souborů. Otevřete si v přeloženém projektu například „index.lst“ a „www8052.lst“ ať víte, že zde najdete adresy kódu, pokud potřebujete lokalizovat chybu na konkrétní adrese..

LEDsetup.obj : LEDsetup.asm $(INCDIR)/param.inc
        $(CA) LEDsetup.asm -o LEDsetup.obj $(CAOPT) -a=LEDsetup.lst

index.obj : index.html $(BASH) -c "rm -f index.asm" $(PERL) $(SCRIPT)/html2db.pl -binutils -cpueeprom -index 0 index.html $(CA) index.asm -o index.obj $(CAOPT) -a=index.lst

HTML soubory je třeba nějak včlenit do výsledného .HEX souboru. Toto včlenění je zde zprostředkované přes assembler. Z .HTML souboru je vytvořen .ASM soubor, kde bude HTML převedeno do podoby tabulky v paměti programu nebo EEPROM. To lze opět udělat pomocí skriptu v PERLu (stejně jako v případě generování ether.inc a ip.inc)

Parametr „cpueeprom“ zde definuje kam bude výsledný kód přeložen. Nezapomeňte jej proto změnit, pokud budete potřebovat změnit organizaci dat v paměti. Podrobnosti o html2db.pl utilitě najdete v sekci SOFTWARE / HTML -> DB v podrobné WWW dokumentaci.

www8051.o : $(OBJS) $(CGI) $(LIBDIR)/libw80.a $(LIBDIR)/libk80.a $(LIBDIR)/web51.obj
        $(BASH) -c "rm -f www8051.o"
        $(LINKER) --script $(LIBDIR)/www51.sc -L $(LIBDIR) $(LIBDIR)/web51.obj $(OBJS)\ 
        $(CGI) -lk80 -lw80 -M -o www8051.o --no-check-sections >map

Na této řádce makefile jsou již připraveny .OBJ soubory a spouští se linkování celého projektu. Soubor „www8051.o“ je závislý nejen na .OBJ souborech projektu ale i na vstupních knihovnách libw80.a libk80.a (popř. libw23.a a libk23.a) což je zde řečeno v prvním řádku. Podle pořadí kompilace jsou nyní připraveny všechny vstupní soubory, CGI scripty z knihovny atd. (viz. Pořadí linkování) Zde je třeba doplnit chybějící funkce z knihoven a vše slinkovat. Linker je řízen souborem www51.sc z adresáře LIB. Ten obsahuje něco jako definici pořadí linkování jednotlivých segmentů a jejich klíčových jmen. Parametr –L pak definuje kde se mají hledat knihovny. Linkování je nutné začít souborem web51.obj z adresáře LIB, protože obsahuje definice vektorů přerušení a proto musí začínat od nuly. Za tímto souborem se nalinkují následující .OBJ soubory v pořadí jak jsou definovány proměnou OBJS. Totéž je zopakováno s .OBJ soubory uvedenými v proměnné CGI. Obě proměnné jsou definovány na začátku Makefile (nezapomínejte proto doplnit do tohoto seznamu překládaných souborů například CGI script, který chcete použít z nabídky..). Zde se nenechte zmást zpětným lomítkem, jedná se oznak pro pokračování řádku (respektive pro ignorování zbytku řádku, čímž příkaz plynule pokračuje na dalším řádku) . Po přilinkování souborů z OBJS a CGI se přesně podle definice linkování doplní chybějící funkce z knihoven libk80 a libw80. Plný název knihovny „libw80.a“ je na příkazovém řádku zkrácen na „-lw80“ a označuje totéž, rozdíly v knihovnách viz. Pořadí linkování. Zpracování linkování probíhá zleva doprava a není rekurzivní, proto doporučujeme zachovat první lk80 a teprve za ní uvádět lw80.

Parametr –M pak již pouze generuje soubor MAP který obsahuje informace o výsledném překladu. Doporučujeme vám otevřít MAP soubor a podívat se jak vypadá jeho struktura a co vše v něm lze nalézt.

Výsledek celého překladu se ukládá do souboru “www8051.o“ (Neplést se souborem “www8051.obj“ obsahujícím přeložený soubor “www8051.asm“).

www8051.rom : www8051.o
	$(RM) -f www8051.rom
	$(OBJCOPY) -j .text -O binary www8051.o www8051.rom
	$(RM) -f www8051.eep
	$(OBJCOPY) -j .eeprom -O binary www8051.o www8051.eep

Soubor www8051.o je obdobou souborů .obj, vypreparujeme z něj proto pomocí utility mcs51-objcopy z BINUTILS část obsahující programový kód a část obsahují obsah paměti EEPROM. Obě části nazvané www8051.rom a www8051.eep jsou binární. Nicméně programátor obvykle touží po souboru jednom s obsahem paměti EEPROM adresovaným v případě procesoru 8252 od 2000h aneb 8192. Takže mu jej pomocí utility BIN2HEX převedeme do formátu HEX a spojíme obě části dohromady. Obdobně lze generovat i část obsahující data v I2C paměti.

www8051.hex : www8051.rom
	$(RM) -f www8051.hex
	$(BIN2HEX) -q -t www8051.rom www8051.hex
	$(BIN2HEX) -q -o 8192 -a www8051.eep www8051.hex

Protože pro vývoj používáte s největší pravděpodobností ISP nebo nějaký jiný programátor, je pracné načítat zvlášť zdrojové soubory pro FLASH paměť kódu a soubor pro EEPROM. Proto je v této části automaticky vygenerován soubor www8051.hex. V některých examplech je možné, že používáme pouze generování .ROM a .EEP souborů. Pokud potřebujete generovat .HEX soubor, hned na začátku nastavte www8051.hex jako cílový soubor a doplňte nakonec tento odstavec. Nezapomeňte na přidání souborů .EEP a .ROM do seznamu souborů pro spuštění části CLEAN z makefile.

Tím jsme probrali celý proces generování výsledného kódu pro procesor. Pokud nemáte adresář BIN nastaven v systémové proměnné PATH lze spustit zpracování makefile zadáním “..\..\make“ z adresáře projektu (pokud samozřejmě zachováváte doporučenou adresářovou strukturu).
Pokud pracujete pod Windows, doporučujeme spouštět MAKE s nastavenou PATH a z spuštěného DOS shellu „Příkazový řádek“ v adresáři projektu. Některé souborové manažery, například oblíbený Volkov Commander má totiž přesměrovány standardní obrazovkové výstupy tak, že pokud se MAKE spustil pod ním, například do souboru “ip.inc“ se zapsal nejen žádoucí kód, ale také kód který měl PERL vypsat na obrazovku, což samozřejmě způsobilo chybu kompilace.





Sponzored by LPhard Ltd. Graphics by GIMP Created by EasyPad

(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz

Final applications of the Web51 : www.HWgroup.cz
Adresářová struktura projektu  Obsah  Pořadí linkování