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)?
microcontroller
flash-memories
Arun Joe Cheriyan
źródło
źródło
Odpowiedzi:
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.
źródło
int
ilong
), 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?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.
źródło
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.
źródło
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.
źródło
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).
źródło
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.
źródło
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.
512*1024*1024*100%
= 0,54 miliarda zmiennych.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.źródło
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.
źródło
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 :)
źródło