Technika mikroprocesorowa, Edukacja, studia, Semestr IV, Technika Mikroprocesorowa


  1. Rejestry

Celem systemu komputerowego jest wykonywanie przekształceń informacji, mających służyć człowiekowi.

Każdy procesor wyposażony jest w lokalną pamięć nazywaną rejestrem. Rejestr jest to najmniejsza lokalna pamięć położona najbliżej procesora. Innymi rodzajami pamięci są pamięci podręczne, które mogą w wielu przypadkach być wielopoziomowe. Służą do tego, aby przechowywać z zapasem (wyprzedzeniem, predykcją) dane rozkazy, które będą w przyszłości wykorzystane. Kolejnym rodzajem pamięci jest pamięć operacyjna. Pamięć ta jest poza procesorem, może jednak być wbudowana w strukturę układu.

Rejestry komputera - położone najbliżej procesora przechowują informacje, które zostały dostarczone bezpośrednio i dla których wykonuje operacje. Jest to specyficzna pamięć układu.

Słowo we współczesnych komputerach może mieć długość wielokrotności bajta i najczęściej jest wielokrotnością liczby 2. Mamy komputery o organizacji bajtowej, dwubajtowej (16 bitów), czterobajtowej (32 bity) jak i ośmiobajtowej (64 bity).

Niezależnie od długości słowa w każdym procesorze muszą być co najmniej 3 rejestry, aby procesor mógł wykonywać program:

  1. akumulator - przechowuje daną, na której wykonuje się obliczenia;

  2. licznik rozkazów (PC, IC) - jest rejestrem o długości adresu w komputerze, nie musi mieć takiej samej długości jak akumulator. Wskazuje adres następnego rozkazu do wykonania. Każdy program składa się z instrukcji w kodzie maszynowym;

  3. wskaźnik stosu - bez stosu nie da się zorganizować podprogramów, przerwań i przetwarzania współbieżnego.

