Dlaczego każdy adres w mikrokontrolerze ma tylko 8 bitów?

18

Widziałem, że w 32-bitowym mikrokontrolerze każdy adres pamięci mieści tylko 8 bitów danych; to samo dotyczy 16-bitowego MC. W przypadku danych 32-bitowych wykorzystuje kombinację 4 adresów. Dlaczego adres nie może bezpośrednio przechowywać 32-bitowych danych (co oznacza, że ​​32 bity lub 16 zamiast 8)?

Arun Joe Cheriyan
źródło
2
Zależy to od szyny danych mikrokontrolera. Który 32-bitowy mikrokontroler ma pamięć bajtową? Czy masz jakiś przykład?
Swanand
4
Po prostu nieprawda, dlatego języki programowania, takie jak C i C ++, zawierają możliwość, aby bajt był większy niż 8 bitów. Po prostu większość działa najlepiej z 8-bitowymi bajtami, ale dostępne są 9-bitowe lub 18-bitowe.
PlasmaHH
6
To jak batoniki. Stale zmniejszają je za tę samą cenę.
Olin Lathrop,
4
Czy można sformułować to pytanie „Dlaczego wszystkie adresy są wyrównane do 8 bitów”?
Florian Castellane
2
@FlorianCastellane This. Adresy nie mają wielkości 8 bitów (chyba że znajdziesz urządzenie z <256 bitami pamięci, to mogą być).
jayjay

Odpowiedzi:

11

Jest to faktycznie wybór projektowy, nie ma twardego powodu, aby tak było. W dawnych czasach, kiedy procesory towarowe o dużej objętości działały na 8-bitowych wartościach, mapowanie było bardziej spójne 1: 1. Aby zachować spójność, w miarę jak projekty ewoluowały do ​​nowoczesnych procesorów 32- i 64-bitowych, sensowne było zachowanie starszego mapowania adresowania bajtów, nawet pomimo wzrostu ilości magistrali danych (ze zmieniającym się kosztem wdrożenia). Niektóre 32-bitowe jednostki MCU mogą nadal implementować tylko 16-bitowe magistrale danych do niektórych pamięci, procesory high-end będą miały 256-bitowe lub więcej i są w stanie załadować wiele rejestrów rdzeniowych w jednej transakcji pamięci. Szerokie interfejsy są dobre do operacji seryjnych lub strumieniowych.

Mały rozmiar pamięci adresowalnej jest użyteczny nie tylko w przypadku obsługi wartości bajtów w kodzie, ale także do pracy ze strukturami w pamięci, takimi jak pakiety ethernetowe, w których należy odczytać lub zmodyfikować określone bajty. Często tego rodzaju operacje muszą być w stanie wykonywać małe operacje, ale bardzo wydajnie.

Istnieją również scenariusze, w których konieczne jest działanie z danymi big-endian, little-endian lub mieszanymi endianami. Obecnie często zapewnia się dedykowane wsparcie sprzętowe, ale ponownie bajtowe adresowanie pamięci sprawi, że tego typu operacje będą bardziej wydajne w niektórych scenariuszach.

Całkiem niedawno liczba bitów adresu w rejestrze była czynnikiem ograniczającym przestrzeń adresową, więc marnowanie 2 bitów na bajty adresowe zamiast 32-bitowych słów nie stanowiło większego problemu 10-15 lat temu (i teraz z 64-bitowymi wskaźnikami, często stosuje się bajty o szerokości 48 lub 56 bitów). Wstępne nauczanie informatyki jest nadal trochę utknięte w erze komputerów typu mainframe i nie zawsze bardzo wyraźnie odnosi się do aspektów ewolucji. Wiele terminologii pojawiło się w użyciu (i definicji) w czasie, gdy niskokosztowe, kosztowne architektury (w najogólniejszym znaczeniu tego słowa) zaczęły być uzupełniane przez bardziej ograniczone zasoby i bardziej ukierunkowane na towary projekty procesorów.

