Perché ogni indirizzo in un microcontrollore ha una dimensione di soli 8 bit?


18

Ho visto che, nel microcontrollore a 32 bit, ogni indirizzo di memoria contiene solo 8 bit di dati; è lo stesso anche per un MC a 16 bit. Per i dati a 32 bit, utilizza una combinazione di 4 indirizzi. Perché un indirizzo non può contenere direttamente i dati a 32 bit (rendendolo 32 bit o 16 ciascuno anziché 8)?


2
Dipende dal bus dati del microcontrollore. Quale microcontrollore a 32 bit ha memoria byte? Hai qualche esempio?
Swanand,

4
Semplicemente non vero, che è la ragione per cui i linguaggi di programmazione come C e C ++ incorporano la possibilità che un byte sia maggiore di 8 bit. È solo che la maggior parte funziona meglio con byte a 8 bit, ma 9 bit o 18 bit è là fuori.
PlasmaHH,

6
È come caramelle. Continuano a renderli più piccoli allo stesso prezzo.
Olin Lathrop,

4
È possibile riformulare questa domanda "Perché tutti gli indirizzi sono allineati a 8 bit"?
Florian Castellane,

2
@FlorianCastellane This. Gli indirizzi non hanno una dimensione di 8 bit (a meno che non sia possibile trovare un dispositivo con <256 bit di memoria, quindi potrebbero essere).
jayjay,

Risposte:


11

Questa è effettivamente una scelta progettuale, non c'è motivo per cui debba essere così. Ai vecchi tempi, quando i processori di materie prime ad alto volume operavano su valori a 8 bit, la mappatura era in modo più coerente 1: 1. Per coerenza con l'evoluzione dei progetti nei moderni processori a 32 e 64 bit, era logico mantenere la vecchia mappatura dell'indirizzamento dei byte anche se i bus dei dati aumentavano (con un cambiamento dei costi di implementazione). Alcuni MCU a 32 bit possono ancora implementare solo bus dati a 16 bit su una certa memoria, i processori di fascia alta avranno 256 bit o superiore e sono in grado di caricare più registri core in una singola transazione di memoria. Le interfacce ampie sono buone per le operazioni di burst o streaming.

La piccola dimensione della memoria indirizzabile è utile non solo nel caso della gestione dei valori di byte nel codice, ma anche per lavorare con strutture in memoria come pacchetti ethernet in cui è necessario leggere o modificare byte specifici. Spesso questo tipo di operazione deve essere in grado di eseguire piccole operazioni ma in modo molto efficiente.

Esistono anche scenari in cui è necessario operare con dati big-endian, little-endian o mixed endian. Ora c'è spesso un supporto hardware dedicato per questo, ma ancora una volta, l'indirizzamento dei byte della memoria renderà questo tipo di operazione più efficiente in alcuni scenari.

È abbastanza recente che il numero di bit di indirizzo in un registro sia stato un fattore limitante per lo spazio di indirizzi, quindi sprecare 2 bit per indirizzare byte anziché parole a 32 bit non sarebbe stato un problema 10-15 anni fa (e ora con puntatori a 64 bit, è comune implementare indirizzi a 48 o 56 bit, indirizzi byte). L'insegnamento introduttivo dell'informatica è ancora un po 'bloccato nell'era del mainframe just post e non sempre affronta gli aspetti dell'evoluzione in modo molto chiaro. Molta terminologia è entrata in uso (e definizione) nel tempo in cui le architetture a basso costo ad alto costo (nel senso più generale) hanno iniziato ad essere integrate da progettazioni di processori più limitate dalle risorse e più orientate alle materie prime.

Non ho risposto specificatamente per le MCU, i confini dell'architettura non sono chiari come si potrebbe supporre. Anche un moderno design MCU avanzato ha buone probabilità di essere integrato con un processore server multi-core, o esiste solo come un punto in un insieme scalabile di prodotti; in entrambi i casi, un approccio coerente all'accesso alla memoria è vantaggioso per l'utente finale che deve scrivere o eseguire il codice di porta.

Ho fatto una domanda sulla SE retrocomputer sulle dimensioni dei registri per dare seguito agli aspetti storici di questa domanda.


2
Penso che i processori con parole più lunghe abbiano preceduto i processori a 8 bit. Un processore a 8 bit sarebbe piuttosto inutile senza un mezzo efficace per aggiungere due numeri multi-byte e i primi processori non potevano gestire in modo efficiente numeri più grandi di una singola parola macchina.
supercat,

