Paměťový model projektu Web51 |
Nejprve tedy něco o organizaci programové paměti. Zobrazme si příslušné segmenty programové paměti na obrázku, spolu s jejich typickými uloženími ve zdrojových souborech.
Segment vectors obchází to, že GNU assembler/linker neumí absolutní segmenty, ale pouze relativní. Tento segment počítá s umístěním od adresy 0. V celém projektu může být tento segment pouze na jedinném místě a musí obsahovat všechny vektory přerušení.
Segment reset_begin se spouští po resetu procesoru, nuluje interní paměť procesoru a nastavuje základní časování I/O operací a timer0 generující 1 ms přerušení.
Segment reset_device je rozsekán v jednotlivých knihovních modulech. Zabezpečuje základní inicializaci modulů.
Segment reset_network je obdobou segmentu reset_device a umožňuje určit, alespoň ve třech stupních pořadí, v jakém se budou jednotlivé inicializace modulů vykonávat.
Segment reset_end ukončuje sekci reset a spouští přerušovací systém procesoru.
Segment one_times umožňuje provést kód, který se vykonává jen jednou, a vyžaduje plně inicializovaný systém.
Segment fast_begin je první částí hlavní programové smyčky. Zabezpečuje základní obsluhu handshake na sériovém kanálu a spouští zpracování přijatého ethernetovského paketu. Není-li co zpracovávat a od posledního průchodu smyčkou uběhla alespoň 1 ms, je řízení předáno do následujícího segmentu, jinak zůstává zpracování v tomto segmentu.
Segment fast obsahuje vlastní uživatelský kód, spouštěný s periodou cca 1 ms. Do tohoto segmentu je zařazeno např. ovládání LED,... Použití tohoto segmentu najdeme např. v příkladech v souborech www8051.asm. Pro první seznámení doporučuje příklad LED3.
Segment fast_end obsahuje čítač, zda uplynulo 50 volání (resp. slowtiming) volání. Je-li tato podmínka splněna, je spouštěno zpracování slow sekcí. V opačném případě zpracování pokračuje skokem na začátek sekce fast_begin.
Segment slow_begin provádí reset bitů stateSyn, zamezujících web51 odpovědět na pokus o navázání o TCP spojení častěji jak jednou za 50 ms. Poté je zpracování předáno do segmentu slow.
Segment slow obsahuje vlastní uživatelský kód, spouštěný s periodou cca 50 ms. Do tohoto segmentu je zařazeno např. obsluhu tlačítek,... Tento segment najdeme v příkladech v souboru www8051.asm
Segment slow_end ukončuje hlavní "slow" programovou smyčku a předává řízení skokem zpět na začátek sekce fast_begin.
Segment cpu_rom obsahuje především knihovní moduly, které je nutno mít pod hranicí 8 kByte, vzhledem k adresaci p-code funkcí, které používají pouze 13-ti bitovou adresaci.
Segment .text je standartním kódovým segmentem. Obsahuje vlastní uživatelské podprogramy,...
Segment cpu_dir_begin patří k segmentům souborového systému. Obsahuje hlavičku souborového systému. Souborový systém v ROM je povolován při překladu knihoven definováním podmínky ROMfilesystem. Hlavička a patička adresáře souborového systému je nadefinována pomocí knihovního modulu filecpu.asm a uživatel se o ni nemusí starat.
Segment cpu_dir obsahuje adresář souborového systému. Obvykle je generován pro každý soubor zařazovaný do adresáře skriptem html2db.pl.
Segment cpu_dir_end obsahuje patičku souborového systému. Je součástí knihovního modulu filecpu.asm
Segment cpu_files obsahuje data souborového systému, pro překlad konvertovaná z jednotlivých vstupních formátů (html, jpeg, ...) skriptem html2db.pl
Segment cpu_top je standartním kódovým segmentem. Obsahuje vlastní uživatelské podprogramy,...
Datovou pamět, používanou systémem Web51, lze rozdělit, v závislosti na použitém procesoru (89S8252 či 89C51RD2), do celkem 5 až 6 částí. Korektní použití proměnných v jednotlivých segmentech je plně na zodpovědnosti programátora. Assembler je schopen pouye korektně přidělit místo jednotlivým proměnným a popřípadě ohlídat přeplnění jednotlivých segmentů. Není však v jeho silách ohlídat použití proměnné definované v jiném segmentu než je povolen příslušným řídicím registrem.
Z hlediska linkeru zaslouží zmínku snad jen část obsahující obsah datové EEPROM. Jeho struktura připomíná programovou paměť.
[4] Linker sám neumí přidělit nevyužité části v adresním rozsahu 0x00...0x1F (resp. spíše 0x08...0x1F), pokud nejsou definovány pomocí segmentu .rdata či příkazem .rcomm. Proto je vhodné v případě potřeby sem některé proměnné přesunout, tak jaj je vidět v některých ukázkových příkladech v modulu www8051.asm.
POPIS Web51 | NOVINKY | FAQ | OBJEDNÁVKA | DOWNLOAD |
(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz Final applications of the Web51 : www.HWgroup.cz |