Nie odpowiedziałem konkretnie na MCU, granice architektury nie są tak jasne, jak można się domyślać. Nawet nowoczesna podstawowa konstrukcja MCU ma duże szanse na integrację z wielordzeniowym procesorem serwerowym lub istnieje tylko jako jeden punkt w skalowalnym zestawie produktów; w obu przypadkach spójne podejście do dostępu do pamięci jest korzystne dla użytkownika końcowego, który musi pisać lub przenosić kod.

Zadałem pytanie na temat retrocomputing SE dotyczące rozmiarów rejestrów, aby śledzić historyczne aspekty tego pytania.

Sean Houlihane
źródło
2
Myślę, że procesory o dłuższych rozmiarach słów były wcześniejsze niż procesory 8-bitowe. 8-bitowy procesor byłby całkiem bezużyteczny bez skutecznego dodawania dwóch liczb wielobajtowych, a wczesne procesory nie byłyby w stanie skutecznie obsługiwać liczb większych niż jedno słowo maszynowe.
supercat
1
Pracowałem z 8-bitowymi procesorami na tyle, aby wiedzieć, że mogą one z łatwością dodawać liczby wielobajtowe, ale nie z pojedynczą instrukcją procesora. Najpierw dodaj dwa najniższe bajty i uzyskaj najniższy bajt wyniku oraz oddzielny bit przenoszenia. W przypadku tylu innych bajtów dodaj kolejne bajty wejściowe i bit przeniesienia z poprzedniego kroku, podając następny bajt wyjściowy i następny bit przeniesienia. Jeśli nie ma już bajtów wejściowych, zamień ostatni bit przenoszenia na jeszcze jeden bajt wyjściowy.
user6030,
@ user6030: Czy to nie jest często mieć instrukcję ADC? AVR działa (8-bitowy mikrokontroler RISC, więc gcc musi używać ADC dla intilong ), podobnie jak x86, podobnie ARM. Zakładam, że większość procesorów 8-bitowych byłaby, ponieważ byłoby na nią jeszcze więcej zapotrzebowania niż w systemie z szerszymi regami. Och, czy supercat mówi, że wczesnym procesorom brakowało wydajnego ADC?
Peter Cordes
Myślę, że to słuszna kwestia dotycząca ewolucji wielkości rejestrów (chociaż brakuje mi danych)
Sean Houlihane,
25

Istnieje kilka procesorów DSP (np. TI C54x), które nie mogą adresować wartości mniejszych niż 16 bitów, a niektóre procesory DSP audio używają 24 bitów. Jednak 8-bitowe wartości są używane w prawie całym kodzie ogólnego przeznaczenia, więc wszystkie procesory ogólnego przeznaczenia go obsługują.

I właśnie dlatego, że mała jednostka używana do adresów pamięci ma 8-bitowe bajty, nie oznacza, że ​​byłaby to największa jednostka faktycznie używana w magistrali; większość procesorów używa natywnego rozmiaru słowa (16/32 bitów) lub nawet większego rozmiaru do adresowania pamięci, a gdy używa się dostępu do bajtów, automatycznie wyodrębnia bajt z większego słowa.

Na przykład szyna PCI zawsze wykorzystuje transakcje 32-bitowe, ale ma bajtowe sygnały włączające dostęp, które muszą być mniejsze.

CL.
źródło
Dziękuję Ci. czy jest jakieś MC, które ma w pamięci szeroki bajt zamiast bajtu?
Arun Joe Cheriyan
4
Może Intel 4004?
pjc50
6
@ArunCheriyan Przykładem procesora, który działał z najmniejszymi adresowalnymi słowami, jest Saturn : procesor zaprojektowany przez HP i użyty w ich wysokiej klasy kalkulatorach w ostatnim stuleciu (w szczególności dobrze znany HP48). Miał bardzo nietypową architekturę (rejestry 64-bitowe, 4-bitowe ALU, 20-bitowe adresy ...).
przyciemniony
Kolejny przykład: najmniejsza jednostka adresowalna dla TMS TMS320C3x ma 32 bity.
kkrambo
1
@davidcary O, cóż ... Daty i czas nigdy nie były moim mocnym punktem. Zapytaj żonę o jej prezenty urodzinowe, a mój szef o terminy ...
dim
18