1
Ho lavorato con processori a 8 bit abbastanza per sapere che potevano facilmente aggiungere numeri multi-byte, ma non con una singola istruzione CPU. Innanzitutto, aggiungi i due byte più bassi e ottieni il byte del risultato più basso e un bit di riporto separato. Per il numero di altri byte presenti, aggiungere i byte di input successivi e il bit di carry dal passaggio precedente, fornendo il byte di output successivo e il bit di carry successivo. Quando non sono rimasti byte di input, convertire l'ultimo bit di carry in un altro byte di output.
user6030

@ user6030: Non è comune avere un'istruzione ADC? AVR lo fa (un microcontrollore RISC a 8 bit, quindi gcc deve usare ADC per intelong ), così fa x86, così come ARM. Suppongo che la maggior parte delle CPU a 8 bit lo farebbe, dal momento che ci sarebbe ancora più richiesta per questo che su un sistema con reg più ampi. Oh, il supercat sta dicendo che i primi processori mancavano di un ADC efficiente?
Peter Cordes,

Penso che sia un punto valido per quanto riguarda l'evoluzione delle dimensioni del registro (anche se mi mancano i dati)
Sean Houlihane,

25

Esistono alcuni DSP (ad es. TI C54x) che non possono indirizzare valori inferiori a 16 bit e alcuni DSP audio utilizzano 24 bit. Tuttavia, i valori a 8 bit sono utilizzati praticamente in tutti i codici generici, quindi tutte le CPU generiche lo supportano.

E solo perché l'unità ridotta utilizzata per gli indirizzi di memoria è di byte a 8 bit non significa che questa sarebbe la più grande unità effettivamente utilizzata sul bus; la maggior parte delle CPU usa la loro dimensione di parola nativa (16/32 bit) o ​​anche una dimensione maggiore per indirizzare la memoria e, quando si utilizzano gli accessi ai byte, estraggono automaticamente il byte dalla parola più grande.

Ad esempio, il bus PCI utilizza sempre transazioni a 32 bit, ma ha segnali di abilitazione byte per l'accesso che deve essere più piccolo.


Grazie. c'è qualche MC che è un bocconcino largo invece di byte in memoria?
Arun Joe Cheriyan,

4
Forse l'Intel 4004?
pjc50,

6
@ArunCheriyan Un esempio di CPU che ha funzionato con gli stuzzichini come la più piccola parola indirizzabile è Saturno : una CPU progettata da HP e utilizzata nei suoi calcolatori di fascia alta nel secolo scorso (il noto HP48 in particolare). Aveva un'architettura molto insolita (registri a 64 bit, ALU a 4 bit, indirizzi a 20 bit, ...).
fioco

Un altro esempio: l'unità indirizzabile più piccola per TMS320C3x di TI è a 32 bit.
kkrambo,

1
@davidcary Oh, beh ... Le date e il tempo non sono mai stati il ​​mio punto forte, comunque. Chiedi a mia moglie i regali di compleanno e al mio capo le scadenze ...
fioco

18

Un microcontrollore a 16 o 32 bit deve spesso manipolare dati larghi solo 8 bit (un byte). Ad esempio, le stringhe di testo vengono generalmente archiviate con un singolo carattere per byte. Avendo uno schema di indirizzamento della memoria che consente di indirizzare ogni singolo byte, il microcontrollore può elaborare in modo efficiente dati a 8 bit. Ciò significa che i dati a 32 bit di solito risiedono su indirizzi multipli di 4 byte, ad esempio 04, 08, 0C, ecc. Ma se la memoria è larga a 32 bit, il microcontrollore può leggere a 32 bit in un ciclo di lettura . I micro hanno spesso istruzioni macchina che possono operare su dati di lunghezza diversa, quindi scoprirai che un'istruzione di dati di spostamento (MOV) può avere 3 forme, MOV.B, MOV.W e MOV.L per spostare 8, 16 e 32 bit di dati in un'istruzione.


7

La risposta di base è "perché è lungo un byte". Con un ampio corpus di codice consolidato che rende tale presupposto, la sua rottura causerebbe ogni sorta di problemi.

All'inizio, non esisteva un corpus di codice stabilito. I processori userebbero frequentemente ogni sorta di strane architetture, come mostrato da altre risposte. Quando sono usciti i processori a 16 bit, tuttavia, c'era abbastanza codice che presupponeva la disponibilità di dati a 8 bit che non riuscire a renderlo così facile sarebbe stato un vero ostacolo all'adozione.

La presenza di una parola a 32 bit per indirizzo non presenta alcun svantaggio nella velocità della memoria. Su un sistema a 32 bit, i bit di indirizzo 2 inferiori spesso non vanno in memoria. Il processore di solito legge l'intera parola a 32 bit e seleziona (o maschera off) il byte a 8 bit di cui ha bisogno all'interno di quella parola. Finché il tuo spazio di indirizzi può memorizzare abbastanza dati (limitato a 2 ^ 32 byte con un sistema a 32 bit), allora non preoccuparti. In effetti, su molti processori a 16 bit / 32 bit ci vuole più tempo per l'elaborazione con valori di byte che con valori di lunghezza della parola nativa: leggere una parola a 32 bit e scartare parte di quella parola richiederà chiaramente un'operazione aggiuntiva, rispetto alla sola lettura della parola a 32 bit.

Al contrario, se si dispone di un sistema in cui è necessario utilizzare la memoria in modo efficiente, è necessario poter accedere ai singoli byte. Se non puoi, esaurirai la memoria. Con questo in mente, essere in grado di fare riferimento a singoli byte è chiaramente necessario, quindi ha senso avere la memoria suddivisa in byte.


3
Infatti. E poi c'è la domanda aggiuntiva se un processore può gestire i due accessi distinti necessari per caricare o archiviare automaticamente un valore non allineato a 32 bit nell'hardware o se questo deve essere gestito esplicitamente nel software.
Chris Stratton,

5

Questo è ciò che viene chiamato con memoria indirizzabile in byte . Normalmente è una buona cosa, a meno che tu non stia esaurendo lo spazio degli indirizzi (ad esempio 4 GB con puntatori a 32 bit, invece di 16 GB con puntatori a 32 bit in cui ogni indirizzo è una parola separata a 32 bit).


Si noti che lo spazio degli indirizzi può superare tali limiti se si dividono gli indirizzi in parti che si adatteranno in un registro ciascuno. Una volta avevo alcuni computer a 8 bit che raggiungevano 64 KB di memoria suddividendo gli indirizzi in due parti mantenute in registri separati e ho visto annunci pubblicitari per computer anche con processori a 8 bit che potevano raggiungere 1 MB di memoria suddividendo gli indirizzi in tre parti.
user6030,

L'AVR (microcontrollore RISC a 8 bit) lo fa: tre coppie dei 32 registri a 8 bit per uso generico possono essere dereferenziate come puntatore a 16 bit. C'è anche qualche possibilità di combinarlo con un altro segmento a 8 bit per ottenere indirizzi a 24 bit.
Peter Cordes,

4

I DSP Analog Devices Shark a 32 bit hanno 32 bit come la più piccola unità di memoria indirizzabile, quindi sizeof (int) == sizeof (short) == sizeof (char) == 1 (Sì, hanno caratteri a 32 bit, perfettamente validi per lo standard C).

Anche cose come int_8, int_16 e simili non sono definite in, una brutta sorpresa quando si esegue il porting di codice da altre piattaforme.


1

La dimensione dell'unità di memoria indirizzabile è essenzialmente un compromesso tra quanta memoria è possibile indirizzare rispetto a quanta memoria si sprecherà.

Memoria indirizzabile . Prendi in considerazione una CPU a 32 bit: se indirizzi byte, puoi indirizzare fino a 4 GB di memoria. Se indirizzi singoli bit, tale importo sarà ridotto a 512 MB e se indirizzi parole a 32 bit avrai 16 GB. (la tua domanda sembra suggerire quest'ultima).

Memoria sprecata . Se hai una variabile che può essere rappresentata con X bit e puoi allocare solo unità di N bit per essa, sprecherai (N-1) / 2 bit in media, assumendo X> N. Se indirizzi singoli bit , utilizzerai la memoria con un'efficienza del 100% (almeno dal punto di vista degli indirizzi). Con i byte, sprecherai 3,5 bit per variabile (efficienza del 56%) e con parole a 32 bit, perderai 15,5 bit (efficienza del 52%). Ma peggiora: se la maggior parte delle variabili sono piccole (pensa a personaggi, valori booleani, flag di stato), finirai per sprecare gran parte della memoria se le tue unità indirizzabili sono troppo grandi.

Ad esempio, supponiamo che la dimensione media di una variabile sia di 8 bit.

  • su un computer a indirizzamento di bit, sarai in grado di allocare con un'efficienza del 100%, che ti darà 512*1024*1024*100%= 0,54 miliardi di variabili.
  • su un computer indirizzabile in byte, assegnerai con un'efficienza del 56%, che ti darà 4096*1024*1024*56%= 2,4 miliardi di variabili. Questo è quasi 5 volte di più rispetto a un computer con indirizzo bit! Ovviamente, dovrai acquistare 8 volte più memoria.
  • su un computer indirizzabile a 32 bit, poiché almeno la metà delle variabili occuperà meno di 8 bit, verranno allocate con un'efficienza inferiore al 7% (utilizzando 4,5 bit su 32). In ogni caso, non otterrai più di 4,3 miliardi di variabili (dato che hai solo tanti indirizzi distinti) e meno di quello nella realtà. Evitando calcoli complessi, immagino che otterrà forse il 20-30% di spazio utile in più rispetto al computer indirizzabile a byte, pagando 4 volte il prezzo per la RAM.

1

Probabilmente già detto vari modi nelle altre risposte. In generale oggi, ma non necessariamente storicamente, un byte è 8 bit. Il più delle volte ci occupiamo di "memoria indirizzabile in byte", il che significa che la cosa PIÙ PICCOLA a cui possiamo accedere con un singolo indirizzo è un byte. Ma ciò non significa che sia l'unica cosa che possiamo affrontare. A seconda della piattaforma, è possibile utilizzare un singolo indirizzo per accedere a un byte, una mezza parola / parola (16 bit), una parola / doppia parola (32 bit) e così via a 64 bit qualunque. L'istruzione determina fondamentalmente quale sia la dimensione dell'accesso desiderato (8,16,32,64, ecc.) Di solito in quelle unità 8, 16, 32, 64. Ma non è difficile e veloce, "dipende".

Inoltre, a seconda della progettazione del processore e / o del sistema, non vi è motivo di ritenere che la dimensione dell'accesso sia la dimensione della memoria o la dimensione dell'accesso più piccolo. Con requisiti sempre più grandi ha sempre meno senso nel tempo implementare effettivamente il sistema di memoria utilizzando le dimensioni più ridotte, il computer su cui stai leggendo questo utilizza probabilmente un bus dati a 32 bit di larghezza o bus dati a 64 bit di larghezza per tutti gli accessi, tu vuole leggere un byte, fa una lettura a 64 bit e lancia il resto dei bit, perché non costa nulla in più mantenere il bus così largo fino al vicino al core del processore e il processore seleziona la corsia giusta del byte. costa più logica e / o orologi per restringere il bus o spostare i byte nelle corsie dei byte (a volte viene fatto). quindi gli arieti interni in un microcontrollore potrebbero avere una larghezza di 32 bit, ad esempio se questo ha senso per il sistema. potrebbe essere 16. Sì per le scritture che si masterizzano più cicli, è necessario leggere-modificare-scrivere da qualche parte lungo la linea. Vuoi scrivere un singolo byte sul tuo PC, da qualche parte accade una lettura a 64 bit, e poi da qualche parte viene modificato un byte di quei 64 bit, a seconda di cosa fai dopo che quei 64 bit possono tornare al dramma con solo quegli 8 bit diverso da quello che c'era prima, la memorizzazione nella cache e il codice rendono questa non una regola generica. Le scritture sono attive e dimenticate, tuttavia, il controller di memoria può raccogliere l'indirizzo e i dati dal processore e consentire al processore di continuare a funzionare mentre alla fine esegue la scrittura salvando gli orologi, forse più orologi che vengono masterizzati in una lettura-modifica-scrittura (se nella cache già),

Ci sono eccezioni anche oggi a praticamente tutto questo, ci sono forse istruzioni o tipi di accesso in alcuni sistemi che sono indirizzabili in bit, ci sono alcuni sistemi in cui l'indirizzo è in unità di qualcosa di diverso da un byte. Un byte non era sempre 8 bit e forse ci sono ancora sistemi in esecuzione ciò che è vero (usavamo usare ottale e una parola di byte 18 o 36 bit di 9 bit ha molto senso per i programmatori umani e i progettisti di chip che pensano ottale, un 8 bit ha molto senso per i pensatori esadecimali).

Ora il computer su cui stai leggendo questo, anche se il bus dati per quel controller drammatico potrebbe avere una larghezza di 32 o 64 bit, il modulo drammatico stesso è probabilmente composto da più parti larghe 8 bit, che puoi facilmente vedere. Se ha 8 o 9 chip su un lato, probabilmente è un bus largo 64 bit o 72 bit (64 bit più 8 bit di ECC) implementato con parti larghe 8 bit. Se hai 4 o 5 chip su un lato del modulo ma hai ancora tonnellate di pin, allora è largo 32 bit (improbabile in questi giorni) o 4 chip larghi 16 bit e se ce n'è un 5 potrebbe essere largo 16 bit e solo 8 vengono utilizzati oppure è una parte larga 8 bit. Ci sono anche parti a 32 bit di larghezza, ma la larghezza a 8 bit è più comune. Una pratica molto comune che risale a molto tempo fa.

Dovremmo sapere quale microcontrollore. Dato che menzioni a 32 bit è abbastanza probabile (senza informazioni dettagliate sebbene non possiamo dirlo) che la memoria all'interno di quella parte è larga 32 bit e tutti gli accessi ad essa sono larghi 32 bit. le istruzioni determinerebbero probabilmente ciò che il programma vuole, che probabilmente offre un tipo di accesso a 8 bit, 16 bit e 32 bit, quelli più piccoli sulle scritture richiederebbero una lettura-modifica-scrittura da qualche parte, le letture che semplicemente ignorano le corsie di byte. Lo stesso vale per il flash, anche se le scritture flash sono un altro argomento. Ma il flash interno ha probabilmente una larghezza di 32 bit e tutte le letture sono in unità di 32 bit. Un flash esterno, tuttavia, è un'altra storia, molto probabilmente sono larghe un po '(spi o i2c), sebbene le parti spi possano talvolta supportare 1, 2 o 4 bit, ma un pin miso è più comune. Internamente sono organizzati in unità di byte, potrebbe essere largo 8 bit o 16 o 32, o chissà, si sposta e si indirizza in unità di byte però. con spi puoi spostarti ovunque tra un byte e l'intera memoria in una singola transazione, dipende dal design della parte flash.


0

Puoi anche ottenere processori a 1 bit!

La larghezza dei dati seguirà la larghezza del registro (accumulatore). questa è normalmente la "larghezza del processore", mentre il bus dell'indirizzo può essere diverso (di solito più ampio), ma potrebbe tecnicamente essere più stretto a seconda dell'uso.

8 ovviamente è una potenza di due numeri. Dobbiamo ringraziare la storia per l'uso onnipresente di 8 bit e il COST / capacità della tecnologia. Per molto tempo hanno governato 8 bit, parte del motivo è la larghezza dei bus e la difficoltà nel creare registri (e RAM) più larghi di 8 bit (nessun punto nei dati a 16 bit se i registri sono tutti a 8 bit). 8 bit è piuttosto elegante e ha molto senso in Hex. 8 bit possono contenere caratteri alfabetici, numerici, di disegno e controllo (ASCII) o da 0 a 255 o + -127 Accedere a più di 256 byte di dati (bus di indirizzo a 8 bit) è semplice con il paging, selezionare la pagina, quindi il byte ad es. 256 pagine di 256 ti portano a 64K (65536). Di solito la pagina zero sarebbe un blocco per appunti in quanto sarebbe più veloce accedere in quanto ciò non richiederebbe l'impostazione della pagina. Il mio primo computer aveva 1k x 8 bit di RAM statica! (la RAM dinamica era più economica, ma aveva bisogno di più hardware per aggiornarlo). Con alcuni flag (c, nc, z, nz), aggiungi, sottrai, ruota a destra e a sinistra, puoi fare dei calcoli piuttosto complessi su una macchina a 8 bit. Non hai bisogno di un'unità aritmetica in virgola mobile! Non super veloce, ma fattibile! Molti dei primi processori potevano essere a singolo passo e usati con semplice RAM statica rendevano il debugging davvero semplice; aggiungendo alcuni buffer ottali e primi LED rossi, è possibile osservare l'indirizzo e i bus dei dati che cambiano :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.