Jednostka centralna procesor (CPU, rdzeń) Schemat blokowy procesora rdzeniowego ATmega16 Głównym zadaniem JC jest zapewnienie poprawnego i szybkiego wykonywania programu.
Zadania JC: dostęp do pamięci, wykonywanie operacji arytmetycznych, logicznych, itp. (ALU) sterowanie układami peryferyjnymi, obsługa przerwań. Działanie JC polega na cyklicznym wykonaniu instrukcji zawartych w programie użytkownika przechowywanym w pamięci. Lista instrukcji jest z góry określona dla danego mk. Pojedyncza instrukcja składa się z kodu operacji (kodu rozkazu) oraz jednego lub kilku argumentów. Cykl wykonania instrukcji: wczytanie do wewnętrznych rejestrów JC kolejnego rozkazu, pobranie z pamięci i umieszczenie w odpowiednich wewnętrznych rejestrach JC niezbędnych argumentów rozkazu (o ile są potrzebne), wykonanie instrukcji ALU + układ sterowania
Jednostka arytmetyczno-logiczna ALU Operacje jednostki ALU: działania arytmetyczne - dodawanie + - odejmowanie - porównywanie liczb - zmiana znaku działania logiczne - suma (OR) - iloczyn (AND) - suma modulo 2 (XOR) - negacja przesunięcia w lewo i prawo działania na bitach - ustawienie bitu - zerowanie bitu - testowanie bitu - negacja bitu
Tryby adresowania: Adresowanie natychmiastowe operand (argument) jest podany w jawnej postaci w kodzie instrukcji. Tryb ten może być używany wyłącznie w odniesieniu do stałych zapisanych w kodzie programu. Adresowanie bezpośrednie adres argumentu (umieszczonego w pamięci danych) znajduje się bezpośrednio po kodzie rozkazu. Adresowanie indeksowe polega na obliczeniu adresu przez sumowanie zawartości specjalnie przeznaczonego do indeksowania rejestru, nazywanego rejestrem indeksowym, z adresem bezpośrednim, zapisanym w instrukcji. Obliczony w ten sposób adres fizyczny pamięci nazywany jest adresem efektywnym. Adresowanie to jest szczególnie użyteczne przy operowaniu na blokach danych. Umieszczając w instrukcji adres początku bloku danych można uzyskać wygodny dostęp do kolejnych bajtów danych przez tylko samą zmianę zawartości rejestru indeksowego. Adresowanie pośrednie część adresowa instrukcji wskazuje na komórkę pamięci zawierającą adres efektywny. Adresowanie zawartością rejestrów (odmiana adresacji pośredniej) adres efektywny jest zawarty w przeznaczonym do tego celu rejestrze lub parze rejestrów; identyfikacja tych rejestrów odbywa się na podstawie słowa rozkazowego. Adresowanie względne adres efektywny uzyskiwany jest jako suma części adresowej rozkazu i adresu aktualnie wykonywanej instrukcji zapisanego w tzw. liczniku programu (rozkazów); wykorzystywane w instrukcjach skoków.
Architektury procesorów Architektury procesorów rdzeniowych można sklasyfikować według: typu mapy pamięci typu listy instrukcji. Mapa pamięci w sposób graficzny przedstawia rozmieszczenie poszczególnych pamięci w przestrzeni adresowej JC. Oprócz adresów obszarów RAM, ROM i innych rodzajów pamięci, mapa ta podaje usytuowanie rejestrów uniwersalnych, adresów procedur obsługi przerwań, rejestrów układów we/wy. Przestrzeń adresowa pamięci danych Przestrzeń adresowa pamięci programu W zależności od typu struktury mapy pamięci, procesory rdzeniowe mogą mieć następującą architekturę: architekturę harwardzką, architekturę Von-Neumanna.
Architektura harwardzka: dwie oddzielne magistrale (szyny) dla danych i rozkazów, dzięki czemu w trakcie pobierania argumentów wykonywanej właśnie instrukcji można równocześnie zacząć pobieranie następnego słowa rozkazowego. Skraca to cykl rozkazowy i zwiększa szybkość pracy. Obszary adresowe pamięci danych i programu są rozdzielone. W efekcie mamy niejednoznaczność adresów - JC pod tym samym adresem widzi pamięć RAM i ROM - stosuje się inne rozkazy dla pamięci programu i inne dla pamięci danych. magistrala danych i rozkazów mają różną szerokość (długość słowa). Wada - utrudniony przepływ danych z pamięci programu do obszaru pamięci operacyjnej - nie jest możliwe indeksowane przesłanie danych z pamięci ROM do RAM, co oznacza np. brak możliwości budowy tabel współczynników stałych w pamięci ROM. Modyfikacje architektury harwardzkiej: szerokość magistrali programu jest krotnością szerokości magistrali danych, (dla AVR magistrala danych jest 8-bitowa, a programu 16-bitowa (2 * 8 bitów). wprowadza się dodatkowe bloki pośredniczące w wymianie danych między pamięcią programu a pamięcią danych. rozszerza się listę instrukcji o dodatkowe polecenia obsługujące transfer danych z/do pamięci programu, np. rozkaz Load Program Memory LPM.
Architektura Von-Neumanna: jednolita przestrzeń adresowa - wszystkie pamięci, rejestry i układy we/wy są umieszczone w jednej, wspólnej przestrzeni adresowej. Zakłada się, że podział przestrzeni adresowej na pamięć programu, pamięć danych oraz obszar we/wy jest umowny i zależy wyłącznie od rozmieszczenia tych elementów w obszarze adresowym podczas projektowania systemu. jedna wspólna magistrala dla danych i programu - ułatwione programowanie, dostęp do danych, programu i urządzeń we/wy odbywa się przy użyciu zunifikowanych rozkazów wykorzystujących te same tryby adresowania - nie istnieje potrzeba wprowadzania specjalnych rozkazów pozwalających na przepływ danych pomiędzy pamięcią ROM i RAM - tworzenie tablic stałych, tablicy wektorów, itp. w pamięci ROM nie stanowi problemu. wykonanie instrukcji wymaga kilku przesłań danych (najpierw bajt z kodem rozkazu, a po nim bajty z argumentami) po wspólnej magistrali, co czyni tę architekturę zdecydowanie wolniejszą od harwardzkiej.
Podział architektur procesorów ze względu na typ listy instrukcji: architektura RISC (reduced instruction set computer), architektura CISC (complex instruction set computer). Architektura RISC - o zredukowanej liście instrukcji : procesor jest zbudowany zgodnie z architekturą harwardzką, procesor wykorzystuje przetwarzanie potokowe (pipeling) w celu zwiększenia szybkości wykonywania programu, zbiór realizowanych instrukcji jest ograniczony i spełnia warunki ortogonalności (symetrii). Przetwarzanie potokowe polega na jednoczesnym wykonywaniu danej instrukcji i pobieraniu pamięci programu kodu następnej instrukcji - zamiast prostego rejestru instrukcji stosuje się pamięć FIFO (firstin first-out), która gromadzi kolejkę instrukcji. Przetwarzanie potokowe
Ortogonalność to unifikacja instrukcji według następujących zasad: każda instrukcja może operować na dowolnym rejestrze roboczym - procesor nie ma specjalizowanych rejestrów do wykonywania określonych rodzajów operacji, każda instrukcja może wykorzystywać dowolny tryb adresowania argumentów, nie ma ukrytych związków między instrukcjami (efektów ubocznych), które powodowałyby nieprzewidziane reakcje systemu w zależności od kontekstu użycia rozkazów w programie, kody rozkazów i formaty instrukcji są zunifikowane - instrukcje zajmują w pamięci programu taką samą liczbę bajtów. Ortogonalność upraszcza budowę układu sterowania identyczny algorytm dla wykonania każdego rozkazu - skrócenie cyklu rozkazowego. Klasyczna architektura RISC jest stosowana rzadko. Najczęściej można znaleźć elementy tej architektury, ale ortogonalność instrukcji nie jest zwykle pełna. Architektura CISC charakteryzuje się rozbudowaną liczbą instrukcji (często powyżej 100). Przeciwstawia się ją architekturze RISC. Cecha ortogonalności nie jest zachowana. Instrukcje są wąsko specjalizowane, współpracują na ogół tylko z określonymi rejestrami i wymagają stosowania określonych trybów adresowania.
Pamięci Typy pamięci: pamięć programu (kod programu, tablice stałych, wektor resetu i wektory przerwań), pamięć danych (przechowująca zmienne), stos sprzętowy (procedury obsługi przerwań i wywołań funkcji odkładają na niego bieżącą wartość licznika rozkazów i po zakończeniu działania zdejmują ją) w pamięci danych, pamięć EEPROM (przechowuje zmienne lub tablice stałych, które po wyłączeniu zasilania nie mogą ulec skasowaniu trzeba ją traktować jak układ peryferyjny). Pamięć programu jest wykonana w technologii FLASH (kiedyś w technologiach ROM, EPROM). Natomiast pamięć danych najczęściej jest typu SRAM.
Pamięci trwałe ROM (Read Only Memory) programowanie zawartości pamięci następuje w procesie produkcyjnym i nie może być przeprowadzone przez użytkownika. EPROM (Erasable Programmable ROM) pamięci z możliwością kasowania dotychczasowej zawartości promieniami ultrafioletowymi i prowadzania nowej zawartości za pomocą zewnętrznego programatora. Umieszczane są w obudowach z okienkiem kwarcowym w celu umożliwienia kasowania. OTP (One Time Programmable) pamięci typu EPROM umieszczane w obudowach bez okienka kwarcowego. Dlatego mosliwe jest tylko jednokrotne zaprogramowanie pamięci bez możliwości skasowanie jej zawartości. FLASH (Bulk Erasable Non-Volatile Memory) pamięci z możliwością kasowanie zawartości i programowania bezpośrednio w systemie mikroprocesorowym. Pamięci nietrwałe: SRAM (Static Random Access Memory) pamięci RAM statyczne. Są to pamięci o krótkich czasach dostępu, prostsze w obsłudze przez jednostkę centralną, ale droższe. DRAM (Dynamic Random Access Memory) pamięci RAM dynamiczne. Są to pamięci tańsze, ale ich obsługa przez jednostkę centralną jest bardziej skomplikowana. Polega to na konieczności wykonywania w krótkich odstępach czasu określonych operacji na pamięci (tzw. odświeżaniu). W przeciwnym razie dane zawarte w pamięci dynamicznej zanikają.
Pamięć danych mk ATmega Rejestry ogólnego przeznaczenia Blok szybkiego dostępu zawiera 32 rejestry robocze o jednocyklowym czasie dostępu. Jednostka ALU umożliwia wykonywanie operacji arytmetycznych i logicznych między rejestrami, miedzy stałą a rejestrem, oraz także operacji na pojedynczym rejestrze. Po wykonaniu operacji uaktualniany jest rejestr statusowy SREG dający informacje o rezultacie. Dla typowej operacji, w jednym cyklu zegara dwa argumenty ALU są wystawiane z bloku rejestrów, wykonywana jest operacja, a wynik jest umieszczany z powrotem w bloku rejestrów.
Sześć ostatnich rejestrów roboczych (R26-R32) może być używane jako trzy 16-bitowe rejestry wskaźnikowe (X, Y, Z) w trybie adresowania indeksowego. Daje to możliwość wykonywania szybkich przeliczeń danych. Jeden z tych trzech wskaźników adresu (Z) może być użyty jako wskaźnik adresu w tzw. lookup tables w pamięci flash programu.
Przestrzeń wejścia-wyjścia Służy do przechowywania rejestrów funkcyjnych (specjalnych), dostarczających informacji o aktualnym stanie mk oraz umożliwiających sterowanie pracą procesora i wewnętrznych układów peryferyjnych. Moduł przerwań ma również swoje rejestry kontrolne w przestrzeni I/O z dodatkowym globalnym bitem odblokowującym przerwania w rejestrze statusowym SREG. Wszystkie przerwania mają osobny wektor przerwania w tablicy wektorów przerwań. Przerwania mają priorytet zależny od pozycji wektora. Im niższy adres wektora przerwań, tym wyższy jest priorytet dla danego przerwania.
Rejestr statusowy SREG - rejestr znaczników (flag) C bit przeniesienia lub pożyczki; ustawiany gdy wynik nie mieści się w 8-miu bitach ( przy dodawaniu) lub występuje pożyczka przy odejmowaniu, Z znacznik wartości zerowej; ustawiany, gdy wynik ostatniej operacji jest równy zero, N znacznik wartości ujemnej; jest kopią najstarszego bitu wyniku w kodzie U2 (1-wartość ujemna, 0-wartość dodatnia) V znacznik przepełnienia w U2; S bit znaku; S=1 gdy wynik jest jawnie ujemny i nie nastąpiło przepełnienie. S=N ex-or V H znacznik przepełnienia połówkowego (BCD) T rejestr bitowy; przydatny przy kopiowaniu bitów I znacznik globalnego zezwolenia na przerwanie; 1 przerwania załączone (SEI) ; 0 przerwania wyłączone (CLI). Znacznik I jest automatycznie zerowany po wejściu do procedury obsługi przerwania i ustawiany po wyjściu z niej wskutek wykonania rozkazu RETI. Znaczniki są modyfikowane przez procesor po wykonaniu każdego rozkazu.
Wewnętrzna pamięć SRAM Służy do przechowywania zmiennych programowych. Dostęp do pamięci SRAM trwa dwa cykle zegarowe, jednak nie można przeprowadzać na niej operacji arytmetyczno- logicznych w sposób bezpośredni. Stos Stos zajmuje obszar pamięci SRAM, więc jego rozmiar jest ograniczony wielkością tej pamięci. Podczas przerwań i wywołań procedur podrzędnych zmienne lokalne oraz adres powrotny licznika programu jest przechowywany w pamięci stosu. Każdy program musi zainicjalizować wskaźnik stosu SP w procedurze obsługi resetu, zanim zostanie wywołana obsługa przerwania czy podprocedura.
Pamięć programu Pamięć programu może być podzielona na dwie sekcje: sekcję programu bootującego, oraz sekcję programu aplikacji. Obie części mają indywidualne bity bezpieczeństwa (Lock bits) do zabezpieczenia przed odczytem i nadpisaniem zawartości (np. przez programator). Program sekcji bootującej może służyć np. do aktualizacji oprogramowania systemu, gdyż tylko z tej części pamięci programu może być wykonywana instrukcja SPM nadpisująca pamięć flash aplikacji. Większość instrukcji AVR ma format pojedynczego 16-bitowego słowa. Każdy adres pamięci programu zawiera 16 lub 32-bitową instrukcję.