16-bitowy lub 32-bitowy mikrokontroler często musi manipulować danymi o szerokości tylko 8 bitów (bajt). Na przykład ciągi tekstowe są zwykle przechowywane z jednym znakiem na bajt. Mając schemat adresowania pamięci, który pozwala na adresowanie każdego bajtu, mikrokontroler może skutecznie przetwarzać dane o szerokości 8 bitów. Oznacza to, że 32-bitowe dane zwykle znajdują się w adresach, które są wielokrotnościami 4 bajtów, np. 04, 08, 0C itp. Ale jeśli pamięć ma 32-bitową szerokość, wówczas mikrokontroler może odczytać 32-bit w jednym cyklu odczytu . Mikro często mają instrukcje maszynowe, które mogą operować na danych o różnej długości, więc przekonasz się, że instrukcja przenoszenia danych (MOV) może mieć 3 formy, MOV.B, MOV.W i MOV.L do przenoszenia 8, 16 i 32 bitów dane w jednej instrukcji.

Steve G.
źródło
7

Podstawowa odpowiedź brzmi „ponieważ tak długi jest bajt”. Przy dużym ugruntowanym kodzie, który przyjmuje to założenie, złamanie go spowodowałoby różnego rodzaju problemy.

Na początku nie było ustalonego kodu. Procesory często używają różnego rodzaju dziwnych architektur, jak pokazują inne odpowiedzi. Zanim jednak pojawiły się 16-bitowe procesory, było wystarczająco dużo kodu zakładającego dostępność 8-bitowych danych, więc brak ułatwienia byłby prawdziwą barierą dla przyjęcia.

Posiadanie jednego 32-bitowego słowa na adres nie ma negatywnego wpływu na szybkość pamięci. W systemie 32-bitowym dolne 2 bity adresu często nie trafiają do pamięci. Procesor zwykle odczytuje całe 32-bitowe słowo i wybiera (lub maskuje) 8-bitowy bajt, którego potrzebuje w tym słowie. Tak długo, jak twoja przestrzeń adresowa może przechowywać wystarczającą ilość danych (ograniczona do 2 ^ 32 bajtów w systemie 32-bitowym), nie martw się. W rzeczywistości na wielu procesorach 16-bitowych / 32-bitowych przetwarzanie wartości bajtów zajmuje więcej czasu niż wartości długości natywnych słów - odczytanie słowa 32-bitowego i usunięcie części tego słowa wyraźnie wymaga dodatkowej operacji, w porównaniu do samego czytania 32-bitowego słowa.

I odwrotnie, jeśli masz system, w którym musisz efektywnie wykorzystywać pamięć, musisz mieć dostęp do poszczególnych bajtów. Jeśli nie możesz, zabraknie ci pamięci. Mając to na uwadze, możliwość odniesienia do poszczególnych bajtów jest wyraźnie konieczna, więc sensowne jest, aby pamięć była podzielona na bajty.

Graham
źródło
3
W rzeczy samej. A potem pojawia się dodatkowe pytanie, czy procesor może obsłużyć dwa różne rodzaje dostępu potrzebne do automatycznego załadowania lub zapisania niezapasowanej 32-bitowej wartości automatycznie w sprzęcie, czy też musi to być jawnie obsługiwane w oprogramowaniu.
Chris Stratton
5

To się nazywa pamięć bajtowa adresowalna . Jest to zwykle dobra rzecz, chyba że zabraknie miejsca na adres (np. 4 GB z 32-bitowymi wskaźnikami, zamiast 16 GB z 32-bitowymi wskaźnikami, gdzie każdy adres jest osobnym 32-bitowym słowem).

Peter Cordes
źródło
Zauważ, że przestrzeń adresowa może przekroczyć takie limity, jeśli podzielisz adresy na części, które zmieszczą się w jednym rejestrze. Kiedyś miałem jakieś 8-bitowe komputery, które osiągnęły 64 KB pamięci, dzieląc adresy na dwie części przechowywane w osobnych rejestrach, i widziałem reklamy komputerów również z 8-bitowymi procesorami, które mogły osiągnąć 1 MB pamięci, dzieląc adresy na trzy Części.
user6030,
AVR (8-bitowy mikrokontroler RISC) robi to: trzy pary 32 8-bitowych rejestrów ogólnego przeznaczenia można wyrejestrować jako 16-bitowy wskaźnik. Istnieje również możliwość połączenia tego z innym segmentem 8-bitowym w celu uzyskania adresów 24-bitowych.
Peter Cordes,
4

32-bitowe procesory DSP urządzeń analogowych Shark mają 32 bity jako najmniejszą jednostkę adresowalnej pamięci, więc sizeof (int) == sizeof (short) == sizeof (char) == 1 (Tak, mają 32-bitowe znaki, idealnie poprawne dla standard C).

Również rzeczy takie jak int_8, int_16 i tym podobne nie są zdefiniowane w, nieprzyjemna niespodzianka przy przenoszeniu kodu z innych platform.

Dan Mills
źródło
1

Rozmiar adresowalnej jednostki pamięci jest zasadniczo kompromisem między ilością pamięci, którą można zaadresować, a ilością pamięci, którą można zmarnować.

Pamięć adresowalna . Rozważmy 32-bitowy procesor: jeśli adresujesz bajty, możesz adresować do 4 GB pamięci. Jeśli adresujesz poszczególne bity, kwota ta zostanie zmniejszona do 512 MB, a jeśli adresujesz słowa 32-bitowe, będziesz mieć 16 GB. (twoje pytanie sugeruje to drugie).

Zmarnowana pamięć . Jeśli masz zmienną, która może być reprezentowana przez X bitów i możesz przypisać do niej tylko jednostki N bitów, zmarnujesz średnio (N-1) / 2 bity, zakładając, że X> N. Jeśli adresujesz poszczególne bity , wykorzystasz pamięć ze 100% wydajnością (przynajmniej z punktu widzenia adresowania). W bajtach zmarnujesz 3,5 bitu na zmienną (wydajność 56%), a przy 32-bitowych słowach zmarnujesz 15,5 bitu (wydajność 52%). Ale staje się gorzej: jeśli większość zmiennych jest niewielka (myśl znaki, logiczne, flagi stanu), skończysz marnowaniem większości pamięci, jeśli twoje jednostki adresowalne są zbyt duże.

Załóżmy na przykład, że średni rozmiar zmiennej wynosi 8 bitów.

  • na komputerze adresowalnym bitowo będziesz mógł przydzielić ze 100% wydajnością, co da ci 512*1024*1024*100%= 0,54 miliarda zmiennych.
  • na komputerze adresowalnym bajtowo przydzielisz z wydajnością 56%, co da ci 4096*1024*1024*56%= 2,4 miliarda zmiennych. To prawie 5 razy więcej w porównaniu do komputera z bitowym adresem! Oczywiście musisz kupić 8 razy więcej pamięci.
  • na 32-bitowym adresowalnym komputerze, ponieważ co najmniej połowa twoich zmiennych zajmie mniej niż 8 bitów, zostaną one przydzielone z wydajnością poniżej 7% (przy użyciu 4,5 bitu z 32). W każdym razie nie dostaniesz więcej niż 4,3 miliarda zmiennych (ponieważ masz tylko tyle różnych adresów), a mniej niż w rzeczywistości. Unikając skomplikowanych obliczeń, przypuszczam, że zyska około 20-30% bardziej użytecznej pamięci w porównaniu do komputera z adresowaniem bajtów, płacąc 4 razy więcej za pamięć RAM.
Dmitrij Grigoriew
źródło
1