Oprócz tych 3 podstawowych rejestrów występują jeszcze inne rejestry:

  1. rejestry służące do realizacji:

  • rejestry bazowe, które przechowują adres bazowy, względnie punkt odniesienia dla programu. Zawartość tego rejestru może ulegać inkrementacji lub dekrementacji (przed i po wejściu);

  • rejestry indeksowe - automatycznie ulegają inkrementacji lub dekrementacji;

  • rejestr segmentowy - przechowuje adres początkowy segmentu danych umieszczonych na stosie.

    1. Rozkazy

    Cykl rozkazowy - opis, w jaki sposób wykonuje się rozkaz. Składa się on z trzech faz:

    1. pobranie rozkazu z pamięci - aby rozkaz pobrać z pamięci potrzebna jest zawartość licznika rozkazów. Wskazuje ona miejsce w pamięci, w którym znajduje się kolejny rozkaz. Zawartość tego licznika kierowana jest na szynę adresową;

    2. wykonanie rozkazu;

    3. przerwanie i jego obsługa.

    W zależności od tego, co jest argumentem rozkazu możemy mówić o rozkazach:

    1. bezadresowych - jest to rodzaj rozkazu, w którym cały kod polecenia zajmuje jedno całe słowo. Przykładami tego typu rozkazów są:

    Składanie stron pamięci. Kolejne bity pobierane są z różnych kości pamięci. W jednym kroku można obsłużyć 8 kości pamięci. Odczyt jest niemal jednoczesny. Jeżeli rozkaz jest dwubajtowy, to otrzymujemy dwa kolejne bajty, które wędrują do umownego rejestru rozkazów i w sumie razem tworzą podrozkaz. Po to, aby odczytać rozkaz dwubajtowy z pamięci o organizacji jednobajtowej potrzebne są dwa cykle (odczyty), powodujące automatycznie zwiększenie o jeden wartości licznika rozkazów albo szyny adresowej. Rozkaz bezadresowy ma pewien adres. Adresem każdego rozkazu, z wyjątkiem rozkazu STOP, jest licznik rozkazów.

    1. rozkaz, który ma jeden adres. Adres ten oznacza miejsce, w którym znajduje się argument rozkazu, czyli dana, na której na być wykonane działanie. Adres ten może być rejestrem

    2. rozkaz z argumentem bezpośrednim. Dana do wykonania znajduje się bezpośrednio w kodzie rozkazu lub tuż za nim.

    0x08 graphic
    Dana jest sytuacja jak na rysunku poniżej. Za kodem są dwa adresy, które są dodatkowo podzielone. Instrukcja ta oznacza, że rozkaz ma dwa adresy, gdzie pierwszy z adresów oznacza źródło, drugi zaś przeznaczenie. Najczęściej taki sposób adresowania jest wykorzystywany w operacjach przesłania.

    1. Przerwania

    Przerwanie - jest to sygnał, który może pojawić się w dowolnym momencie czasu. Jakie to są sygnały z punktu widzenia komputera? Są to sygnały pochodzące z otoczenia, mówiące, że coś się stało. Może to być sygnał od sterownika czasowego, powiadomienie o fakcie naciśnięcia przez użytkownika klawisza klawiatury, wysłanie bajta informacji, odebranie bloku informacji. Co się dzieje, gdy przychodzi przerwanie? Aby to przerwanie zostało obsłużone, czyli aby został wykonany specyficzny program, fragment związany z programem, to muszą być spełnione warunki:

    0x08 graphic
    Stos - fragment pamięci operacyjnej, który jest interpretowany jako coś, co wskazuje miejsce w pamięci, które jest całkowicie zapełnione. Jest to rejestr, który adresuje pamięć w postaci kolejki: „ostatni wszedł, pierwszy zszedł” - „Last in, First Out” (LIFO), czyli to co na wierzch zostało włożone z wierzchu zostanie zdjęte. Są rozkazy praktycznie w każdym komputerze, które pozwalają na bezpośrednie operowanie na stosie. Są to rozkazy pozwalające wepchnąć na stos coś i zdjęcie czegoś ze stosu. Wepchnięcie i zdjęcie czegoś najczęściej dotyczy zawartości rejestru. Również w niektórych organizacjach istnieje możliwość zapakowania lub zdjęcia dowolnej wartości binarnej, którą umieści się w kodzie rozkazu. Jeżeli chcemy cokolwiek wpisać na stos to musi ulec zmniejszeniu wskaźnik stosu: SP - 1  SP. SP wskazuje to miejsce, gdzie dane będą wpisane. Dane są zawsze w stosie wpisywane „w dół”. Muszą istnieć mechanizmy, które będą przeciwdziałać nadpisaniu czegoś używając operacji na stosie w miejsce, które nie powinno być nadpisane. Najczęściej są to zabezpieczenia programowe. Operacja zdejmowania czegoś ze stosu ma charakter odwrotny.

    W fazie obsługi przerwania sprawdza się czy przerwania są odblokowane i czy dane przerwanie, które się pojawiło można obsłużyć. Jeśli te dwa warunki są spełnione to wykonują się kolejne operacje. Przechowanie śladu w liczniku rozkazów (adres lokacji na stos i status). Dalej wykonuje się skok. Polega on na wpisaniu do licznika rozkazów nowej wartości, która jest związana z przerwaniem i nosi nazwę wektora przerwań. Jest to nowa zawartość licznika stanu, która wskazuje miejsce w pamięci, gdzie zacznie się program. System przerwań pozwala na współpracę systemu komputerowego z otoczeniem oraz na współdzielenie procesora między programami.

    1. Tryby adresowania

    Tryby adresowania dotyczą obliczania adresu efektywnego. Adres efektywny jest to ten adres, który ostatecznie wskazuje lokalizację w pamięci argumentu rozkazu, czyli tej danej, która ma być pobrana i na której ma być wykonane obliczenie w danym rozkazie.

    Adres argumentu = adres argumentu w rozkazie + modyfikator + ... + modyfikator

    Każdy komputer działa w ten sposób, że pobiera z pamięci operacyjnej kolejne słowa, które interpretuje na kod rozkazu jako polecenie do wykonania. Polecenia te dotyczą operacji na danych w pamięci, na danej zawartości w rejestrze lub też na samych rejestrach. Przykładem rozkazu może być rozkaz skoku czyli rozkaz przejścia z jednego miejsca w programie do drugiego (warunkowy lub bezwarunkowy) i jest w rzeczywistości zmianą zawartości licznika rozkazów (licznika instrukcji).

    Adresacja bezpośrednia - argument jest bezpośrednio wskazywany przez rozkaz. W trybie tym mamy dwie możliwości:

    Najprostszy rozkaz - rozkaz skoku w swojej zawartości zawiera adres, do którego należy przejść. Podobny charakter ma rozkaz skoku względnego (BRENCH); w kodzie rozkazu zawarte jest względne przesunięcie względem aktualnej pozycji. Jest to aktualizacja, gdzie mamy przejść ze sterowaniem wykonania programu.

    Przykłady adresacji bezpośredniej:

    0x08 graphic

    0x08 graphic

    Adresacja pośrednia - tryb pośredni rejestrowy: argument dla rozkazu jest zawarty wewnątrz wskazanego rejestru, tzn. wykonujemy operację nie na rejestrze, tylko na tym co w nim tkwi w środku. Drugi tryb to taki, że argument umieszczony bezpośrednio w kodzie rozkazu lub za rozkazem jest adresem miejsca w pamięci, który zawiera tę daną, na której należy wykonać operację. Może wystąpić też specyficzny rodzaj adresowania pośredniego, tzw. Adresowanie podwójnie pośrednie - adres w tym przypadku nie jest adresem argumentu, lecz adresem adresu wskazującego argument. Mogą być następujące struktury rozkazu:

    0x08 graphic
    0x08 graphic

    lub

    0x01 graphic

    0x08 graphic
    Adresowanie względne - przesunięcie oznacza, że właściwy argument rozkazu jest przesunięty względem pewnego rejestru bazowego o +/- pewną wartość. W szczególnym przypadku rejestrem bazowym może być licznik rozkazów. Gdy występuje rozkaz „skocz względnie” oznacza to skok lokalnie pod pewną wartość w stosunku do aktualnej wartości

    0x08 graphic
    Adresowanie indeksowane - przesunięcie jest dodawane do zawartości rejestru, która może ulec autodekrementacji lub autoinkrementacji. Mówimy wtedy o zmniejszeniu lub zwiększeniu zawartości pewnego rejestru. Przy adresowaniu pośrednim to możemy dodać zawartość rejestru do rejestru indeksowego i dla takiej sumy szukać właściwy argument w pamięci lub też można pobrać dwukrotnie to coś, co jest wskazywane w rejestrze i dodać zawartość rejestru indeksowego. Jest to tzw. post- i preindeksacja.

    Mamy tutaj taką sytuację, że zawartość rejestru indeksowego wskazuje miejsce w pamięci, w którym jest argument, tzn. mamy pośredniość indeksową i pośredniość pamięciową - dwa typy pośredniości zastosowane razem. W systemie UNIX mamy tryb indeksacyjnego adresowania bloków pamięci, gdzie wskazany blok w pamięci zawiera adresy kolejnych bloków lub też wskazań na dalsze bloki zawierające adresy. Taki sposób zagłębiania może wynieść 3, co pozwala nam zaadresować bardzo duży obszar pamięci.

    Razem z trybami adresowania, przede wszystkim pośredniego łączone są tryby adresowania indeksowego i bazowego. Z trybem adresowania bazowego związany jest jeden ze sposobów technicznych adresowania pamięci operacyjnej w celu uniknięcia jej fragmentacji.

    Jeżeli ustawimy rejestr, podany w sposób jawny, lub rejestr domniemany, to jeszcze dodatkowo mogą te tryby adresowania dotyczące rejestrów wymagać dalszej modyfikacji. Możemy dodać do tego co jest w rejestrze zawartość rejestru indeksowego i w ten sposób obliczyć finalny, ostateczny adres efektywny. Jeśli nie jest to tryb indeksowany, to dane są dostępne bezpośrednio, bo tkwią one w rejestrze. Jeżeli mamy podany adres, to jest on interpretowany dwojako. Albo jest on bezpośrednim argumentem rozkazu, albo wskazuje jakieś miejsce w pamięci, które zawiera argument i ten adres wskazywany może podlegać dalszej modyfikacji związanej z trybem indeksacyjnym i indeksowanym. Dodanie wartości rejestru indeksowego do adresu bazowego może być związane z autodekrementacją lub autoinkrementacją, co oznacza, że automatycznie będzie zwiększona lub zmniejszona zawartość tego rejestru indeksowego po wykonaniu operacji sumowania. Operacja ta może być pre- i post-, tzn. zwiększenie lub zmniejszenie zawartości rejestru indeksowego może się odbyć przed dodaniem lub po dodaniu.

    Ogólny schemat obliczania adresu efektywnego elementu rozkazu.

    W momencie kiedy zaczynamy obliczać adres efektywny, najpierw zadajemy pytanie: co jest argumentem bezpośrednim podanym w kodzie rozkazu? Czy jest to rejestr czy adres? Jeżeli jest to rejestr, to mamy dwie sytuacje. Albo rejestr ten jest w sposób jawny podany albo też mamy rozkaz, który posługuje się rejestrem domyślnym. W każdym komputerze są rejestry ogólnego przeznaczenia, rejestry podstawowe komputera, w których możemy stosować tzw. domyślność w przypadku adresowania w trybie rejestrowym. Dotyczy to licznika rozkazów, gdzie skoki względne i bezwzględne dotyczą zmiany jego zawartości. Jest to tryb adresowania domyślnego z domyślnym rejestrem. W rozkazie nie wskazuje się licznika rozkazów, sam kod rozkazu jednoznacznie określa, że o ten licznik chodzi i jego będzie dotyczyła bezpośrednio operacja. Może dotyczyć też np. wskaźnika stosu. Wszystkie rozkazy, które są związane z wywołaniem np. funkcji czy procedury danego kodu działają automatycznie na liczniku rozkazów i na stosie. Rozkazy powrotu z procedury również działają automatycznie na wskaźniku stosu, a w efekcie zmieniają zawartość licznika rozkazów. Są również rozkazy bezpośrednio operujące na wskaźniku stosu.

    1. Fragmentacja i defragmentacja pamięci

    Komputery równocześnie wykonują wiele różnych zadań, które nazywają się procesami. Przetwarzanie współbieżne polega na tym, że procesy ubiegają się i rywalizują o zasoby systemu. Zasobami oprócz pamięci operacyjnej jest procesor, wtedy, gdy jest to system jednoprocesorowy. Wszystkie systemy są systemami współbieżnymi z różnie realizowaną współbieżnością (systemy klasy UNIX i LINUX). Jeżeli każde zadanie, które ma być realizowane w komputerze będziemy „pakować” do pamięci operacyjnej w sposób ciągły, to zadanie to może się wykonać w dowolnym momencie czasu. W momencie kiedy to działanie zakończy się definitywnie, jest ono już niepotrzebne w pamięci i trzeba je usunąć. Usunięcie oznacza przekazanie obszaru pamięci, które zajmowało to zadanie do puli wolnych bloków. Nie oznacza to wymazania zawartości bloku, tylko logiczne wskazanie, że to miejsce stanie się blokiem. W związku z tym, gdy w kolejce czeka kolejne zadanie do wykonania, to może się okazać, że zadanie to wymaga większego bloku obszaru pamięci, niż wynosi wielkość właśnie zwolnionego obszaru. Nie jesteśmy w stanie przewidzieć, jaki obszar pamięci będzie czekał na to zadanie w chwili kiedy będzie ono wykonywane na komputerze. Kiedyś każde zadanie miało pewien obszar stały, który zawsze rezydował w pamięci, tzw. obszar nakładkowania lub wymiany. W obszar ten wymiennie pakowano kawałek kodu programu i ten kawałek był wykonywany. Aby sobie poradzić z tym problemem wprowadzono dwa rozwiązania: mechanizm segmentacji pamięci oraz mechanizm stronicowania.

    1. mechanizm segmentacji pamięci. W Intelu 8086 i wyżej istnieje mechanizm segmentacji pamięci. Polega to na tym, że dla każdego kawałka programu dynamicznie wskazujemy początek obszaru wolnego, w który go wpakujemy. Następnie dzielimy kod programu na fragmenty: segment kodu, bazę tego segmentu (adres bazowy), segment danych, segment stosu i dopasowujemy wielkości segmentów do wolnej przestrzeni pamięci operacyjnej, która aktualnie jest dostępna. Od wartości rejestru bazowego zaczynają się obszary, których dotyczy nazwa tego segmentu. W kodzie rozkazu zawarte są przesunięcia względem początku segmentu.

    1. mechanizm stronicowania. Jest to alternatywny sposób uniknięcia fragmentacji pamięci. Mechanizm ten stosowany jest w dużych komputerach. Polega on na tym, że dzielimy pamięć operacyjną na stałej wielkości bloki, zwane ramkami. Te stałej wielkości bloczki odpowiadają blokom programu, które nazywają się stronami. Wielkość adresowania i adres faktyczny, który jest adresem (argumentem) w programie dzielimy na dwie części. Mamy określoną długość rejestru stron i pozostałą długość adresu, która jest adresem związanym z przesunięciem. Przesunięcie pozostaje niezmienne, natomiast numer strony jest ciągły. Program jest tak skonstruowany, że kolejne strony występują bezpośrednio po sobie, natomiast program fizycznie w pamięci operacyjnej jest lokowany w różnych ramkach umieszczanych dowolnie. Po to aby znaleźć, w którym miejscu faktycznie dana dana znajduje się w pamięci operacyjnej trzeba dokonać konwersji. Dokonuje się konwersji lewej, bardziej znaczącej części adresu argumentu na fizyczny adres ramki. Wszystko to zapewnia nam sprzęt, ponieważ jest to mechanizm sprzętowy.

    0x08 graphic

    Różne rozkazy programu mogą być umieszczone w kolejnych blokach w pamięci po to aby można było dokonywać odczytów z pamięci bajt po bajcie posiadając w tym czasie możliwość odczytu „na siebie”. Taki mechanizm nazywa się przeplataniem. Wczytujemy do pamięci notatnikowej więcej niż jeden rozkaz. Najlepszym sposobem na przyspieszenie działania każdego procesora i w związku z tym każdego komputera jest pobranie do pamięci notatnikowej, która leży bardzo blisko procesora, więcej niż jednego rozkazu. Średni czas odczytu z pamięci operacyjnej jest rzędu dziesiątek ns (60, 50, 30 ns), natomiast czas odczytu z pamięci notatnikowej jest jeszcze szybszy (krótszy). Procesor jednak nie wie jak wygląda kod programu, ponieważ go nie interpretuje. W każdej chwili może wystąpić w kodzie rozkaz skoku. W takiej sytuacji sterowanie w sposób automatyczny przejdzie do nowego miejsca w pamięci i okazuje się wówczas, że te dane, które są wczytane do pamięci notatnikowej nie zawierają kodu rozkazu, który ma być wykonany. Trzeba wówczas na nowo zapełnić bufor pamięci podręcznej. Cały mechanizm stronicowania staje się bezużyteczny. Jeżeli korzystając ze stronicowanie odczytujemy coś naprzód, to trzeba to wycofać i na nowo odczytywać. Wczytując kolejne rozkazy, jeśli odczytamy prawidłowo z pamięci notatnikowej kolejny rozkaz, to trafiliśmy. Trafienie lub nietrafienie nazywa się współczynnikiem trafień. Im mamy większą tablicę stron, która dokonuje konwersji z numeru strony na numer ramki, tym bardziej czasochłonne są te operacje. W takim przypadku współczynnik trafień będzie gorszy. Sposobem na to może być zwiększenie rozmiaru strony. Jednak im większy rozmiar strony i równocześnie ramki, tym bardziej rosną średnie straty pamięci. Jeżeli jeden znak zajmuje całą ramkę, to średnia strata będzie wynosiła pół wielkości ramki (strony).

    Mechanizm stronicowania jest jednym ze sposobów eliminacji fragmentacji pamięci operacyjnej. Jest to mechanizm zarządzany sprzętowo. Mechanizm stronicowania jest połączony z tzw. pamięcią wirtualną. Pamięć wirtualna jest to logiczne wydłużenie pamięci operacyjnej o pewien fragment pamięci dyskowej. Możemy zadeklarować, że plik wymiany ma pewien określony rozmiar, o którego wielkość zostaje zwiększony właśnie rozmiar pamięci operacyjnej.

    1. Przykładowe organizacje systemów komputerowych

    1. jedna wspólna szyna. Ma ona zespół nadajników i odbiorników. Przepływ informacji wygląda w ten sposób, że kolejny rozkaz, który ma być pobrany z pamięci jest wystawiany z licznika rozkazów na szynę adresową. Jest też bezpośrednio wysterowana pamięć, z której pobierany jest rozkaz do wykonania. Rozkaz ten płynie do sieci sterowania i podejmowana jest decyzja co ten rozkaz ma zrobić. Jeżeli rozkaz ten ma jakiś argument, to jest on pomniejszany na podstawie adresu zawartego w kodzie. W słowie bezpośrednio za kodem rozkazu, który musi być wykonany. W następnym kroku obliczany jest adres efektywny rozkazu i dana jest kierowana do obróbki. Są to tzw. szybkie obliczenia typu dodaj, odejmij, które odbywają się w układzie nazywanym ALU. Przepływ ma charakter „z góry na dół”, tzn. wyniki są kierowane do rejestru pomocniczego i ewentualnie są kierowane do akumulatora z rejestru pomocniczego.

    1. dwie szyny danych. W tej sytuacji możliwe jest wykonywanie operacji naprzemiennego odczytu pamięci nakładających się na siebie. Oznacza to, że w trakcie wykonania (obróbki) słowa (bajta) można pobierać następne bajty z pamięci. Organizacja ta pozwala nam na to, ponieważ mamy dwie odrębne szyny zbierające informacje z pamięci.

    1. dwie szyny danych (inna organizacja). W kolejnej organizacji mamy dwie szyny danych: szynę wejściową i szynę wyjściową. Szyny te pełnią funkcję magistral komunikacyjnych. Kolejne rozkazy są pobierane z pamięci. Jeżeli jest potrzeba pobrania dalszych argumentów z pamięci, to są one pobierane. Zawartość licznika rozkazów ulega kolejnej modyfikacji, po to aby wskazywać kolejne bajty rozkazów i argument lub informacja pobierana jest kierowana albo do rejestrów albo do akumulatora i do ALU. Wynik operacji wchodzi na szynę wyjściową i znowu jest przechowywany (zapis do pamięci). Następnie następuje rozdzielenie informacji wyjściowej przez multiplekser, który rozdziela sygnały w określone miejsca. Przekierowywanie strumieni odbywa się w zależności od tego jaki rozkaz jest wykonywany i gdzie wyniki tego rozkazu mogą być skierowane.

    System komputerowy oparty na Intelu 8086 (16 bit.). Sam procesor składa się z:

    Układy sprzęgające sprzęgają magistralę z pamięcią, np. RAM, ponieważ musi być możliwość komunikacji z otoczeniem, tzw. sprzęgi.

    Intel charakteryzuje się tym sposobem adresowania pamięci eliminującym fragmentację, który nazywa się segmentacją, w związku z tym występują w nim rejestry segmentowe. Rejestr segmentu kodów (CS), licznik rozkazów, rejestry ogólnego przeznaczenia (rejestry typu akumulatory, rejestry bazowe i indeksowe), wskaźnik stosu (16 bit.). Rejestr stosu razem z segmentem (rejestr segmentu stosu) tworzą razem 20-bitowy adres miejsca w pamięci operacyjnej, gdzie jest wskaźnik stosu. Układ obliczania nie jest tylko elementem, który wylicza faktyczny adres na podstawie tzw. segmentacji. Wykonuje on również obliczenia adresu efektywnego. Proces ten jest wygląda następująco. Zawartość rejestru segmentowego jest przesuwana o 4 pozycje w lewo, czyli pomnożona przez 16, a następnie wykonywane jest sumowanie dwóch adresów: 20-bitowego adresu i 4-bitowego adresu przesunięcia. Razem tworzy to 20-bitowy adres efektywny argumentu.

    1. Przetwarzanie

    Program - zapis postępowania, algorytm przetłumaczony na kod + dane. Nie ma programu takiego, aby procesor nie musiał pracować. Aby procesor mógł reagować na warunki zewnętrzne musi wykonywać jakiś program, być w stanie oczekiwania na przerwanie.

    Przetwarzanie oznacza, że obok programu i komputera musi istnieć użytkownik lub instytucja, która zleci nam przetwarzanie.

    Model przetwarzania - obok samego przetwarzania musi zawierać to, co zarządza przetwarzaniem. Zarządzanie, czyli decydowanie o tym co ma zostać przetworzone jako pierwsze, co jako drugie, a co ma nie być wcale przetworzone.

    Architektura - sposób skonfigurowania całego systemu, a w szczególności oprogramowania.

    Typy przetwarzania:

    1. scentralizowane - całość przetwarzania odbywa się na jednej jednostce obliczeniowej.

    2. rozproszone - różne składniki tworzących całość aplikacji są rozrzucone po czymś, co się nazywa siecią lokalną i pełnią one swoje pewne określone zadania.

    3. sieciowe - mamy tutaj przetwarzanie dwu- lub trzywarstwowe. W przypadku przetwarzania dwuwarstwowego (klient/serwer) aplikacja kliencka jest załadowana i uruchomiona na komputerze użytkownika, zaś serwery rozproszone są w sieci świadczą usługi na żądanie klienta. W przypadku przetwarzania trzywarstwowego istnieje jeszcze warstwa pośrednicząca, tzw. warstwa usługowa. Aplikacja kliencka jest zubożona, natomiast wszelkie zmiany są dokonywane w jednym punkcie, tzw. serwerze biznesowym lub serwerze usługowym, który zapewnia komunikację między aplikacją klienta, a docelowymi serwerami realizującymi zadania zlecone przez klienta.

    4. zespołowe - nie dość, że jest to przetwarzanie sieciowe, to jeszcze o tym jak ma to być przetwarzane decyduje człowiek.

    Przetwarzanie scentralizowane może być wykonane następującymi sposobami:

    1. sekwencyjnie - czyli zadanie po zadaniu;

    2. współbieżnie - wiele zadań wykonuje się równocześnie w pewnym przedziale czasu;

    3. równolegle - pojedyncze zadanie (o ile się da) może być zrównoleglone. Może być ono organizowane dwojako:

    1. Tryby adresowania w Motoroli

    Adres - numer komórki pamięci.

    Tryb adresowania - sposób wskazywania danych.

    Można wyróżnić dwie grupy rozkazów:

    1. rozkazy przesłań i rozkazy arytmetyczno-logiczne. W grupie tej adresowanie polega na umiejscowieniu argumentu operacji. Czyli podanie informacji, skąd pobrać dane, gdzie je umieścić, skąd pobrać argument (argumenty) operacji arytmetyczno-logicznej i dokąd przesłać wynik;

    2. rozkazy skoków. Celem adresowania jest wskazanie danych, na podstawie których zostanie utworzony adres skoku, wprowadzony do licznika rozkazów w końcowej fazie realizacji rozkazu skoku.

    Tryb wewnętrzny (wbudowany, nieodłącznie związany) - kod rozkazu jednoznacznie wskazuje gdzie jest argument.

    1. CLRA - (clear A). Oznacza wyzerowanie zawartości akumulatora A;

    2. TSX - (transfer stack to X). Przesłanie zawartości rejestru wskaźnika stosu do rejestru indeksowego X. Aby wykonać ten rozkaz potrzeba jednego dostępu do pamięci związanego z pobraniem kodu rozkazu z pamięci;

    3. RTS - (return to subroutine). Powrót z podprogramu. Oznacza odtworzenie ze stosu na podstawie zawartości wskaźnika, wskazanych przez wskaźnik stosu tych nastaw licznika rozkazów w chwili wskazania rejestru. Potrzebne są co najmniej 3 dostępy do pamięci - jeden na odczytanie kodu rozkazu i dwa kolejne na pobranie nowej zawartości licznika rozkazów.

    Tryb bezpośredni - za kodem rozkazu bezpośrednio występuje argument tego rozkazu.

    1. LDAA #$F - (load accumulator A). Ładuj akumulator A określoną wartością. Zapis asemblerowy będzie zajmował w pamięci dwa bajty. Jeden bajt będzie kodem rozkazu, a drugi argumentem - liczbą binarną;

    2. LDX #$1234 - (load index register X). Zapisanie pewnej wartości w rejestrze o długości 16 bitów. W związku z tym argument musi być również 16-bitowy. Wykonanie tego rozkazu musi zająć co najmniej 3 dostępy do pamięci - jeden na pobranie kodu rozkazu i dwa kolejne do pobrania kolejnych części argumentu.

    Po każdym pobraniu argumentu zawartość licznika rozkazów zwiększa się o 1. W chwili gdy zacznie się pobieranie drugiego bajta tego rozkazu licznik rozkazów będzie wskazywał pierwsze miejsce za argumentem. Natychmiast po wysłaniu zawartości licznika rozkazów na szynę adresową, czyli rozpoczęciu cyklu pobierania czegoś, co wskazuje licznik rozkazów, jego zawartość ulegnie zwiększeniu o 1. Licznik rozkazów wskazuje następny rozkaz do wykonania i możemy się o tym dowiedzieć tylko w tych momentach, gdy użytkownik może zobaczyć zawartość tego licznika, a dzieje się to tylko wtedy, gdy skończy się jeden rozkaz i nie zacznie się jeszcze drugi.

    Tryb rozszerzony i pośredni. Argument jest 8-bitowy i oznacza adres miejsca pamięci w stosunku do pierwszych 256 bajtów. W trybie normalnym o standardowych, fabrycznych ustawieniach, po resecie RAM znajduje się w dolnych 256 bajtach. W związku z tym, gdy nie przestawiamy lokalizacji pamięci, to w tym trybie pracy możemy odwoływać się bezpośrednio do lokalizacji związanej z pamięcią RAM. W trybie pośrednim argumentem są adresy wskazujące miejsce w pamięci, gdzie znajduje się argument. Dla tego trybu adres jest 8-bitowy, przy milczącym założeniu, że osiem bardziej znaczących bitów jest równych zeru. W trybie normalnym rozszerzonym podajemy cały, 16-bitowy adres.

    1. LDAA $1010 - oznacza, załaduj do akumulatora A zawartość miejsca w pamięci wskazywaną przez adres $1010 (heksalnie). Rozkaz ten wymaga 4 dostępów do pamięci - jeden na pobranie kodu rozkazu, dwa aby pobrać adres argumentu oraz jeden aby pobrać argument;

    2. LDX $17 - załaduj rejestr X dwoma bajtami kolejno począwszy od adresu $17 heksalnie. W tym rozkazie również wymagane są 4 dostępy do pamięci - jeden do pobrania kodu rozkazu, jeden do pobrania adresu okrojonego do przesunięcia w obrębie pierwszych 256 bajtów oraz dwa do pobrania z tego adresu argumentu, który ma być wpisany do rejestru X.

    Tryb adresowania indeksowego i względnego. Adresacja indeksowa to nic innego jak złożenie adresu argumentu rozkazu z dwóch wartości. Bazą jest zawartość wskazanego rejestru indeksowego, natomiast przesunięcie w stosunku do tego adresu będzie argumentem rozkazu.

    1. LDAA OFFSET,X - zapisz akumulator A zawartością miejsca pamięci, którego adres jest sumą zawartości rejestru X i przesunięcia podanego w rozkazie (OFFSET). Będą potrzebne co najmniej 3 dostępy do pamięci (4 - gdy będzie to rozkaz z udziałem rejestru Y) - jeden do pobrania kodu rozkazu, jeden do pobrania przesunięcia. Teraz procesor dokona wyliczenia sumy zawartości rejestru X i przesunięcia i następnie w kolejnym dostępie do pamięci jest pobierany argument, który ma być wpisany do akumulatora.

    Tryb adresowania względny. Wykorzystywany jest w rozkazach typu BRENCH (skocz lokalnie). Oznacza to przesunięcie miejsca w stosunku do licznika rozkazów w chwili zakończenia wykonywania programu. Przesunięcie będzie liczone w stosunku do pierwszego wolnego miejsca, które wystąpi po kodzie rozkazu. Jeżeli rozkaz zajmuje 1 bajt, to wielkość przesunięcia również będzie wynosić 1 bajt.

    1. Podstawowe elementy budowy mikroprocesora Motoroli

    W mikrokontrolerze Motoroli wbudowane są następujące układy:

    Nóżki są współdzielone, w różnych trybach pracy różnego rodzaju bity statusowe (rejestr warunków CC) określają w jakim stanie dana nóżka ma się znajdować.

    W mikrokontrolerze występują porty, które mogą spełniać różnego rodzaju alternatywne funkcje. Zmiany standardowego przeznaczenia portów dokonujemy poprzez odpowiednią konfigurację mikrokontrolera zapisując odpowiednie wartości w rejestrach konfiguracyjnych, które są umieszczone w przestrzeni 64 bajtów począwszy standardowo od adresu $1000. W inicjalizacji standardowej porty te mają następujące przeznaczenia:

        1. Port A - jest portem mającym 4 wejścia (IC - input capture), które służą do obserwacji i rejestracji przede wszystkim zmiany poziomu zbocza sygnału impulsowego. Jeżeli port ten ma 4 wejścia, to musi posiadać także 4 wyjścia (OC - output compare). Układ może być skonfigurowany na 2 sposoby. Pierwszy z nich to 4 x IC + 4 x OC. Drugi to 4 x OC + 3 x IC + PC (pulse accumulator). PC - czyli licznik impulsów wejściowych może być zamieniony na piąte wyjście OC. Jeżeli port A zostanie zaprogramowany do pracy jako specyficzny układ do analizowania impulsów zewnętrznych lub do ich porównywania, to jest on standardowym wejściem/wyjściem.

        2. Porty B i C - jeżeli nie są specyficznie skonfigurowane, to są zwykłymi portami. Port B - wyjściowy, port C - dwukierunkowy i równoległy. W przypadku, gdy cały mikrokontroler pracuje w trybie expanded (rozszerzonym) jest to ten tryb pracy, w którym możemy doczepić do mikrokontrolera zewnętrzną pamięć ROM i uruchamiać z niej programy, po to aby przetestować ich działanie zanim zostaną one na sztywno wsadzone do pamięci wbudowanej mikrokontrolera. W przypadku tego trybu port B jest ośmioma bardziej znaczącymi bitami adresu, a port C, w zależności od momentu cyklu rozkazowego albo ośmioma mniej znaczącymi bitami adresu, albo dwukierunkową szyną danych (8-bitową), gdzie dane możemy wpisywać lub odczytywać z mikrokontrolera.

        3. Port D - pełni on 3 funkcje: