FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ
1 Úvod Cílem přednášek o mikrokontrolerech v rámci tohoto kursu je seznámit posluchače s vývojem mikroprocesorové techniky, nejpoužívanějších architekturách, jednotlivými bloky mikrokontrolerů, sběrnicemi a používáním pamětí. Nástup osobních počítačů třídy PC s sebou přinesl masové rozšíření výpočetní techniky. Díky koncepci této techniky, vybavené prostředky pro komunikaci s člověkem a jejímu výkonnému programovému vybavení na úrovni operačního systému, většina jejích uživatelů neví (a při svých aplikacích ani vědět nemusí), jak systém uvnitř, tj. na úrovni obvodového řešení pracuje. Do konce 80. let bylo možno většinu mikroprocesorových systémů rozložit na jednotlivé subsystémy i fyzicky na úrovni příslušných obvodů či obvodových skupin. Otázka vnitřní komunikace a spolupráce těchto obvodů a obvodových skupin byla proto zcela přirozená a každý, kdo chtěl navrhnou aplikaci mikroprocesorového systém, se touto otázkou musel „z principu věci“ zabývat. Za dnešního stavu výše uvedený závěr neplatí absolutně, lze navrhnout (zvláště u jednoduchých aplikací jednočipových kompletních mikrokontrolerů) například řídicí systém pouze na základě znalostí „vnějších“ vlastností příslušného mikrokontroleru (k těmto vnějším vlastnostem v tomto okamžiku řadíme i instrukční soubor příslušného mikrokontroleru, zejména ve vztahu k možnosti programového řízení komunikace mikrokontroleru s okolím). Integrace stále širší škály výkonnějších obvodů pro komunikaci s uživatelskými i systémovými vnějšími zařízeními na čipu mikroprocesoru či mikrokontroleru pak ve svých důsledcích vede k témuž jevu jako u osobních počítačů třídy PC. Na základě našich dlouholetých zkušeností s aplikacemi mikroprocesorové techniky se však domníváme, že znalost vzájemných vztahů mezi jednotlivými částmi mikroprocesorového systému na úrovni principiálních schémat vycházejících ať už z klasické von Neumannovy koncepce či z koncepce harvardské je pro návrháře systému nikoliv jen užitečná, dokonce i nutná. Zejména pochopení souvislostí při přenosu jednotky paralelně přenášené binární informace mezi jednotkami systému umožní návrháři aplikace dokonale využít systémové vlastnosti použitého mikroprocesoru či mikrokontroleru. Při řešení složitějších systémů (víceprocesorové systémy, obecněji systémy se sdílenými subsystémy) a při návrhu samotného mikroprocesoru či mikrokontroleru jako obvodu je pak výše uvedená znalost jejich vnitřního chování a vnitřních vztahů naprosto jednoznačně nezbytná. Budeme-li v dalším textu hovořit o jednotlivých subsystémech, blocích, funkčních blocích či jinak nazvaných částech mikroprocesoru, mikrokontroleru či mikroprocesorového systému, budeme mít vždy na mysli dělení většího celku na menší z hlediska funkčního. Pohled realizační, tedy dělení celku podle hlediska, co na konkrétním čipu (integrovaném obvodu, desce, přístroji) zabudováno je a co je nutno řešit dalšími přídavnými obvody, bude pro nás sekundární. Z funkčního hlediska je mikroprocesor určitým technologickým stupněm realizace procesoru jakožto výkonné jednotky číslicového počítače. Pod pojmem výkonná jednotka nehledejme vztah k jakkoliv poměřované výkonnosti systému, pojem výkonná jednotka zde
2
FEKT Vysokého učení technického v Brně
znamená schopnost této jednotky provádět určité elementární funkce (posloupnosti funkcí) jako výsledek interpretace instrukcí programu. Procesor pak také řídí součinnost ostatních funkčních bloků systému (některé z nich mohou mít svoje jednoduché vnitřní procesory – pak jsou to obecně programovatelné funkční bloky, například programovatelné obvody pro vstup a výstup dat, A/Č a Č/A převodníky, řadiče velkokapacitních vnějších pamětí atd.).
Řadič
Vstupní jednotky
řízení data
Operační paměť
Výstupní jednotky
Artitmeticko-logická jednotka
Obr. 1: Blokové uspořádání číslicového počítače.
Obecně lze konstatovat, že každý systém, obsahující procesor, je systémem řízeným programem. Programem pak rozumíme posloupnost instrukcí, které je procesor schopen na základě svého obvodového řešení provádět (interpretovat). Jednotlivé instrukce, obsažené v instrukčním souboru daného typu procesoru, představují kódy pro řízení hardware tohoto procesoru. Pracujeme-li s funkčně vyšším celkem, například s jednočipovým mikrokontrolerem, jsou instrukce instrukčního souboru tohoto mikrokontroleru podobně prostředkem pro řízení hardware celého mikrokontroleru (tedy včetně ostatních subsystémů řízených procesorem). Tuto myšlenku lze zobecnit i na případ použití některých vyšších programovacích jazyků ve komplexních systémech – jednotlivé elementární příkazy vyššího jazyka jsou interpretovány virtuálním procesorem, který je schopen tyto příkazy na úrovni celého systému realizovat (pochopitelně opět na bázi souboru elementárních instrukcí řídících přímo hardware systému). Ve všech výše uvedených případech jde o systém na bázi číslicového počítače, viz. Obr.1.
MIKROPROCESORY-ZÁKLADY-2007-S
3
2 Architektura číslicového počítače Cílem kapitoly je seznámit posluchače s nejvíce používanými architekturami mikropočítačů a jejich vzájemnými rozdíly. V moderním pojetí se architektura počítače většinou chápe jako celkový pohled na vlastnosti ve čtyřech úrovních popisu systému počítače: 1. Struktura – popisuje vlastnosti a propojení jednotlivých funkčních bloků. 2. Organizace – popisuje dynamické vztahy mezi funkčními bloky a řízení komunikace mezi nimi. 3. Realizace – popisuje vlastní řešení a vnitřní strukturu jednotlivých funkčních bloků. 4. Funkce- popisuje chování počítače jako celku. Architektura se neomezuje jen na pasivní popis zjištěných vlastností již existujících počítačů, musí poskytovat též podklady pro hodnocení kvality jako celku. Za obecné hodnocení kvality se dnes považuje poměr výkonnosti a ceny (počet operací za sekundu vztažený na měnovou jednotku ceny). Moderní přístupy (tzv. kvantitativní) jednotlivé varianty architektury číselně hodnotí a na základě toho vybírají nejlepší řešení. Tato metoda má přirozené omezení spočívající v tom, že hledá pouze lokální optima. Vyhodnocované varianty totiž vycházejí z několika mlčky přijatých předpokladů (např. počítač má aritmetickologickou jednotku, která je řízena instrukčním kódem, zpracovávaná informace je uložena v operační paměti atd.). Tyto předpoklady znějí zcela přirozeně a nikdo o nich nemá důvod pochybovat, avšak pro jejich přijetí hovoří pouze fakt, že se takto stavějí počítače již více než 50 roků a že fungují, příroda nám však žádnou předlohu tohoto řešení nenabídla.
2.1 Von Neumannova a harvardská koncepce Číslicové počítače, které jsou schopné samostatné činnosti podle předem připraveného programu, existují již od 40. let 20. století. Jejich výkonnostní parametry se za tuto dobu velmi změnily, především v důsledku technologického pokroku. Základní principy činnosti číslicových počítačů však zůstaly zachovány, taktéž architektura, vycházející z myšlenek formulovaných von Neumannem, se používá dodnes. Žádné z jiných koncepčních řešení, s výjimkou koncepce harvardské (která jak uvidíme dále je pouze jistou modifikací koncepce von Neumannovy), nedoznalo masovějšího rozšíření. Životaschopnost von Neumannovy koncepce potvrdilo v posledním desetiletí i masové rozšíření osobních počítačů. Autorem koncepce je americký matematik maďarského původu John von Neumann, vznik koncepce je datován do období konce druhé světové války, místem byla Universita státu Pensylvánie ve Filadelfii. Tam také vznikl první elektronkový počítač ENIAC (Electronic Numerical Integrator And Calculator), který byl představen v roce 1946. Byl velmi rozměrný a jeho hlavním nedostatkem bylo programování pomocí drátěných propojek v poli zdířek (zde ještě nebyla naplněna jedna z hlavních myšlenek von Neumanna, a to uložení instrukcí programu i dat ve vnitřní – operační paměti počítače). Druhým počítačem, který vznikl na téže universitě, byl EDVAC (Electronic Discrete Variable Automatic Computer), který již byl řízen programem uloženým ve vnitřní paměti.
4
FEKT Vysokého učení technického v Brně
Nejdůležitější myšlenky, charakterizující von Neumannovu architekturu, lze shrnout do těchto sedmi bodů: 1) Číslicový počítač se skládá z následujících funkčních jednotek:): a. paměť (vnitřní, operační paměť), b. řadič, c. aritmetická a logická jednotka (aritmetickologická jednotka), d. vstupní a výstupní jednotky. 2) Struktura číslicového počítače není závislá na typu řešené úlohy, je univerzální, číslicový počítač se programuje obsahem operační paměti. 3) Instrukce programu i operandy, s nimiž program pracuje, jsou uloženy v téže paměti (operační paměti), jde-li o instrukci či o operand rozpoznává počítač „z kontextu“. 4) Operační paměť je tvořena buňkami o stejné velikosti, jejich pořadová čísla jsou adresami buněk operační paměti (pole buněk charakterizovaných adresami). 5) Program je tvořen posloupností elementárních příkazů (instrukcí), v nichž zpravidla není obsažena hodnota operandu (uvádí se pouze odkaz na operand ve formě adresy), program se při změně dat nemění. Instrukce se provádějí postupně v tom pořadí, v němž jsou zapsány v operační paměti (s výjimkou instrukcí větvení programu – skoky, volání podprogramu, návraty z podprogramů). 6) Změna pořadí provádění instrukcí se vyvolá instrukcí větvení programu. 7) Pro fyzikální reprezentaci instrukcí a dat (operandů, výsledků, adres atd.) se používají binární signály a pro jejich vyjádření dvojková číselná soustava. Za nejdůležitější myšlenky von Neumannovy architektury lze považovat body 1 a 2, protože definují základní strukturu systému a způsob jeho řízení. Tyto body zůstaly dodnes v platnosti zcela bezvýhradně, hrubé blokové schéma číslicového počítače uvedené na obrázku 1, platí dodnes pro většinu počítačů vyráběných kdekoliv na světě. Největším přínosem popsané koncepce je bod 2, tedy myšlenka uložení programu ve vnitřní paměti počítače. Tato myšlenka otevřela cestu k naprosté univerzálnosti číslicového počítače a tím i k jeho dnešnímu masovému využití. Návrháři číslicových počítačů si poměrně brzy uvědomili nebezpečí, vyplývající z bodu 3, neboť uložení instrukcí programu a dat do téže paměti může vést ke zničení programu v důsledku programátorské chyby (zbloudění programu). Proto se objevily snahy oddělit paměť programů od paměti dat. Toto je možné v podstatě dvěma způsoby. První způsob představuje „mechanické“ řešení, program je uložen do nepřepisovatelné paměti typu některé z modifikací ROM (Read Only Memory), datová část paměti zůstává typu RWM (Read Write Memory), tyto dvě části se však nacházejí v systémově jednotném adresovém prostoru a o jejich umístění na konkrétních adresách rozhoduje návrhář systému. Druhý způsob znamená použití dvou systémově oddělených adresových prostorů, jeden pro paměť programu, druhý pro paměť dat. Pokud jde o číselné hodnoty adres, oba prostory se obvykle alespoň částečně překrývají a přístup do jednoho z nich je závislý na konkrétní fázi provádění instrukce (do paměti programu se přistupuje ve fázi čtení operačního kódu instrukce, do paměti dat pak při provádění instrukce jejímž úkolem je manipulace s daty). Při přístupu do každého z paměťových prostorů jsou aktivovány jiné synchronizační signály a tím je jednoznačně definován paměťový prostor, v němž leží adresa buňky paměti, k níž se systém v dané paměťovém cyklu obrací. Tato myšlenka vznikla ve 40. letech 20. století na Harvardově universitě v Cambridgi (Massachusetts) a byla poprvé aplikována v počítačích MARK III a MARK IV. Takováto architektura se proto tradičně označuje jako harvardská.
MIKROPROCESORY-ZÁKLADY-2007-S
5
Grafické znázornění rozdílů mezi harvardskou a von Neumanovou strukturou je uvedeno na Obr. 2.
Obr. 2: a) von Neumanova koncepce, b) harvardská koncepce. V posledních dvaceti letech se setkáváme se snahou návrhářů překonat či alespoň eliminovat omezení vyplývající z bodů 5 a 6, tedy neprovádět instrukce striktně sekvenčně v předem stanoveném pořadí, ale snažit se o paralelní zpracování různých fází více instrukcí v různých částech systému (systémy se zřetězeným zpracováním instrukcí). Také se nabízí dynamická alokace právě zpracovávané části programu v rychlejší mezipaměti tak, aby procesor mohl pracovat s maximální možnou rychlostí a nebyl omezován pracovním cyklem operační paměti (mezipaměti typu cache jsou plněny dalšími instrukcemi prováděného programu v těch cyklech činnosti procesoru, kdy vnitřní sběrnice nejsou při výkonu právě prováděné instrukce využity). Další snahou návrhářů je dosáhnout určitého paralelismu při zpracování instrukcí programu (paralelní systémy pracující paralelně nad určitými datovými strukturami). Generace Období Prvky
1 1943-1958 elektronky
2 1956-1965 tranzistory
3 1964-1971 integrované obvody SSI
Operační paměť
zpožďovací linky, magnetický buben
feritová jádra
feritová jádra, tenké magnetické vrstvy
Kapacita OP 1 kB paměťová Přídavné obrazovka, paměti magnetický buben Rychlost 104 oper./s
1 MB 10MB magnetická páska, magnetický disky HD, FD, CD disk
105oper./s psací stroj, děrná páska
106oper./s děrná páska, terminál
děrnoštítkové, děrnopáskové
Řízení V/V
základní jednotkou, základní jednotkou, V/V kanály synchronní asynchronní vyšší jazyky (ALGOL, FORTRAN)
operační systémy, multiprogramování, strukturované programování
5 1990-???? IO ULSI, ik polovodičová, optické vrstvy
10 kB magnetická páska
Periferie
Programové strojový kód (assembler) vybavení
4 1970-1990 integrované obvody MSI LSI VLSI polovodičová
1 GB magnetické paměti, optické paměti
108oper./s 1010oper./s terminálové sítě, grafické multimediální periferie, periferie inteligentní periferie V/V procesory
hierarchická počítačová síť
problémově orientované jazyky, OS RT, multitask/multiuser
přirozené jazyky, logické programování, speciální uživ. jazyky
Tab. 1: Přehled typických parametrů jednotlivých generací číslicových počítačů. Reprezentace čísel a instrukcí dvouhodnotovými signály je omezení pouze částečné a je vyváženo snadným rozlišením dvou pracovních stavů zejména u polovodičových součástek s větším možným rozptylem pracovních parametrů. Přesto dnes většina číslicových počítačů provádí operace s desítkovými čísly, protože desítková čísla lze pro zpracování v počítači
6
FEKT Vysokého učení technického v Brně
vyjádřit pomocí vhodných dvojkových kódů, a tím odpadají vzájemné převody mezi dvojkovou a desítkovou číselnou soustavou. Hodnocení stupně vývoje číslicových počítačů z hlediska systémového a technologického řešení, používaného programového vybavení, výkonnosti a dalších dosahovaných parametrů vede k pojmu generace počítačů, přehled je uveden v Tab. 1.
2.2 Shrnutí Nejpoužívanější architektury mikropočítačů současnosti jsou von Neumanova a harvardská, příp. jejich modifikace. Jejich rozdíl je v rozdělení paměti pro uložení dat a programu, kterou má von Neumanova architektura společnou. S postupem vývoj mikropočítačů musel zavést pojem generace číslicových počítačů, který blíže specifikuje dosaženou úroveň mikropočítače.
2.3 Otázky 1. Jaký je rozdíl mezi architekturou von Neumanovou a harvardskou? 2. jakým způsobem byl programován první elektronkový počítač ENIAC? 3. Vysvětlete pojem generace počítačů?
3 Činnost číslicového počítače Cílem kapitoly je seznámit posluchače s principy fungování mikropočítačů, se způsoby komunikace po sběrnici a s časováním činností mikropočítače. Budou probrány řídící signály mikropočítačů, systémy přerušení a použití zásobníkové paměti mikropočítače při vyvolání přerušení. Vyjdeme-li z von Neumannovy koncepce číslicového počítače, můžeme jeho činnost charakterizovat jako postupné provádění instrukcí uložených v operační paměti. V souvislosti s tím je nutno vysvětlit otázku komunikace mezi jednotlivými bloky číslicového počítače. Tato komunikace probíhá dnes téměř výhradně pomocí systému sběrnic.
3.1 Sběrnice Komunikace mezi subsystémy číslicového počítače a mikroprocesorového systému zvláště probíhá dnes téměř výhradně pomocí systému sběrnic. Sběrnicí se rozumí soustava vodičů určených k paralelnímu přenosu určitého druhu informace. Z tohoto pohledu komunikuje počítač prostřednictvím sběrnice datové, výběr spolupracující jednotky (jíž může být v podstatě buďto buňka operační paměti či vyrovnávací registr V/V zařízení) je úkolem
MIKROPROCESORY-ZÁKLADY-2007-S
7
sběrnice adresové. V systému číslicového počítače hovoříme také o sběrnici řídicí (sběrnice řídicích signálů), zde už nejde o paralelní přenos signálů, ale o soustavu vodičů využívaných individuálně k přenosu řídících signálů aktivovaných individuálně v souvislosti s právě prováděnou činností mikroprocesoru. Shrneme-li výše uvedené informace, lze na úrovni systému (tj. bez ohledu na jejich elektrickou realizaci) sběrnice charakterizovat takto: 1) Sběrnice datová – soustava obousměrných datových vodičů (a to i z hlediska procesoru, procesor může tuto sběrnici budit i z ní informaci snímat), zajišťující přenos veškeré informace mezi procesorem a ostatními částmi systému. Počet vodičů datové sběrnice (šířka sběrnice) je dán většinou počtem procesorem paralelně zpracovávaných bitů (nebo procesor pracuje se slovem, jehož šířka je celistvým násobkem počtu bitů přenášených datovou sběrnicí. Například osmibitová (osmivodičová) datová sběrnice se objevuje u osmibitových, ale i u šestnáctibitových procesorů. Procesor má většinou technické prostředky k tomu, aby se elektricky odpojil od datové sběrnice a přenechal tak řízení přenosu po této sběrnici jiné jednotce v systému (například při realizaci kanálu přímého přístupu do paměti, kdy přenos dat mezi operační pamětí a V/V zařízením řídí k tomu určený řadič přímého přístupu do paměti) 2) Sběrnice adresová – soustava obousměrných vodičů (z hlediska procesoru jde o sběrnici výstupní, procesor může tuto sběrnici až na výjimky pouze budit), zajišťující výběr spolupracujících jednotek procesorem. Počet vodičů adresové sběrnice odpovídá většinou počtu bitů, nutných k adresaci v celém adresovém prostoru operační paměti. Procesor má většinou technické prostředky k tomu, aby se elektricky odpojil od adresové sběrnice a přenechal tak buzení této sběrnice jiné jednotce v systému (například při realizaci kanálu přímého přístupu do paměti, kdy přenos dat mezi operační pamětí a V/V zařízením řídí k tomu určený řadič přímého přístupu do paměti a tento také paměť adresuje) 3) „Sběrnice“ řídících signálů – není kompaktní sběrnicí v tom smyslu, jako je tomu u sběrnice datové a adresové. Jednotlivé řídící signály jsou vzhledem k procesoru signály vstupními i výstupními, záleží na konkrétním signálu a jeho funkci v systému. Řídící signály lze rozdělit do dvou skupin, a to na signály aktivované v souvislosti s prováděním jednotlivých instrukcí programu procesorem (tj. signály synchronní s činností procesoru při provádění programu) a na signály, které jsou vůči činnosti procesoru při provádění programu asynchronní a slouží především k vnějším zásahům do této činnosti. Uvedené skupiny řídících signálů dále popíšeme v další části textu z pohledu jejich funkčního významu, konkrétní procesory mohou mít pochopitelně tyto signály jinak nazvány, ale funkční význam musí být zachován.
3.2 Časování činnosti procesoru, strojový cyklus Ještě než přistoupíme k popisu činnosti procesoru při vykonávání programu, musíme se seznámit se základními pojmy z oblasti časování procesoru (od něhož je odvozeno časování celého systému číslicového počítače). Z hlediska klasifikace obvodů lze procesor i celý systém číslicového počítače pokládat za složitý sekvenční obvod (systém) řízený programem. K jeho časování slouží generátor hodin, generující periodický hodinový signál, tento generátor dnes téměř výhradně bývá přímo součástí procesoru. Pro řízení vnitřních přenosů mezi jednotlivými částmi procesoru (přenosy zde probíhají po vnitřní sběrnici, která má obvykle stejný počet bitů jako sběrnice datová, případně je počet jejích bitů násobkem počtu bitů datové sběrnice) jsou vnitřním generátorem generovány obvykle vícefázové hodiny (aby byl v průběhu jedné periody hodin k dispozici dostatečný počet časově definovaných hran, sloužících ke správné časové synchronizaci vnitřních přenosů).
8
FEKT Vysokého učení technického v Brně
Základní časovou jednotkou činnosti procesoru je tedy perioda hodin, někdy bývá tento interval označován jako takt. Během jednoho taktu může dojít k přenosu části informace uvnitř procesoru. Z hlediska přenosu informace mezi procesorem a okolím je základní časovou jednotkou strojový cyklus (cyklus vnější sběrnice). Strojový cyklus se skládá z několika taktů (většinou 3 a více, záleží na tom, co se má během daného strojového cyklu odehrát) a lze ho definovat jako časový interval, během něhož dojde k přenosu jednotky informace mezi procesorem a jeho okolím (jednotkou informace tedy v tomto případě je paralelní slovo s počtem bitů rovným počtu vodičů datové sběrnice). V případě osmibitového procesoru (obecněji procesoru s osmibitovou datovou sběrnicí) je tedy touto základní paralelně přenášenou jednotkou osmibitové slovo (1 byte).
3.3 Provádění instrukcí programu Provedení každé z instrukcí programu spočívá v opakování dvou kroků: 1. Čtení instrukce z operační paměti (nutno si uvědomit, že každá instrukce se obecně skládá z operačního kódu a odkazů na operandy a k zakódování této informace nemusí obecně stačit počet bitů jediné buňky operační paměti). 2. Provedení instrukce (samotné provedení instrukce může ale nemusí znamenat komunikaci procesoru s okolím, tedy při provedení instrukce procesor může ale nemusí vykonat další strojové cykly). Při provádění instrukce vykoná procesor jeden nebo více strojových cyklů. Minimální počet strojových cyklů nutných k vykonání instrukce je dán počtem slov, z nichž se instrukce skládá (ne vždy je šířka slova, tedy počet paralelně zpracovávaných bitů, dostatečný k zakódování informace o tom, jakou operaci a se kterými operandy instrukce provádí), neboť procesor musí z operační paměti nejdříve přečíst celou instrukci (její operační kód plus odkazy na operandy) a toto čtení provede v tolika strojových cyklech, kolik slov má čtená instrukce. Existence případných dalších strojových cyklů pak záleží na tom, vyžaduje-li provedení instrukce komunikaci po sběrnici. Výše uvedené závěry lze zobecnit takto: 1. Počet strojových cyklů nutných k provedení instrukce musí být roven nejméně počtu slov, z nichž se celá instrukce skládá. 2. Provádění každé instrukce začíná strojovým cyklem FETCH – čtení kódu instrukce z operační paměti. Další činnost procesoru pak spočívá v interpretaci tohoto kódu (tedy „dělá“ se to, co kód instrukce předepisuje). 3. Procesor musí předtím, než zahájí vykonávání programu, znát jeho počáteční adresu (znát adresu, na níž je uloženo první slovo = kód první instrukce programu). 4. Jakmile procesor načte kód první instrukce programu, je schopen provádět program jako posloupnost instrukcí na základě postupného čtení jednotlivých slov uložených v operační paměti a z kontextu zpracování procesor „ví“, co právě načtené slovo reprezentuje (může to být kód instrukce, odkaz či část odkazu na operand, přímo operand či část operandu, s nímž daná instrukce pracuje případně další údaje použité jako parametry při zpracovávání instrukce). Pro adresování jednotlivých buněk operační paměti při postupném vykonávání instrukcí programu obsahuje procesor speciální registr, nazývaný programový čítač (PC – Program Counter), jehož obsah se po načtení každého slova instrukce z operační paměti automaticky zvyšuje o jedničku a tak ukazuje na následující buňku.
MIKROPROCESORY-ZÁKLADY-2007-S
9
3.4 Řídící signály Řídící signály lze rozdělit do dvou skupin, a to na signály aktivované v souvislosti s prováděním jednotlivých instrukcí programu procesorem (tj. signály synchronní s činností procesoru při provádění programu) a na signály, které jsou vůči činnosti procesoru při provádění programu asynchronní a slouží především k vnějším zásahům do této činnosti. Řídící signály synchronní (generované v souvislosti s prováděním programu) Základní představitele těchto signálů lze logicky odvodit z informací, které již o provádění programu procesorem máme. Stačí si pouze uvědomit, že v podstatě jedinou informační cestou mezi procesorem a jeho okolím je datová sběrnice, na niž může procesor v souvislosti s vykonáváním instrukcí programu informaci vysílat (platnost stavu datové sběrnice musí procesor potvrdit vzorkovacím signálem) nebo z ní může informaci číst (vzorkovat stav datové sběrnice do některého ze svých vnitřních registrů). Druhou skutečností, kterou si musíme uvědomit je, že procesor může vyměňovat informaci pouze s operační pamětí nebo s V/V zařízením. Obsah adresové sběrnice je určován procesorem a slouží k výběru zdroje či příjemce informace (může jím být pouze paměťová buňka operační paměti nebo registr V/V zařízení).
Obr. 3: Průběhy signálů procesoru pro vstupní a výstupní cyklus datové sběrnice. Z výše uvedeného vyplývá, že v daném strojovém cyklu může být v souvislosti s prováděním programu aktivní vždy pouze jeden z těchto typových signálů: IOR/ (Input Output Read – čtení informace ze vstupního zařízení). MEMR/ (Memory Read – čtení informace z operační paměti). IOW/ (Input Output Write – zápis informace do výstupního zařízení).
10
FEKT Vysokého učení technického v Brně
MEMW/ (Memory Write – zápis informace do operační paměti). Lomítko za označením signálu znamená, že aktivní úroveň signálu je úroveň logické nuly (míněno v kladné logice). Typické průběhy signálů procesoru pro vstupní a výstupní cyklus datové sběrnice jsou uvedeny na Obr. 3. Snaha nezvětšovat počet vývodů procesoru pak často vede k řešení, při němž pracuje datová sběrnice procesoru v časovém multiplexu s částí sběrnice adresové. Na začátku každého strojového cyklu vysílá procesor na datovou sběrnici část adresy, jejíž platnost potvrzuje vzorkovacím signálem ALE – Address Latch Enable, sloužícím k záznamu této adresy do externího vyrovnávacího registru. Zbytek strojového cyklu je pak datová sběrnice ve svém „normálním“ režimu, který bylo popsán výše. Typické průběhy signálů pro tento způsob využití datové sběrnice jsou uvedeny na Obr. 4.
Obr. 4: Časový multiplex datové sběrnice a části adresy. Řídící signály asynchronní (generované bez souvislosti s prováděním programu) Uvedený typ signálů jsou signály asynchronně ovlivňující činnost procesoru (znamenají většinou zásah minimálně do časování při provádění programu, častěji pak zásah do samotného provádění programu) a odezvy procesoru na tyto signály. RESET – vstup procesoru Základním signálem, definujícím jakýsi „počáteční stav“ procesoru, je signál RESET. Po skončení aktivní úrovně tohoto signálu procesor čte informaci z buňky operační paměti, jejíž adresa je dána implicitně hardwarem procesoru a zachází s touto informací jako s kódem instrukce! Návrhář systému musí zajistit, aby počáteční instrukce programu, který se má spustit po aktivaci signálu RESET (většinou jde o inicializační část operačního systému spouštěného po zapnutí napájecího napětí nebo v důsledku stisknutí resetovacího tlačítka) byla na této adrese
MIKROPROCESORY-ZÁKLADY-2007-S
11
skutečně uložena. Tímto okamžikem je řízení činnosti procesoru plně v režii programu. Kromě toho aktivace signálu RESET zakazuje přerušení (viz. dále). READY – vstup procesoru, WAIT – výstup procesoru Jde o signál, jehož aktivace prodlouží právě probíhající strojový cyklus procesoru o příslušný násob period hodin (tyto tzv. WAIT stavy se do strojového cyklu vkládají, pokud je signál READY aktivní, prodloužení strojového cyklu o tuto dobu signalizuje procesor aktivací svého výstupního signálu WAIT). Důležité je uvědomit si, že po dobu trvání aktivní úrovně signálu WAIT se také prodlužuje aktivní stav signálů adresové sběrnice, příslušného řídícího signálu a v případě výstupního strojového cyklu stav datové sběrnice (v případě vstupního strojového cyklu se prodlužuje interval vzorkování stavu datové sběrnice procesorem). Tento způsob vnější synchronizace procesoru tedy nezasahuje do průběhu programu jako takového, pouze zasahuje do časového průběhu jeho jednotlivých instrukcí a slouží k synchronizaci spolupráce procesoru s jednotkami, jejichž rychlost odezvy nestíhá cyklus činnosti procesoru (obecně může být doba, o niž je prodloužen strojový cyklus, v podstatě jakákoliv, ale tato metoda synchronizace ztrácí smysl při době prodloužení delší než několik period hodin). Typické časové průběhy vstupního strojového cyklu při zařazeném stavu WAIT je uveden na Obr. 4. HOLD – vstup procesoru, HLDA – výstup procesoru Signál HOLD slouží k synchronizaci řízení přenosu po sběrnicích systému v případech, kdy procesor přenechává řízení sběrnic jiné jednotce v systému (například řadiči přímého přístupu do operační paměti). Výsledkem aktivace signálu HOLD je, že se procesor odpojí od sběrnic systému (uvede své výstupy, budící sběrnice, do stavu vysoké impedance) a dává tuto skutečnost najevo aktivací svého výstupu HLDA (aby oprávněná jednotky věděla, že může řízení provozu po sběrnicích převzít). Důležité je uvědomit si, že odpojením od sběrnic ztrácí procesor možnost provádět program, protože není schopen číst instrukce z operační paměti. Z logiky věci pak vyplývá, že při aktivaci vstupu HOLD dokončí procesor právě probíhající strojový cyklus (dříve uvolnit sběrnice nemůže, protože by došlo ke ztrátě informace) a z hlediska provádění instrukce, jejíž součástí byl poslední dokončený strojový cyklus může procesor provádět pouze operace, které nevyžadují přenos informace po sběrnicích (tedy pouze operace uvnitř subsystému procesoru samotného). Po skončení aktivní úrovně signálu HOLD pokračuje procesor následujícím strojovým cyklem v návaznosti na strojový cyklus, který bezprostředně před uvolněním sběrnic dokončil. INT – vstup procesoru, INTA/ – výstup procesoru Vstup procesoru INT je vstupem externí žádosti o přerušení. Rozumí se tím přerušení běhu právě běžícího programu (v tomto případě ho nazýváme hlavním programem) v důsledku vnější události, jejíž obsluha má prioritu vyšší, než je priorita právě řešené úlohy.
3.5 Přerušovací systém Protože procesor může provádět obsluhu vnější události vždy pouze prostřednictvím programu, vyvolá aktivace signálu žádosti o přerušení pozastavení průběhu právě běžícího programu a spuštění tzv. obslužného podprogramu přerušení.
12
FEKT Vysokého učení technického v Brně
Protože reakce procesoru na aktivaci signálu žádosti o přerušení spočívá ve vyvolání obslužného podprogramu (procesor reaguje programem), musí procesor předtím, než k tomuto vyvolání dojde, dokončit právě prováděnou instrukci! Poté by za normální situace bez přerušení pokračoval výběrem kódu následující instrukce z operační paměti, přitom adresu buňky, na níž je kód následující instrukce uložen, má procesor v tomto okamžiku k dispozici v programovém čítači (PC – Program Counter, speciální registr pro adresaci buněk operační paměti během postupného provádění instrukcí programu). Tato adresa je v případě přerušení tzv. návratovou adresou do hlavního programu, na níž je uložen kód instrukce hlavního programu, k jejímuž vykonání se procesor vrátí po provedení obslužného podprogramu přerušení. Návratovou adresu ukládá procesor do speciální paměti (zásobníková paměť – Stack), která je pamětí s postupným výběrem (LIFO – Last In First Out) odkud je zpět do programového čítače vrácena instrukcí návratu z obslužného podprogramu přerušení. Další otázkou je, jak se procesor při přerušení dozví počáteční adresu obslužného podprogramu přerušení případně jak se vypořádá s otázkou priority a vyvolání příslušného obslužného podprogramu tehdy, existuje-li pouze jeden vstup žádosti o přerušení a systém má více možných zdrojů přerušení. Řešení jsou u jednotlivých procesorů různá, v podstatě jsou dvojího typu. Jednodušší řešení spočívá v tom, že v případě přerušení je obslužný podprogram volán z určité adresy dané hardwarem procesoru (návrhář systému musí zajistit, aby kód první instrukce obslužného podprogramu přerušení byl uložen na této adrese a za ní dále pak celý obslužný podprogram). Situace se zdá být podobná jako v případě aktivace signálu RESET, ale rozdíl je v tom, že na rozdíl od RESETu za chodu programu je při přerušení uchovávána návratová adresa (celý mechanismus reakce procesoru na přerušení probíhá jako při provedení instrukce volání podprogramu, pouze počáteční adresa podprogramu je pevná, daná obvodovým řešením procesoru. V případě více zdrojů žádostí o přerušení se signály jejich žádostí na vstupu INT procesoru logicky sčítají a obslužný podprogram musí ve své počáteční fázi identifikovat konkrétní zdroj i jeho prioritu programovými prostředky (například čtením slova ze vstupní brány a jeho bitovou analýzou). Složitější řešení využívá základní princip činnosti procesoru, spočívající v tom, že po dokončení instrukce nastává při neexistenci aktivní žádosti o přerušení strojový cyklus čtení kódu následující instrukce hlavního programu z operační paměti (procesor v rámci tohoto strojového cyklu generuje signál MEMR/). K tomu však při aktivním vstupu žádosti o přerušení nemůže dojít, proto procesor potlačí snahu o čtení z operační paměti a místo signálu MEMR/ generuje signál INTA/ (Interrupt Acknowlegde). Signál INTA/ je zpracován logikou přerušovacího systému (externí logika, která není součástí procesoru) a jeho existence vede k tomu, že tato externí logika uvolní na datovou sběrnici systému informaci (vektor přerušení, identifikující zařízení, které žádost o přerušení vyvolalo včetně případné informace o prioritě). Tuto informaci procesor poté, co obsah datové sběrnice přečte, použije při vytváření počáteční adresy obslužného podprogramu přerušení. Další části počátečních adres příslušných obslužných podprogramů přerušení jsou pak zadávány pomocí k tomuto účelu implicitně určených registrů procesoru či buněk operační paměti. Jednou z možností také může být, že prostřednictvím signálu INTA/ obdrží procesor po datové sběrnici instrukci volání podprogramu včetně počáteční adresy (může se tak stát i v několika strojových cyklech z nichž každý je synchronizovaný signálem INTA/), jejímž provedením procesor přejde k provádění obslužného podprogramu přerušení. Většina procesorů má víceúrovňový přerušovací systém s několika vstupy žádostí o přerušení, které jsou řazeny prioritně a příslušné úrovně přerušení mohou být programově
MIKROPROCESORY-ZÁKLADY-2007-S
13
maskovány (nastavením příslušného bitu masky přerušení k tomu určenou instrukcí lze vzniku přerušení v případě aktivování tohoto vstupu zabránit). Kromě běžných vstupů, které jsou úrovňové (reagují na logickou úroveň na vstupu v okamžiku, kdy procesor zjišťuje jeho stav, což se děje v poslední periodě hodin posledního strojového cyklu každé instrukce), jsou i vstupy žádostí o přerušení, reagující na hranu vstupního signálu (v cestě mezi vstupem a testováním žádosti o přerušení je zařazen klopný obvod). Použití těchto vstupů má svá specifická pravidla a musí respektovat mimo jiné i elektromechanické vlastnosti zdroje signálu žádosti o přerušení (například zakmitávání mechanických kontaktů má časovou konstantu o několik řádů větší, než je doba vykonání obslužného podprogramu a proto je nutno eliminovat možnost několikanásobného vyvolání přerušení při sepnutí kontaktu). Počáteční adresy obslužných podprogramů přerušení příslušející jednotlivým vstupům mohou být buďto pevné, nebo dané vnější logikou jako vektor přerušení. Zvláštní postavení má obvykle vstup s nejvyšší prioritou (tzv. nemaskovatelné přerušení), který slouží k vyvolání obsluhy přerušení v případě výpadku napájecího napětí systému. Po přijetí žádosti o přerušení hardware procesoru přijetí dalších žádostí o přerušení automaticky zakáže (z toho plyne, že při vyvolání obslužného podprogramu přerušení je přerušení s výjimkou nemaskovatelného přerušení zakázáno). Chceme-li tedy povolit, aby byl obslužný podprogram přerušení s nižší prioritou přerušen žádostí o přerušení s vyšší prioritou, musíme přerušení programově povolit (instrukcí EI – Enable Interrupt). Opačnou instrukcí zákazu přerušení (DI – Dissable Interrupt) můžeme přerušení programově zakázat (například v částech programu, které musí proběhnout v určitém čase, protože zajišťují sekvenční řízení vnějších částí systému v reálném čase).
3.6 Zásobníková paměť Zásobníková paměť (Stack – zásobník, sklípek) byla do struktury procesorů zavedena v souvislosti s využíváním programovací techniky vnořování podprogramů (volání dalšího podprogramu v podprogramu již probíhajícím). Byla určena primárně k uchovávání návratových adres z podprogramů. Tomu odpovídala i koncepce přístupu k informacím, uloženým v zásobníkové paměti. Jde o paměť se sekvenčním přístupem k informaci systémem LIFO (Last In First Out), tedy návratová adresa z naposledy volaného podprogramu byla v této paměti přístupná jako první atd. Z tohoto určení vyplývá také organizace zásobníkové paměti. Počet bitů jedné položky zásobníkové paměti musí odpovídat počtu adresových bitů daného typu procesoru, počet položek velikosti možné úrovně vzájemného vnořování podprogramů. Sekvenční zápis do paměti a výběr z ní podporuje ukazatel vrcholu zásobníku (SP – Stack Pointer), což je registr procesoru, jehož počet bitů umožňuje obsáhnout celou kapacitu zásobníkové paměti a který vždy ukazuje na poslední obsazenou či první volnou položku zásobníkové paměti. Samotné ukládání návratové adresy z programového čítače do zásobníkové paměti je součásti interpretace instrukce volání podprogramu, výběr návratové adresy ze zásobníku do programového čítače zajišťuje instrukce návratu z podprogramu. Jiným způsobem nebylo zpočátku možno s takto pojatou zásobníkovou pamětí manipulovat. Způsob využití zásobníkové paměti k uchovávání návratových adres je uveden na obr. číslo 5. V současné architektuře procesorů a počítačových systémů je zásobníková paměť pojata obecněji. U nejmenších mikroprocesorů a mikrokontrolerů bývá realizována stále jako skupina speciálních registrů procesoru přímo jako jeho součást (tyto registry mohou však být
14
FEKT Vysokého učení technického v Brně
přístupné i jinými instrukcemi, v jejichž interpretaci pracují jako obecné registry), ale u velké většiny procesorů najdeme zásobníkovou paměť realizovatelnou kdekoliv v adresovém prostoru operační paměti. To podstatně zvětšuje kapacitu zásobníkové paměti a ta je pak systémově určena nejenom k uchovávání návratových adres, ale i k uchovávání datových struktur (princip sekvenčního přístupu LIFO zůstává zachován). Ukazatel vrcholu zásobníku pak musí mít takový počet bitů, kolik bitů je nutných k adresování v celém prostoru operační paměti. Položka zásobníku bývá zpravidla tvořena více buňkami operační paměti (například osmibitové procesory se šestnáctibitovou adresou a osmibitovou buňkou operační paměti) mají položku zásobníku tvořenou dvěma sousedními buňkami operační paměti a šestnáctibitový ukazatel vrcholu zásobníku (ten musí být programově nastavitelný, aby bylo možno definovat počáteční polohu – dno zásobníku s ohledem na konkrétní. obsazení adresového prostoru operační paměti paměťovými obvody). Protože buňky operační paměti i jsou přístupné při provádění celé řady dalších instrukcí procesoru, je nutno předpokládaný prostor zásobníku bedlivě střežit před zásahem jinými než zásobníkovými operacemi. Také nesystémová operace ovlivňující obsah ukazatele vrcholu zásobníku vede zpravidla ke zhroucení programu.
}
}
}
} Obr. 5: Činnost zásobníkové paměti.
MIKROPROCESORY-ZÁKLADY-2007-S
15
3.7 Shrnutí Komunikace mezi subsystémy číslicového počítače a mikroprocesorového systému zvláště probíhá dnes téměř výhradně pomocí systému sběrnic. Sběrnicí se rozumí soustava vodičů určených k paralelnímu přenosu určitého druhu informace. Rozeznáváme sběrnici adresovou, řídících signálů a datovou. Z hlediska klasifikace obvodů lze procesor i celý systém číslicového počítače pokládat za složitý sekvenční obvod (systém) řízený programem. K jeho časování slouží generátor hodin, generující periodický hodinový signál, tento generátor dnes téměř výhradně bývá přímo součástí procesoru. Protože procesor může provádět obsluhu vnější události vždy pouze prostřednictvím programu, vyvolá aktivace signálu žádosti o přerušení pozastavení průběhu právě běžícího programu a spuštění tzv. obslužného podprogramu přerušení. Každý procesor má definovanou sadu přerušení, u kterých lze nastavovat jejich priority. V okamžiku přerušení mikrokontroler začne provádět tzv. obsluhu přerušení a do zásobníkové paměti se uloží návratová adresa. Po skončení přerušení program vrátí na tuto adresu a pokračuje ve svém běhu.
3.8 Příklady - řešené Příklady typů instrukcí u osmibitového procesoru (instrukce s různým počtem bytů a počtem strojových cyklů nutných k jejich provedení): Procesor pracuje se slovem o šířce 8 bitů (1 Byte), paralelně zpracovávaná informační jednotka je osmibitová, adresový prostor operační paměti má velikost 216 = 65536 buněk operační paměti (osmibitová datová, šestnáctibitová adresová sběrnice). Instrukce tohoto procesoru jsou jedno- až tříbytové a ke svému zpracování potřebují 3 až 5 strojových cyklů. Příklady provádění některých instrukcí po strojových cyklech jsou uvedeny dále. Tímto způsobem lze popsat všechny instrukce procesoru. 1. Jednobytová jednocyklová. MOV B,C Přesun obsahu vnitřního registru C do vnitřního registru B. Proběhne v podstatě pouze cyklus čtení kódu instrukce z operační paměti, dále už se instrukce provede bez využití sběrnic. 2. Jednobytová dvoucyklová MOV B,M Přesun obsahu paměťové buňky adresované dvojicí registrů H,L do vnitřního registru procesoru B. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – provedení přesunu z buňky operační paměti do procesoru. 3. Jednobytová třícyklová INR M Inkrementace obsahu paměťové buňky, adresované dvojicí registrů H,L. První strojový cyklus – čtení kódu instrukce.
16
FEKT Vysokého učení technického v Brně Druhý strojový cyklus – provedení přesunu z buňky operační paměti do procesoru, inkrementace. Třetí strojový cyklus – uložení inkrementovaného údaje zpět do operační paměti.
4. Dvoubytová dvoucyklová ADI 2. byte Sečte obsah akumulátoru s obsahem druhého bytu instrukce a výsledek uloží v akumulátoru. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – provedení přesunu z buňky operační paměti (2. byte) do procesoru, sečtení s A a uložení do A. 5. Dvoubytová třícyklová OUT adresa V/V Obsah akumulátoru vyslán na datovou sběrnici, na adresovou sběrnici vyslána adresa výstupního zařízení, synchronizováno signálem IOW/. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – provedení přesunu z buňky operační paměti (2. byte) do pomocného adresovacího registru procesoru. Třetí strojový cyklus – vyslání obsahu akumulátoru na datovou sběrnici a adresovacího registru na adresovou sběrnici, aktivace IOW/. 6. Tříbytová třícyklová LXI SP nižší byte vyšší byte Obsah ukazatele vrcholu zásobníkové paměti (šestnáctibitový registr SP) je naplněn šestnáctibitovým údajem, tvořeným druhým a třetím bytem instrukce. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – čtení druhého bytu instrukce a uložení do nižších osmi bitů registru SP. Třetí strojový cyklus – čtení třetího bytu instrukce a uložení do vyšších osmi bitů registru SP. 7. Tříbytová čtyřcyklová LDA nižší část adresy vyšší část adresy Přesun obsahu buňky operační paměti s adresou udanou ve druhém a třetím bytu instrukce do akumulátoru. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – čtení druhého bytu instrukce a uložení do nižších osmi bitů adresovacího registru. Třetí strojový cyklus – čtení třetího bytu instrukce a uložení do vyšších osmi bitů adresovacího registru. Čtvrtý strojový cyklus – vyslání obsahu adresovacího registru na adresovou sběrnici, aktivace IOR/, z datové sběrnice vzorkován stav do akumulátoru.
MIKROPROCESORY-ZÁKLADY-2007-S
17
8. Tříbytová pěticyklová CALL nižší část adresy vyšší část adresy Volání podprogramu uloženého v operační paměti s počáteční adresou udanou ve druhém a třetím bytu instrukce. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – čtení druhého bytu instrukce a uložení do nižších osmi bitů adresovacího registru. Třetí strojový cyklus – čtení třetího bytu instrukce a uložení do vyšších osmi bitů adresovacího registru. Čtvrtý strojový cyklus – vyslání obsahu registru SP na adresovou sběrnici, uložení nižšího bytu návratové adresy přes datovou sběrnici na buňku operační paměti adresovanou obsahem SP, dekrementace SP. Pátý strojový cyklus – vyslání obsahu registru SP na adresovou sběrnici, uložení vyššího bytu návratové adresy přes datovou sběrnici na buňku operační paměti adresovanou obsahem SP, dekrementace SP. Přesunutí obsahu adresovacího registru (počáteční adresa podprogramu) do programového čítače.
3.9 Otázky 4. Co je a z čeho se skládá strojový cyklus? 5. K čemu slouží přerušovací systém mikroprocesoru? 6. K jakému účelu je určena zásobníková paměť 7. jakým způsobem probíhá provedení každé instrukce v mikropočítači?
3.10 Příklady – neřešené 9. Definujte co se odehrává během strojových cyklů tříbytové třícyklové instrukce: LXI SP nižší byte vyšší byte Význam: Obsah ukazatele vrcholu zásobníkové paměti (šestnáctibitový registr SP) je naplněn šestnáctibitovým údajem, tvořeným druhým a třetím bytem instrukce. 10. Popište, co se odehrává během strojových cyklů tříbytové pěticyklové instrukce CALL nižší část adresy vyšší část adresy Význam: Volání podprogramu uloženého v operační paměti s počáteční adresou udanou ve druhém a třetím bytu instrukce.
18
FEKT Vysokého učení technického v Brně
4 Specifika mikroprocesorů Cílem kapitoly je v první řadě seznámit s vývojem mikropočítačů v závislosti na vnitřních strukturách a jejich rozdělení s vývojem osobních PC. Dále budete seznámeni se základními principy programování v jazyce symbolických adres, v začátku pouze s obecnými záležitostmi, které má většina mikrokontrolerů společné. Na závěr se dozvíte o možnostech vzájemné komunikace mikrokontrolerů. Mikroprocesory se objevují v oblasti číslicových počítačů od počátku sedmdesátých let. Prvním mikroprocesorem byl čtyřbitový mikroprocesor Intel 4004, vyvinutý firmou Intel v roce 1971 z kalkulátorového čipu. Měl rozsah paměti programu 4 kByty a paměti dat 1kByt. Za první klasický osmibitový mikroprocesor lze pokládat typ Intel 8080, který se objevil v roce 1974. Dodržoval von Neumannovu architekturu a měl adresovatelný rozsah operační paměti 65536 kbytů. Využíval již nepřímé registrové adresace pomocí dvojic registrů. V roce 1978 se objevuje šestnáctibitový mikroprocesor Intel 8086 a pak následují jeho další úspěšné vývojové klony, vrcholící dvaatřicetibitovým mikroprocesorem Intel 80386 v roce 1985. V roce 1989 následuje Intel 80486 s integrovanou aritmetickou jednotkou pro realizaci aritmetiky v pohyblivé řádové čárce, první Intel Pentium se objevuje v roce 1993 jako procesor nesoucí rysy kombinace architektury CISC (architektura s komplexním instrukčním souborem, obsahujícím i složité instrukce) a RISC (architektura s redukovaným instrukčním souborem, obsahujícím poměrně jednoduché instrukce, jejichž řetězením se zajišťují i složitější funkce), šířka datové sběrnice 64 bitů, adresové sběrnice 32 bitů. Souběžně s těmito výkonnými mikroprocesory s aplikační oblastí především v osobních počítačích se objevují výkonné osmi a šestnáctibitové mikrokontrolery určené pro řízení přístrojů a procesů a obsahující na čipu nejen potřebné V/V datové kanály, ale i subsystémy pro styk s analogovým prostředím. Dnešní stav mikroprocesorové techniky nelze popsat obecně a nelze provést srovnání s klasickými procesory, které zejména díky paralelním přístupům ke zpracování informace dosahují parametrů ještě před nedávnem nemyslitelných. Přesto je možné na úrovni dodnes používaných a vyvíjených zejména osmibitových ale i šestnáctibitových mikroprocesorů a mikrokontrolerů popsat základní odlišnosti této třídy výpočetní techniky od klasických procesorů výkonných počítačů. Základním problémem je malá šířka paralelně zpracovávané a v systému přenášené informace (počet bitů paralelně zpracovávaná jednotky informace). Celkově lze shrnout specifika těchto mikroprocesorů resp. mikrokontrolérů do následujících bodů. - malá šířka paralelně zpracovávané informace (zjednodušeně řečeno malá šířka datové sběrnice), důsledkem je, že k zakódování instrukce většinou nestačí jediná buňka operační paměti, to vede ke složitějšímu řadiči a prodloužení doby provádění programu (celkový počet bytů, tedy velikost adresního prostoru, nutných k uložení daného programu roste, s tím je spojená nutno více přístupů do operační paměti, ta byla technologicky vždy „pomalejší“, než procesor), - komplikovanější přístup k zásobníkové paměti realizované v adresním prostoru operační paměti (operační paměť je adresována bytově, položka zásobníku je šestnáctibitová – návratová adresa).
MIKROPROCESORY-ZÁKLADY-2007-S
-
19
technologické problémy s pouzdřením a z nich plynoucí omezený počet vývodů čipu (resp. integrovaného obvodu), nutnost multiplexovat zejména informace procesorem generované, procesory jsou aplikačně určeny pro práci v reálném čase, v jejich architektuře je pozornost věnována přerušovacím systémům.
Řešení problémů spočívalo především v těchto opatřeních: - vznik komplikovanějších adresovacích módů (způsobů stanovení skutečné fyzické adresy při výběru informace z operační paměti či zápisu do ní) - vznik mezipamětí pro uchovávání mezivýsledků při zpracování programu (zápisníkové paměti jako pole univerzálních registrů resp. paměti cache, použití osmibitových registrů spojovaných po dvojicích, takže jsou využitelné i pro adresaci), - vznik HW a SW prostředků pro realizaci systémů přerušení včetně zásobníkové paměti.
Obr. 6: Zjednodušené blokové schéma mikroprocesoru.
Klasické procesory mohly pracovat s instrukcemi s počtem bitů dostatečným pro zakódování veškeré informace nutné pro provedení instrukce včetně odkazů na operandy a uložení výsledku, tedy všechny instrukce měly stejný počet bitů a tento počet bitů měly i buňky operační paměti, uvedené skutečnosti zjednodušovaly řízení procesoru a návrh jeho instrukčního souboru.
20
FEKT Vysokého učení technického v Brně
Mikroprocesory uvedené třídy tento problém řeší instrukčními soubory s proměnnou délkou instrukcí. Protože většinou mají operační paměť orientovanou bytově, tedy paměťové buňky jsou osmibitové, skládají se jejich instrukce z jednoho až několika bytů. To prodlužuje dobu vykonávání instrukcí a komplikuje obvodové řešení řadiče procesoru. Komplikuje to i návrh instrukčního souboru, protože se využívají různé způsoby nepřímého určení operandu s cílem snížit počet bitů souvisejících s určením operandu obsažených přímo v instrukci. Různost způsobů výběru operandů se zpětně promítá do složitosti obvodů procesoru. Z výše uvedeného vyplývá, že popsané nevýhody lze omezit při omezení počtu přístupů do operační paměti při vykonávání určitého programu. Proto jsou ve struktuře těchto mikroprocesorů zavedeny v různém počtu a seskupeních univerzální registry, které slouží především k uchovávání mezivýsledků a k nepřímé adresaci a jejichž využití omezuje počet přístupů do operační paměti. Zjednodušené blokové schéma mikroprocesoru (osmibitový mikroprocesor z osmdesátých let 20. století) je uvedeno na Obr. 6. Charakteristickým rysem je také orientace struktury této třídy mikroprocesorů na akumulátor. Akumulátor je specifický registr procesoru, který je implicitně využíván pro uchovávání jednoho z operandů a výsledku dvouoperandových aritmetických a logických operací. Dále je většinou využíván jako implicitní zdrojový a cílový registr při V/V operacích (při provádění instrukcí vstupu a výstupu dat). S ohledem na řídící aplikace této třídy mikroprocesorů se u nich objevují poměrně rozsáhlé skupiny instrukcí pro manipulaci s jednotlivými bity zpracovávané informace. U jednočipových mikrokontrolerů s kompletním V/V systémem na čipu jsou pochopitelně samozřejmostí instrukce pro přímé ovládání tohoto systému (V/V operace zaměřené na řízení přenosu prostřednictvím vzorkovaných V/V bran, řízení sériových přenosů, řízení multiplexerů a A/Č a Č/A převodníků atd.). Jednotlivé charakteristické rysy i specifické vlastnosti této třídy mikroprocesorů a mikrokontrolerů budou popsány v souvislosti s jejich konkrétními typy, používanými při laboratorních cvičeních.
4.1 Aritmeticko logická jednotka ALU a řídící jednotka Proberme si nyní poněkud podrobněji aritmeticko-logickou jednotku ALU a řídící jednotku respektive dekodér instrukcí a to s hlediska jejich činnosti, viz. Obr. 6. Při tom současně osvětlíme činnost dalších – spolupracujících – částí mikroprocesoru. Mikroprocesor je uveden signálem RESET do výchozího stavu. V tom okamžiku je vynulováno či uvedeno do definovaného stavu více klopných obvodů nebo čítačů, které mikroprocesor obsahuje. Většině mikrokontrolerů je společné vynulování čítače instrukcí (program counter = PC). Tento registr obsahuje adresu, na které leží právě prováděná instrukce (instrukce jsou ve formě binárních čísel uloženy v paměti). Po provedení instrukce je tento registr zpravidla inkrementován a je prováděna další instrukce, po jejím provedení je znovu inkrementován atd. Po vynulování signálem RESET je tedy vzápětí prováděna instrukce na adrese 0000. Dekodér instrukcí nejprve zjistí, co mu daná instrukce přikazuje a poté ji buď provede sám nebo jejím provedením pověří např. ALU. Některé instrukce však nezabírají pouze jednu paměťovou buňku (t. zv. jednoslovné instrukce), nýbrž mohou zabírat dvě i více buněk v paměti. V tom případě se po provedení takové instrukce zvýší obsah PC o více než o jednu. Instrukce, které mohou existovat, se liší podle jednotlivých mikroprocesorů. Uveďme si zde jako příklad některé nejběžnější. Je to v prvé řadě instrukce NOP (non operacion =nedělej nic). Po této instrukci PC prostě přejde na další adresu aniž provede
MIKROPROCESORY-ZÁKLADY-2007-S
21
jakoukoli akci. Jinou instrukcí je inkrement či dekrement. Touto instrukcí je zvětšen o 1 respektive zmenšen o 1 obsah některého registru nebo i paměťové buňky. Další typickou instrukcí je nepodmíněný skok. Při provedení této instrukce je obsah PC změněn, takže program nepokračuje na následující adrese, ale na adrese, která je dána programově. Naproti tomu instrukce podmíněného skoku je poněkud složitější. Po jejím provedení může program pokračovat na následující adrese anebo na adrese jiné, dané programem. Na které adrese bude program pokračovat je dáno splněním nebo nesplněním nějaké podmínky (např. že výsledek předchozí operace se nerovná nule). Splnění či nesplnění této podmínky si mikroprocesor testuje zpravidla pomocí příslušného příznaku. Podmíněným skokem také začíná tzv. přerušení (interrupt). Tehdy zpravidla na popud z vnějšího zdroje je přerušen běh programu a dojde k odskoku na předem vyhrazenou adresu obsluhy přerušení. Adresu paměťové buňky, v níž je uložena návratová adresa si mikroprocesor uloží do registru zvaného Stack Pointer (SP). Po příchodu signálu RESET je i SP přednastaven na předem určené číslo a toto přednastavení je možné programově změnit. Instrukce využívající jednotku ALU budou určeny pro sčítání dvou binárních čísel nebo provedení nějakého logického úkonu. Většina takových instrukcí využívá pro uložení alespoň jednoho binárního čísla, se kterým bude ALU pracovat, registru A. Rovněž výsledek se zpravidla ukládá do registru A. Příkladem takových instrukcí může být např. instrukce inverse všech bitů čísla uloženého v registru A, posun všech bitů v registru A o 1 vpravo, rotace vlevo, výměna čtveřic bitů v registru A atd. Osmibitový mikroprocesor v případě aritmetických operací však bere obsah paměťové buňky jako osmibitové binární číslo, v případě logických operací tento obsah chápe jako osm samostatných bitů. Jestliže by např. v akumulátoru bylo uloženo binární číslo 1110 0011 a obsah registru byl 1001 0110, pak v případě instrukce logického součtu bychom dostali 1111 0111 a v případě aritmetického součtu dostaneme 1 0111 1001. Součet dvou osmibitových čísel může být číslo devítibitové. Tento devátý bit by musel vypadnout, což někdy je možno akceptovat, ale jindy je nutné tento bit zachovat. K tomu účelu mají mikroprocesory jednobitovou paměťovou buňku označenou jako C (carry), do níž je v případě „přetečení“ akumulátoru uložena jednička. Tento bit se používá jako příznak. Těchto příznakových buněk bývá více a jejich obsah se může po provedení instrukce změnit podle výsledku operace.
4.2 Programování mikrokontrolerů Programování všech mikrokontrolerů různých výrobců je ve své podstatě stejné. Liší se pouze instrukcemi a architekturou jednotlivých typů mikrokontrolerů. v této kapitole uvedeme pouze základní pojmy a principy, které jsou společné pro všechny typy jednočipových mikrokontrolerů. Instrukční soubor je sada instrukcí, které procesor rozpozná a je schopen je provést. Každý mikroprocesor má svůj instrukční soubor s různým počtem instrukcí. Adresovací prostor je počet adres v paměti, který je mikroprocesor schopen naadresovat. Udává se např. v počtu kBytů. Počet adres se dá odvodit z počtu adresovacích vodičů. Strojní kód (machine code) je program vyjádřený zcela elementárním způsobem jako posloupnost binárních čísel. Pro člověka nesrozumitelný, pro stroj přímo proveditelný. Programy s koncovkou .EXE a .COM obsahují strojní kód.
22
FEKT Vysokého učení technického v Brně
Assembler je programovací jazyk nejnižší úrovně. Je tvořen symboly, kterým odpovídají kódy strojního kódu. Každý procesor má svůj Assembler (Assembly language). Assembly program je překladač z assembleru do strojního kódu. Počítač dokáže přeložit program napsaný ve assembleru do strojního kódu, někdy dokáže dokonce napodobit chování mikroprocesoru a program nejenom přeložit, ale i vykonat jednotlivé instrukce a popřípadě i upozornit na chyby a umožnit programátorovi odladit program. Na Obr. 7 je uveden standardní řádek programu psaného v asembleru. Řádek je rozdělen do čtyř pomyslných sloupců, v prvním je návěstí řádku (může zůstat prázdné), ve druhém samotná instrukce, následuje sloupec s operandy (parametry) a na závěr lze připsat poznámku oddělenou znakem „ ; “.
Obr. 7: Syntaxe psaní instrukcí. V jednotlivých sloupcích programu je nutné se řídit určitými zvyky. Při psaní návěstí a jeho odkazů na něj v programu je nutné si zapamatovat, že překladač je „case sensitive“, tudíž rozlišuje malá a velká písmena (např. „Pokus“ a „pokus“ jsou dvě naprosto odlišná návěstí). Jednotlivé instrukce se píší velkými písmeny a jednotlivé parametry se uvozují znaky „#, % a $“, které instrukci říkají zda číslo následující za znakem je v binární či jiné podobě, příp. zda se jedná pouze o adresu paměťové buňky viz. Tab. 2. Návěstí
Příkaz LDA LDA LDA LDA LDA
Parametr #$12 #%01010101 #1 $12
Popis ; uloží do akumulátoru A hodnotu specifikovanou v parametru ;uloží číslo 12 v hexadicimální podobě ;uloží posloupnost jedniček a nul specifikovanou v parametru ;uloží číslo 1 v dekadické podobě ;uloží hodnotu bytu z adresy $12
Tab. 2: Příklad možností uvození parametrů. Po příchodu signálu RESET se mikroprocesor nastaví do výchozího stavu. To znamená, že se čítač instrukcí PC nastaví na adresu 0000 a obsahy některých registrů na definovanou výchozí hodnotu. Po doznění signálu RESET začne mikroprocesor postupně vykonávat jednotlivé instrukce počínaje adresou 0000. Jak již bylo řečeno, po vykonání instrukce se PC inkrementuje a mikroprocesor začne vykonávat další instrukci. Je samozřejmé, že pokud má instrukce dvě slova zvýší se obsah PC o 2, má-li instrukce 3 slova, zvýší se obsah PC o 3. To, co bylo zde uvedeno, však neplatí, jestliže mikroprocesor vykonává instrukci skoku a to jak podmíněného, tak nepodmíněného. Pak se obsah PC změní v případě nepodmíněného skoku vždy, v případě podmíněného skoku v případě splnění podmínky a to podle příslušného operandu. Jednočipové mikroprocesory: Jsou to mikroprocesory, které ve svém pouzdru obsahují paměť programu a to buď typu ROM či EPROM. Jak je zřejmé, jednočipové mikroprocesory s pamětí typu ROM jsou vyrobeny na zakázku odběratele, který musí výrobci dodat data, která mají být v paměti programu. Naproti tomu jednočipové mikroprocesory
MIKROPROCESORY-ZÁKLADY-2007-S
23
s pamětí EPROM si může uživatel sám naprogramovat podle vlastního uvážení a v případě potřeby si obsah může vymazat a nahradit jiným. Někdy výrobce nabízí mikroprocesor, který je shodný s jednočipovým mikroprocesorem, ale nemá vnitřní paměť programu a tudíž musí použít vnější paměť programu. Zde je ovšem nutno poznamenat, že i jednočipový mikroprocesor, který obsahuje paměť programu, může použít vnější paměť programu. Dokonce je možné obě paměti programu, vnější i vnitřní, zkombinovat. Vzhledem k tomu, že vnitřní paměť programu je zpravidla menší než je adresovací prostor mikroprocesoru, je zpravidla výhodné použití vnitřní paměti jen tehdy, vejde-li se do ní celý program. V případě, že je program rozsáhlejší, je výhodnější použití vnější paměti. Pokud má jednočipový mikroprocesor Harvardskou strukturu, pak obsahuje i paměť dat. Tato paměť však nebývá příliš rozsáhlá, a proto je zde rovněž i možnost vnější paměti dat, která je typu RAM.
4.3 Multiprocesorová komunikace V praxi je často třeba řešit úkol přenosu dat mezi mikroprocesorem a periferií nebo mezi dvěma či více mikroprocesory. Přenos dat se může dít zásadně dvěma způsoby a to buď paralelně nebo sériově. Paralelní způsob přenosu dat znamená u osmibitového mikroprocesoru, že osm bitů je přenášeno najednou po osmi vodičích a jejich platnost je potvrzována na některém vodiči řídící sběrnice (RD, WR, I/O R, I/O W ap.). Tento přenos jsme již poznali, a proto se jím nebudeme zabývat. Sériový přenos dat znamená, že data jsou přenášena po jediném vodiči a to jeden bit po druhém. Tento přenos je v současné době perspektivnější, a proto bude účelné si probrat alespoň základní pojmy. Sériový přenos dat může být buď synchronní nebo asynchronní. Synchronní přenos dat potřebuje dva vodiče. Vodič, po kterém se přenáší data a vodič, po kterém jdou impulsy, které synchronizuji přenos. Asynchronní přenos má pouze jeden komunikační vodič. grafické znázornění rozdílu mezi synchronním a asynchronním přenosem je na Obr. 8.
Obr. 8: Blokové znázornění sériového přenosu dat, a) synchronní přenos, b) asynchronní přenos
24
FEKT Vysokého učení technického v Brně
Na Obr. 9 jsou znázorněny příklady datového signálu pro sériový přenos dat při synchronním a asynchronním režimu. Při asynchronním režimu je nutné před vysláním dat poslat po dobu dvou period hodinového kmitočtu tzv. START bit, který příjemce upozorní na nadcházející přenos dat. Po skončení se posílá tzv. STOP bit, jehož úroveň je na rozdíl od START bitu v log. 1.
Obr. 9: Příklady datového signálu, a) pro synchronní přenos, b) pro asynchronní přenos Asynchronní přenos se někdy také nazývá zkratkou UART (Universal Asynchronous Receiver / Transmitter). Pro komunikaci mezi více mikrokontrolery se používá zvláštní typ sériové komunikace, kdy se jeden ze spojených mikrokontrolerů nastaví jako Master (hlavní) a zbývající jako Slave (podřízené). V takovém případě má každý z mikrokontrolerů vlastní jedinečnou adresu, a vždy mezi sebou komunikují pouze dva mikrokontrolery. Pro takovéto spojení se však využívá 3-4 vodičového vedení a slouží pouze pro krátké vzdálenosti.. To, co zde bylo o multiprocesorové komunikaci uvedeno, samozřejmě nevyčerpává celou problematiku. Rozšíření těchto informací však není náplní tohoto kursu.
4.4 Shrnutí Dnešní stav mikroprocesorové techniky nelze popsat obecně a nelze provést srovnání s klasickými procesory, které zejména díky paralelním přístupům ke zpracování informace dosahují parametrů ještě před nedávnem nemyslitelných. Přesto jsme se pokusili popsat na úrovni dodnes používaných a vyvíjených zejména osmibitových ale i šestnáctibitových mikroprocesorů a mikrokontrolerů jejich zvláštnosti. Charakteristickým rysem je také orientace struktury této třídy mikroprocesorů na akumulátor. Akumulátor je specifický registr procesoru, který je implicitně využíván pro uchovávání jednoho z operandů a výsledku dvouoperandových aritmetických a logických operací. Dále je většinou využíván jako implicitní zdrojový a cílový registr při V/V operacích. Mikroprocesor řídí řídící jednotka, která zpracovává jednotlivé instrukce, z nichž některé posílá ke zpracovávání do různých modulů. Jedním z nejdůležitějších je ALU, která zpracovává výhradně matematické operace. V praxi je často třeba řešit úkol přenosu dat mezi mikroprocesorem a periferií nebo mezi dvěma či více mikroprocesory. Přenos dat se může dít zásadně dvěma způsoby a to buď paralelně nebo sériově. Častěji používaný je přenos sériový, který může být buď synchronní nebo asynchronní.
4.5 Otázky: 8. Jaký je rozdíl mezi aritmeticko logickou jednotkou a řídící jednotkou mikropočítače?
MIKROPROCESORY-ZÁKLADY-2007-S
25
9. Co je instrukční soubor? 10. Jaký znak se používá pro oddělení komentáře při psaní programu v assembleru? 11. Jak se liší synchronní datový signál od asynchronního při sériovém přenosu dat?
4.6 Příklady řešené 1. Proveďte logický součet součet dvou binárních čísel: 1101 1001 0111 1111 Řešení: 1101 1001 0111 1111 1111 1111 2. Dokažte, že neplatí asociativní a distributivní zákon při omezení počtem bitů. Pro zjednodušení budeme počítat v desítkové soustavě a zavedeme si omezení na tři čísla, tzn. Nelze zobrazit čísla mimo interval <-999, +999>. Pro: a=300, b=-600, c= -500 dokažte že platí: a ⊕ (b ⊕ c ) ≠ (a ⊕ b ) ⊕ c
Řešení: Spočítáme si nejprve obě části nerovnice: 300 +(-600+ (-500)) =300+(-∞)=∞ (300+(-600)) + (-300)=-300+ (-300)=-600 Z výsledků vidíme, že to co platí při běžných aritmetických počtech nemusí vždy platit v mikropočítačích.
4.7 Přiklady – neřešené 3. Aritmetický součet dvou binárních čísel: 1101 1001 0111 1111 - dochází k přenosu – carry. 4. Dokažte, že neplatí asociativní a distributivní zákon při omezení počtem bitů. Pro zjednodušení budeme počítat v desítkové soustavě a zavedeme si omezení na tři čísla, tzn. Nelze zobrazit čísla mimo interval <-999, +999>. Pro: a=0, b=300, c= 400 dokažte že platí: a ⊗ (b ⊗ c ) ≠ (a ⊗ b ) ⊗ c
26
FEKT Vysokého učení technického v Brně
5 Odpovědi 1. V harvardské koncepci je paměť rozdělena na paměť dat a paměť programu. 2. Byl programován pomocí drátěných propojek v poli zdířek. 3. Pojem generace počítačů vyjadřuje hodnocení stupně vývoje číslicových počítačů z hlediska systémového a technologického řešení, používaného programového vybavení, výkonnosti a dalších dosahovaných parametrů. 4. Strojový cyklus je základní časovou jednotkou z hlediska přenosu informace mezi procesorem a okolím. Skládá se z několika taktů (většinou 3 a více, záleží na tom, co se má během daného strojového cyklu odehrát) a lze ho definovat jako časový interval, během něhož dojde k přenosu jednotky informace mezi procesorem a jeho okolím (jednotkou informace tedy v tomto případě je paralelní slovo s počtem bitů rovným počtu vodičů datové sběrnice). 5. Přerušovací cyklus je sytém obsluhy událostí, které nezávisí na průběhu vykonávání hlavního programu. 6. Primární způsob použití je k uchovávání návratových adres při skocích do podprogramů nebo obsluh přerušení. 7. Provedení každé z instrukcí programu spočívá v opakování dvou kroků: i. Čtení instrukce z operační paměti (nutno si uvědomit, že každá instrukce se obecně skládá z operačního kódu a odkazů na operandy a k zakódování této informace nemusí obecně stačit počet bitů jediné buňky operační paměti). ii. Provedení instrukce (samotné provedení instrukce může ale nemusí znamenat komunikaci procesoru s okolím, tedy při provedení instrukce procesor může ale nemusí vykonat další strojové cykly). 8. Řídící jednotka dekóduje instrukci a buď ji sama vykoná nebo ji pošle do jiného modulu. ALU pouze vykonává instrukce, které obdrží od řídící jednotky. 9. Instrukční soubor je sada instrukcí, které procesor rozpozná a je schopen je provést. Každý mikroprocesor má svůj instrukční soubor s různým počtem instrukcí. 10. „ ; “ 11. Při asynchronním sériovém přenosu se připojují START a STOP bity na začátek a konec přenášeného slova.
MIKROPROCESORY-ZÁKLADY-2007-S
27
6 Řešení příkladů 1. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – čtení druhého bytu instrukce a uložení do nižších osmi bitů registru SP. Třetí strojový cyklus – čtení třetího bytu instrukce a uložení do vyšších osmi bitů registru SP. 2. První strojový cyklus – čtení kódu instrukce. Druhý strojový cyklus – čtení druhého bytu instrukce a uložení do nižších osmi bitů adresovacího registru. Třetí strojový cyklus – čtení třetího bytu instrukce a uložení do vyšších osmi bitů adresovacího registru. Čtvrtý strojový cyklus – vyslání obsahu registru SP na adresovou sběrnici, uložení nižšího bytu návratové adresy přes datovou sběrnici na buňku operační paměti adresovanou obsahem SP, dekrementace SP. Pátý strojový cyklus – vyslání obsahu registru SP na adresovou sběrnici, uložení vyššího bytu návratové adresy přes datovou sběrnici na buňku operační paměti adresovanou obsahem SP, dekrementace SP. Přesunutí obsahu adresovacího registru (počáteční adresa podprogramu) do programového čítače. 3. 1 0000 0000 4. ∞≠0 Použitá literatura [1] Hlavička, Jan: Architektura počítačů. Vydavatelství ČVUT, Zikova 4, Praha, květen 2001. ISBN 80-0101847-4. [2] Legát, P., Sklenář, J.: Základy mikroprocesorové techniky. VUT Brno, VN MON 1987. [3] Starý, J.: Mikropočítač a jeho programování. SNTL Praha, 1984.