Prawdopodobnie powiedział już różne sposoby w innych odpowiedziach. Ogólnie dzisiaj, ale niekoniecznie historycznie, bajt ma 8 bitów. Przez większość czasu mamy do czynienia z „bajtową pamięcią adresowalną”, co oznacza, że ​​NAJMNIEJSZĄ rzeczą, do której możemy uzyskać dostęp za pomocą jednego adresu, jest bajt. Ale to nie znaczy, że jest to jedyna rzecz, do której możemy się odnieść. W zależności od platformy pojedynczy adres może być wykorzystany do uzyskania dostępu do bajtu, półsłowa / słowa (16 bitów), słowa / podwójnego słowa (32 bity) i tak dalej do 64 bitów. Instrukcja zasadniczo określa, jaki jest rozmiar pożądanego dostępu (8, 16, 32, 64 itd.) Zwykle w tych jednostkach 8, 16, 32, 64. Ale to nie jest trudne i szybkie, „zależy”.

Również w zależności od konstrukcji procesora i / lub systemu nie ma powodu, aby zakładać, że rozmiar dostępu jest wielkością pamięci lub wielkością najmniejszego dostępu. Przy coraz większych wymaganiach coraz bardziej sensowne staje się wdrażanie systemu pamięci przy użyciu najmniejszych rozmiarów. Komputer, na którym czytasz, prawdopodobnie używa 32-bitowej magistrali danych lub 64-bitowej magistrali danych dla wszystkich dostępów, chcesz odczytać jeden bajt, odczytuje 64-bit i odrzuca resztę bitów, dlaczego nic nie kosztuje, utrzymuj magistralę tak szeroką aż do rdzenia procesora, a procesor wybierze odpowiedni wiersz bajtów. kosztuje więcej logiki i / lub zegarów, aby zawęzić autobus lub przesuwać bajty po pasach bajtów (czasami jest to wykonywane). więc wewnętrzne suwaki w mikrokontrolerze mogą mieć szerokość 32 bitów, na przykład, jeśli ma to sens dla systemu. może być 16. Tak, w przypadku zapisów nagrywasz więcej cykli, musisz czytać, modyfikować i pisać gdzieś wzdłuż linii. Chcesz napisać jeden bajt na komputerze, gdzieś dzieje się odczyt 64-bitowy, a następnie gdzieś jeden bajt z tych 64 bitów jest modyfikowany, w zależności od tego, co zrobisz potem, że 64 bity mogą wrócić do dram tylko z tymi 8 bitami w odróżnieniu od tego, co było wcześniej, buforowanie i kod sprawiają, że nie jest to ogólna reguła. Zapisy są uruchamiane i zapominają, że kontroler pamięci może zbierać adres i dane z procesora i pozwolić procesorowi na kontynuowanie działania, podczas gdy ostatecznie zapisuje zegary zapisujące, być może więcej zegarów jest spalanych w trybie odczytu-modyfikacji-zapisu (jeśli już w pamięci podręcznej),

Istnieją dziś wyjątki od tego wszystkiego, być może istnieją instrukcje lub typy dostępu w niektórych systemach, które są adresowalne bitowo, są systemy, w których adres znajduje się w jednostkach innych niż bajt. Bajt nie zawsze był 8-bitowy i być może nadal działają systemy, które są prawdą (używaliśmy ósemkowego, a 9-bajtowe słowo 18- lub 36-bitowe ma sens dla programistów i projektantów układów, którzy myślą, że ósemkowe 8-bit ma sens dla myślicieli szesnastkowych).

Teraz komputer, na którym czytasz to, mimo że szyna danych dla tego kontrolera dram może mieć szerokość 32 lub 64 bity, sam moduł dram prawdopodobnie składa się z wielu części o szerokości 8 bitów, które można łatwo zobaczyć. Jeśli ma 8 lub 9 układów z jednej strony, prawdopodobnie jest to 64-bitowa lub 72-bitowa (64 bity plus 8 bitów ECC) szeroka szyna zaimplementowana z 8-bitowymi częściami. Jeśli masz 4 lub 5 żetonów po jednej stronie modułu, ale nadal masz mnóstwo pinów, oznacza to, że ma on szerokość 32 bitów (mało prawdopodobne w dzisiejszych czasach) lub 4 żetony mają szerokość 16 bitów, a jeśli jest 5, może to mieć 16 bitów szerokości i używanych jest tylko 8 lub jest to część o szerokości 8 bitów. Istnieją również części o szerokości 32 bitów, ale najczęściej występuje szerokość 8 bitów. Bardzo powszechna praktyka, która sięga daleko wstecz.

