Jeśli 32- bitowy procesor może obsłużyć około 4 GiB pamięci RAM (tj. ) bajtów, to dlaczego mój Arduino Mega 2560 ma 8 KiB SRAM, jeśli bycie 8- bitowym procesorem pozwala mu obsłużyć tylko 256 bajtów ( )? A może źle czytam następującą stronę?2 8
Jeśli 32- bitowy procesor może obsłużyć około 4 GiB pamięci RAM (tj. ) bajtów, to dlaczego mój Arduino Mega 2560 ma 8 KiB SRAM, jeśli bycie 8- bitowym procesorem pozwala mu obsłużyć tylko 256 bajtów ( )? A może źle czytam następującą stronę?2 8
Odpowiedzi:
Większość 8-bitowych procesorów ma 16-bitowe magistrale adresowe, co pozwala im adresować 64 KB, właśnie dlatego, że 256 bajtów naprawdę nie wystarczy do zrobienia bardzo dużo! Oznacza to po prostu, że muszą załadować dwa bajty zamiast jednego, za każdym razem, gdy muszą załadować adres. Nieco wolniejszy, ale tolerowany, biorąc pod uwagę ich rozmiar.
(I tak, istnieje wiele wyjątków, głównie opracowanych, gdy 64k stało się zbyt małe, ale mówimy tutaj o podstawowej idei).
Autobus adres i magistrala danych są oddzielone więc mogą one mieć różne rozmiary. Dla każdego konkretnego rozmiaru magistrali adresowej istnieje wiele technik adresowania większej ilości pamięci niż szerokość bitu rejestru
Najczęstszym sposobem jest jakoś zwiększenie szerokości magistrali adresowej
za pomocą wielu rejestrów dla adresu
X
, Y
i Z
dane do rejestrów adresowania zapewnić maksymalną 64 KB RAM. Ci z kolei mogą być połączone z RAMPX
, RAMPY
, RAMPZ
aby uzyskać dostęp do wyższych adresów pamięci RAM w jeszcze większych wersjach. Ma również SPH
dla wysokich bajtów wskaźnika stosu oprócz SPL
wariantów z ponad 256 bajtami pamięci RAM 1H
& L
, B
& C
, D
i E
które mogą być używane razem jako 16-bitowy rejestr adresówza pomocą jednego dużego specjalnego rejestru większego niż naturalny rozmiar do adresowania
za pomocą specjalnego rejestru dla górnej części adresu . Podczas adresowania pewnej pamięci domyślnie 8 niskich bitów adresu zostanie pobranych z 8-bitowego rejestru bezpośredniego lub 8-bitowego na 8-bitowym mikrokontrolerze, podczas gdy wysokie bity zostaną zastąpione wartością drugiego rejestru adresu.
call
lub goto
instrukcji 8 lub 9 niskich bitów adresu jest wskazywanych przez znak natychmiastowy, a pozostałe są pobierane z bieżącego licznika programu. Dlatego dostęp do czegokolwiek w pobliżu bieżącego segmentu wymaga tylko 1 instrukcji, podczas gdy dalsze adresy będą wymagały 2 instrukcji (aby ustawić wysokie bity).PC
bezwarunkowego skoku.Innym sposobem na osiągnięcie tego jest bankowość pamięci . Jest to przydatna metoda, która jest nadal stosowana w niektórych architekturach. W tym modelu pamięć jest podzielona na wiele banków . Za każdym razem możesz skontaktować się tylko z określonym bankiem. Często istnieje globalny bank lub zakres adresów, które są zawsze widoczne w dowolnym momencie, ale w przypadku innych części należy zmienić bank w razie potrzeby.
Istnieje również niezbyt popularna technika, ale można ją znaleźć w Intel 8051 . Jako mikrokontroler z 8-bitowym adresem danych może mieć maksymalnie 256 adresów. Połowa miejsca (część wysoka) jest wykorzystywana dla rejestrów funkcji specjalnych ( SFR ), ograniczając rzeczywistą pamięć RAM adresowalną tylko do 128 bajtów. Jednak nowi producenci serii 8051 znaleźli sprytny sposób na rozwiązanie tego problemu poprzez oddzielenie dostępu do pamięci . Adresowanie bezpośrednie uzyska dostęp do SFR, natomiast adresowanie pośrednie, ale rejestry będą uzyskiwać dostęp do dużej części pamięci RAM, co oznacza, że teraz masz 256 + 128 = 384 bajtów adresowalnych.
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
Najmniejsze rdzenie mają ≤256 bajtów przestrzeni adresowej danych (co oznacza ≤128 bajtów RAM po usunięciu portów I / O i innych zarezerwowanych adresów) i ≤ 8192 bajtów (8 KiB) pamięci ROM programu. Mają one tylko 8-bitowy wskaźnik stosu (w SPL) i obsługują tylko 12-bitowe względne instrukcje skoku / wywołania RJMP / RCALL. (Ponieważ licznik programu AVR zlicza 16-bitowe słowa, a nie bajty, 12-bitowe przesunięcie jest wystarczające, aby adresować 213 bajty ROM.)
Dodatkowe funkcje adresowania pamięci są wymagane w celu uzyskania dostępu do dostępnych zasobów:
- Modele z> 256 bajtami przestrzeni adresowej danych (≥256 bajtów pamięci RAM) mają 16-bitowy wskaźnik stosu, z wysoką połową w rejestrze SPH.
- Modele z> 8 KiB ROM dodają 2-wyrazowe (22-bitowe) instrukcje JUMP i CALL. (Niektóre wczesne modele ulegają błędowi, jeśli po instrukcji pominięcia następuje instrukcja składająca się z dwóch słów).
- Modele z> 64 KiB ROM dodają instrukcję ELPM i odpowiedni rejestr RAMPZ. Instrukcje LPM zwiększają zero adres ROM w Z; Instrukcje ELPM poprzedzają rejestr RAMPZ dla dużych bitów. To nie to samo, co ogólniejsza instrukcja LPM; istnieją „klasyczne” modele z tylko ELPM w postaci zerotargowej (ATmega103 i at43usb320). Gdy dostępna jest funkcja automatycznego przyrostu (większość modeli), aktualizuje cały 24-bitowy adres, w tym RAMPZ.
- Modele (rzadkie) z> 128 KiB ROM mają 3-bajtowy licznik programów. Wywołania i powroty podprogramów wykorzystują dodatkowy bajt przestrzeni stosu, istnieje nowy rejestr EIND, który zapewnia dodatkowe wysokie bity dla skoków i wywołań indireect, a także nowe rozszerzone instrukcje EIJMP i EICALL, które używają EIND: Z jako adresu docelowego. (Poprzednie instrukcje IJMP i ICALL używają Z o rozszerzeniu zera).
- Modele (rzadkie) z> 64 KiB przestrzeni adresowej RAM rozszerzają 16-bitowe limity adresowania RAM za pomocą rejestrów RAMPX, RAMPY, RAMPZ i RAMPD. Zapewniają one dodatkowe wysokie bity dla trybów adresowania, które wykorzystują odpowiednio pary rejestrów X, Y lub Z, lub instrukcje bezpośredniego adresowania LDS / STS. W przeciwieństwie do dostępu do ROM, nie ma wyraźnych instrukcji „rozszerzonych”; zamiast tego rejestry RAMP są używane bezwarunkowo.
Prawie wszystkie 8-bitowe procesory mają pewną zdolność do utworzenia 16-bitowego adresu z części niskiego rzędu i części wysokiego rzędu. Na niektórych procesorach, w tym na oryginalnym 8080, istnieją rejestry dedykowane do utrzymywania górnej i dolnej części adresu (chociaż z punktu widzenia programisty mogą istnieć niektóre rejestry, takie jak wskaźnik stosu 8080, który nie oferuje instrukcji, aby adresować je osobno). W niektórych innych procesorach nie ma rejestrów poświęconych górnej lub dolnej połowie adresu, ale adresy są gromadzone „w locie”. Na przykład w 6502 instrukcja „LDA 1234 $, X” ładuje akumulator adresem utworzonym przez dodanie 1234 $ do 8-bitowego rejestru X [przypuśćmy, że zawiera $ F0]. Wykonanie tej instrukcji przebiegałoby w 4 lub 5 krokach:
Przeniesienie odczytanego bajtu do akumulatora nakłada się na pobranie następnej instrukcji. Ponadto w przypadku wielu operacji, jeżeli krok 3 nie wygenerował przeniesienia, krok 4 odczytałby poprawny adres, a wykonanie mogłoby przejść bezpośrednio od kroku 4 do następnej instrukcji, omijając krok 5.
Jeśli przeanalizujemy sekwencję operacji, zauważymy, że architektura little-endian ma wyraźną przewagę nad architekturą big-endian, w tym w większości przypadków (choć nie pokazana), mimo że ALU wykonuje cykl w celu wykonania dodatkowo możliwe jest odczytanie bajtu z obliczonego adresu bez czekania na wynik ALU, ponieważ zwykle pobrany bajt wysoki będzie bajtem operandu docelowego. Na maszynie typu big-endian z 8-bitowym ALU obciążenie indeksowane zajęłoby co najmniej 5 cykli (ponieważ dolna połowa adresu nie byłaby odczytana aż do kroku 3, a zatem zostałaby obliczona w kroku 4).
Linie magistrali danych (piny) i linie adresu (piny) są całkowicie oddzielne. Mówiąc najprościej, linie magistrali określają maksymalną liczbę bitów, które mogą być przesyłane pojedynczo (i przechowywane w pamięci), podczas gdy linie adresowe określają maksymalną liczbę „komórek” pamięci, które można wybrać.
Było to głównie kwestia marketingowa, że 32-bitowe procesory x86 nie były w stanie obsłużyć więcej niż 4 GB pamięci RAM. Pamiętam gdzieś, że na procesorach Pentium 4 były piny A33-34.
Często jest prawdą, że istnieje pewien związek między wielkością pamięci adresowalnej a wielkością rejestru wewnętrznego, chociaż związek ten jest różny z różnych powodów. 256 bajtów przestrzeni adresowej było uważane za zbyt małe nawet w bardzo wczesnych dniach mikroprocesorów, więc większość ośmiobitowych procesorów wytwarzała 16-bitowe (dwa bajty) adresy, które adresowały 64 kilobajty. Jednak dzięki przełączaniu banków (zasadniczo wykorzystując pewne linie we / wy do wytworzenia jeszcze większej liczby linii adresowych) możliwe było uzyskanie znacznie więcej.
W pierwszych 16 i 32-bitowych procesorach urządzenie nie zawsze miało wystarczającą liczbę pinów, aby uzyskać dostęp do całej przestrzeni, którą mogłyby adresować ich wewnętrzne rejestry adresowe. Na przykład w telefonie Motorola 68000 było tylko wystarczającej liczby pinów adresu (24), aby zaadresować 16 megabajtów pamięci RAM, chociaż wewnętrzne rejestry adresów miały szerokość 32 bitów.
Odpowiem na to pytanie specjalnie dla wspomnianych kontrolerów AVR. Podstawowa zasada obowiązuje również w przypadku wielu innych architektur 8-bitowych.
AVR to 8-bitowe rdzenie. Oznacza to, że mają 8-bitowe rejestry. Jednak 8 bitów nie wystarczy, aby uzyskać dostęp do użytecznej ilości pamięci. Dlatego rdzeń AVR może używać określonego zestawu rejestrów połączonych jako 16-bitowe rejestry wskaźników. Rejestry r30 i r31 (również aliasowane jako ZL i ZH) są tego przykładem. Razem tworzą wskaźnik Z.
W zestawie odczytanie bajtu pod adresem 0x1234 wygląda następująco:
ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z ; Load byte to r16
Rodzina AVR ma 3 pary rejestrów, których można użyć do tego. Są one specjalnie zaprojektowane sprzętowo, aby umożliwić takie operacje.
Podczas programowania w języku wyższego poziomu, takim jak C, kompilator obsługuje te rzeczy.
Uwaga: Niektóre AVR obsługują nawet większe rozmiary pamięci niż 64 KB. Kontrolery te mają specjalny rejestr funkcji, w którym dodatkowe bity adresu są zapisywane przed dostępem. Adres składa się zatem z następujących bitów (MSB do LSB):
Rejestr funkcji specjalnych (zwykle 1 bajt), ZH (8 bitów), ZL (8 bitów).
8-bitowe AVR Atmela faktycznie używają 16-bitowego adresu danych. Mają wiele innych 16-bitowych rejestrów, a nawet około 16-bitowych timerów. Ponieważ jest to tylko 8-bitowy procesor, zwykle używa dwóch cykli zegara do załadowania rejestru 16-bitowego.
Wikipedia całkiem dobrze to wyjaśnia:
8-bitowe procesory używają 8-bitowej magistrali danych, dzięki czemu mogą uzyskiwać dostęp do 8 bitów danych w pojedynczej instrukcji maszyny. Magistrala adresowa ma zwykle szerokość podwójnego oktetu (tj. 16 bitów), ze względów praktycznych i ekonomicznych. Oznacza to bezpośrednią przestrzeń adresową o wielkości zaledwie 64 KB na większości procesorów 8-bitowych.
Pojęcie, że „szerokość bitów” procesora określa maksymalną ilość pamięci RAM, którą procesor może rozwiązać, jest jednym z najbardziej rozpowszechnionych mitów w przetwarzaniu. W rzeczywistości historia branży jest zaśmiecona procesorami, dla których ta relacja nie miała miejsca.
HP 21MX, HP 1000: 16-bitowy procesor, pamięć do 16 MB
PDP-11: 16-bitowy procesor, pamięć do 4 MB
VAX-11/780: 32-bitowy procesor, pamięć do 512 MB
itd itd.