Musielibyśmy wiedzieć, jaki mikrokontroler. Ponieważ wspominasz o 32 bitach, jest całkiem prawdopodobne (bez szczegółowych informacji, chociaż nie możemy powiedzieć), że pamięć w tej części ma szerokość 32 bitów, a wszystkie dostępy do niej mają szerokość 32 bitów. instrukcje prawdopodobnie określą, czego chce program, który prawdopodobnie oferuje 8-bitowy, 16-bitowy i 32-bitowy typ dostępu, mniejsze podczas zapisu wymagałyby gdzieś odczytu-modyfikacji-zapisu, czyta się po prostu ignoruje ścieżki bajtów. To samo dotyczy flasha, chociaż zapisy flashowe są innym tematem. Ale wewnętrzna pamięć flash ma najprawdopodobniej szerokość 32 bity, a wszystkie odczyty są wyrażone w jednostkach 32-bitowych. Zewnętrzna pamięć flash, to inna historia, najprawdopodobniej mają one szerokość jednego bitu (spi lub i2c), chociaż części spi mogą czasami obsługiwać 1, 2 lub 4 bity, ale jeden pin miso jest najczęściej. Wewnętrznie są zorganizowane w jednostkach bajtów, może mieć szerokość 8 bitów, 16 lub 32 lub kto wie, przesuwasz się i adresujesz je w jednostkach bajtów. dzięki SPI możesz przesuwać w dowolnym miejscu między jednym bajtem a całą pamięcią w jednej transakcji, w zależności od projektu części flash.

old_timer
źródło
0

Możesz też uzyskać 1-bitowe procesory!

Szerokość danych będzie zgodna z szerokością rejestru (akumulatora). jest to zwykle „szerokość procesora”, podczas gdy adres adresu może być inny (zwykle szerszy), ale technicznie może być węższy w zależności od zastosowania.

8 oczywiście jest potęgą dwóch liczb. Mamy historię, aby podziękować za wszechobecne użycie 8 bitów - oraz KOSZT / zdolność technologii. Przez długi czas rządziło 8 bitów, między innymi dlatego, że szerokość magistrali i trudność spowodowała, że ​​rejestry (i pamięć RAM) miały więcej niż 8 bitów (brak danych w 16-bitowych danych, jeśli wszystkie rejestry są 8-bitowe). 8 bitów jest dość sprytnych i ma wiele sensu w Hex. 8 bitów może pomieścić twój alfabet, cyfry, znaki rysunkowe i kontrolne (ASCII) lub od 0 do 255 lub + -127 Dostęp do ponad 256 bajtów danych (8-bitowa magistrala adresowa) jest łatwy dzięki stronicowaniu, wybierz stronę, a następnie bajt np. 256 stron z 256 prowadzi do 64K (65536). Zwykle strona zero byłaby podkładką, ponieważ dostęp do niej byłby szybszy, ponieważ nie wymagałoby to ustawienia strony. Mój pierwszy komputer miał statyczny RAM 1k x 8 bitów! (dynamiczna pamięć RAM była tańsza, ale potrzebowałem więcej sprzętu, aby go odświeżyć). Za pomocą kilku flag (c, nc, z, nz), dodawania, odejmowania, obracania w lewo i w prawo, możesz wykonać dość złożoną matematykę na maszynie 8-bitowej. Nie potrzebujesz zmiennoprzecinkowej jednostki arytmetycznej! Niezbyt szybki, ale wykonalny! Wiele wczesnych procesorów może być jednoetapowych i używanych z prostą statyczną pamięcią RAM, dzięki czemu debugowanie jest naprawdę łatwe; dodając ósemkowe bufory i wczesne czerwone diody LED, można było obserwować zmianę adresu i magistrali danych :)

aDub
źródło