In che modo l'architettura di Harvard aiuta?


12

Stavo leggendo di Arduino e l'architettura AVR e mi sono bloccato nel punto in cui il modo in cui la pipeline stallo o il gorgogliamento è risolto dall'introduzione dell'architettura di Harvard nell'AVR. rende possibile caricare il programma senza un operatore. Ma come aiuta a risolvere il problema sopra?


2
Questo è un po 'una supposizione, quindi non pubblicherò come risposta, ma suppongo che l'architettura di Harvard sia di aiuto perché non c'è la possibilità di auto-modificare il codice da una precedente istruzione in cantiere.
PeterJ,

1
non sono sicuro di averti ... vuoi dire che una volta che le istruzioni sono state "recuperate" non possono essere modificate o respinte?
Ayush,

1
Sì, è vero, per i non-Harvard perché il codice può cambiare se stesso c'è la possibilità che l'istruzione precedente possa modificare l'istruzione che segue. Ma aspetta un po 'qualcuno probabilmente avrà una risposta più definitiva e più chiara.
PeterJ,

Risposte:


9

L'architettura di Harvard, che per inciso è stata utilizzata molto prima che gli AVR fossero mai inventati, ha davvero spazi di indirizzi separati per la memoria del programma e per la memoria dei dati. Ciò che ciò porta alla parte è la capacità di progettare il circuito in modo tale che un bus separato e un circuito di controllo possano essere utilizzati per gestire il flusso di informazioni dalla memoria del programma e il flusso di informazioni alla memoria dei dati. L'uso di bus separati significa che è possibile che il recupero e l'esecuzione del programma continuino senza interruzioni da un trasferimento occasionale di dati nella memoria dati. Ad esempio, nella versione più semplice dell'architettura, l'unità di recupero del programma può essere impegnata a recuperare l'istruzione successiva nella sequenza del programma in parallelo con l'operazione di trasferimento dei dati che potrebbe essere stata parte dell'istruzione del programma precedente.

A questo livello più semplice l'architettura di Harvard ha un limite in quanto non è generalmente possibile inserire il codice del programma nella memoria dei dati e farlo eseguire da lì.

Ci sono molte varianti e complessità che possono essere aggiunte in cima a questa forma più semplice dell'architettura che ho descritto. Un'aggiunta comune è l'aggiunta della cache delle istruzioni al bus di informazioni sul programma che consente all'unità di esecuzione delle istruzioni un accesso più rapido alla fase di programma successiva senza dover passare a una memoria più lenta per recuperare la fase di programma ogni volta che è necessario.


grazie mille .... mi ha davvero aiutato a ottenerlo, ma solo un'altra cosa ... non possiamo avere autobus diversi ma stessa memoria e lavoro allo stesso tempo?
Ayush,

@Ayush - Se due bus si trovavano nello stesso spazio di memoria, allora due richieste di transazione di memoria che sono arrivate alla memoria contemporaneamente dovrebbero comunque contendere l'accesso alla memoria. Uno deve aspettare che l'altro si completi !! Detto questo, alcuni progettisti hanno "risolto" questo problema progettando la memoria per funzionare a una velocità doppia rispetto a quella normale e quindi consentire a un bus di accedere alla memoria alternandosi con gli accessi dell'altro bus. Cioè le cose sono progettate in modo tale che il primo bus sia sempre sincronizzato con gli slot di accesso dispari alla memoria e al (seguito commento successivo)
Michael Karas,

(seguito dal commento precedente) il secondo bus è sincronizzato con gli slot di accesso pari della memoria, quindi entrambi i bus possono procedere a velocità elevata senza contesa di accesso alla memoria.
Michael Karas,

@MichaelKaras: Uno potrebbe farlo. D'altra parte, nella maggior parte dei casi, il principale fattore limitante per la velocità complessiva del sistema è la velocità della memoria. Se uno avesse una memoria che poteva funzionare due volte più velocemente di quanto sarebbe necessario solo per i dati o solo per il codice, dividere il sistema di memoria in uno ciascuno per dati e codice permetterebbe alle cose di andare due volte più velocemente.
supercat

4

Alcune note oltre alla risposta di Michaels:

1) l'architettura di Harvard non richiede che ci siano due spazi separati per dati e codice, solo che sono (principalmente) recuperati su due bus diversi .

2) il problema che viene risolto dall'architettura di Harvard è la contesa del bus: per un sistema in cui la memoria del codice può fornire le istruzioni abbastanza rapidamente da mantenere la CPU alla massima velocità, l'ulteriore onere di recupero / archiviazione dei dati rallenterà la CPU giù. Questo problema è risolto da un'architettura Hardvard: una memoria che è (un po ') troppo lenta per la velocità della CPU.

Si noti che la memorizzazione nella cache è un altro modo per risolvere questo problema. Spesso Harvarding e cache sono usati in combinazioni interessanti.

Harvard utilizza due autobus. Non vi è alcun motivo intrinseco di attenersi a due, in casi molto speciali ne vengono utilizzati più di due, principalmente nei DSP (processori di segnali digitali).

Il Memory Banking (nel senso di distribuire gli accessi di memoria a diversi set di chip) può essere visto come una sorta di Harvarding all'interno del sistema di memoria stesso, non basato sulla distinzione dati / codice, ma su alcuni bit dell'indirizzo.


4
In realtà un architettura "pura" Harvard non richiede memorie separate (spazi suoni) per istruzioni e dati. Tuttavia, poiché ciò impedisce l'avvio automatico di un computer, molte macchine implementano un'architettura "modificata" di Harvard, in cui sono consentite scritture nella memoria delle istruzioni.
Dave Tweed

Il Memory Bank non aiuta se non ci sono due (o più) bus tra la CPU e ciascuno dei banchi di memoria.
Dave Tweed

@Dave 2: il banking aiuta in determinate circostanze, ad esempio se il problema è il timing della memoria E il bus per la memoria non è bloccante (più transazioni possono essere in sospeso).
Wouter van Ooijen,

@ Dave1: puoi darci un riferimento?
Wouter van Ooijen,

Wikipedia , anche Princeton University (che in realtà è solo una copia della pagina di Wikipedia). Inoltre, la maggior parte dei microcontrollori a chip singolo è l'architettura di Harvard e molti fogli dati in realtà discutono di come fornire un meccanismo per auto-scrivere la memoria flash del codice crei un'architettura Harvard modificata.
Dave Tweed

2

Una pura architettura di Harvard generalmente consentirà a un computer con un determinato livello di complessità di funzionare più velocemente di un'architettura Von Neuman, a condizione che non sia necessario condividere risorse tra il codice e le memorie di dati. Se le limitazioni della piedinatura o altri fattori obbligano l'uso di un bus per accedere a entrambi gli spazi di memoria, tali vantaggi potrebbero essere ampiamente annullati.

Un'architettura "pura" di Harvard sarà limitata all'esecuzione del codice che viene messo in memoria da un meccanismo diverso dal processore che eseguirà il codice. Ciò limita l'utilità di tali architetture per dispositivi il cui scopo non è impostato dalla fabbrica (o da qualcuno con apparecchiature di programmazione specializzate). È possibile utilizzare due approcci per alleviare questo problema:

Alcuni sistemi hanno aree di memoria e di codice separate, ma forniscono hardware speciale che può essere richiesto di prendere brevemente il bus di codice, eseguire alcune operazioni e restituire il controllo alla CPU una volta completata tale operazione. Alcuni di questi sistemi richiedono un protocollo abbastanza elaborato per eseguire tali operazioni, alcuni hanno istruzioni speciali per eseguire tale compito e alcuni addirittura controllano determinati indirizzi di "memoria dati" e attivano l'acquisizione / rilascio quando si tenta di accedervi . Un aspetto chiave di tali sistemi è che esistono aree di memoria esplicitamente definite per "codice" e "dati"; anche se è possibile per la CPU leggere e scrivere lo spazio "codice", viene comunque riconosciuto come semanticamente diverso dallo spazio dati ".

Un approccio alternativo che viene utilizzato in alcuni sistemi di fascia alta è quello di disporre di un controller con due bus di memoria, uno per il codice e uno per i dati, entrambi collegati a un'unità di arbitrato di memoria. A sua volta quell'unità si è connessa a vari sottosistemi di memoria usando un bus di memoria separato per ciascuno. Un accesso al codice a un sottosistema di memoria può essere elaborato contemporaneamente con un accesso ai dati a un altro; solo se codice e dati tentano di accedere contemporaneamente allo stesso sottosistema, uno dovrà attendere.

Sui sistemi che utilizzano questo approccio, le parti non critiche per le prestazioni di un programma possono semplicemente ignorare i confini tra i sottosistemi di memoria. Se il codice e i dati risiedono nello stesso sottosistema di memoria, le cose non funzioneranno velocemente come se fossero in sottosistemi separati, ma per molte parti di un programma tipico che non contano. In un sistema tipico, ci sarà una piccola parte del codice in cui le prestazioni contano davvero, e funzionerà solo su una piccola parte dei dati detenuti dal sistema. Se uno avesse un sistema con 16K di RAM che era diviso in due partizioni 8K, si potevano usare le istruzioni del linker per assicurarsi che il codice critico per le prestazioni si trovasse vicino all'inizio dello spazio di memoria complessivo e che i dati critici per le prestazioni fossero vicini al fine. Se la dimensione complessiva del codice aumenta, ad esempio 9K, il codice all'interno dell'ultimo 1K verrebbe eseguito più lentamente del codice inserito altrove, ma tale codice non sarebbe critico per le prestazioni. Allo stesso modo, se il codice fosse ad esempio solo 6K, ma i dati aumentassero a 9K, l'accesso all'1K di dati più basso sarebbe lento, ma se i dati critici per le prestazioni fossero posizionati altrove, ciò non costituirebbe un problema.

Si noti che mentre le prestazioni sarebbero ottimali se il codice fosse inferiore a 8K e i dati fossero inferiori a 8K, la progettazione del sistema di memoria di cui sopra non imporrebbe alcuna rigida partizione tra il codice e lo spazio dati. Se un programma necessita solo di 1K di dati, il codice potrebbe aumentare fino a 15K. Se necessita solo di 2 KB di codice, i dati potrebbero aumentare a 14 KB. Molto più versatile di avere un'area 8K solo per il codice e un'area 8K solo per i dati.


1

Un aspetto che non è stato discusso è che per i piccoli microcontrollori, in genere con solo un bus di indirizzo a 16 bit, un'architettura di Harvard raddoppia (o triplica) efficacemente lo spazio degli indirizzi. Puoi avere 64 KB di codice, 64 KB di RAM e 64 KB di I / O mappati in memoria (se il sistema utilizza I / O mappati in memoria invece di numeri di porta, quest'ultimo già separa l'indirizzamento I / O dal codice & Spazi RAM).

In caso contrario, è necessario stipare il codice, la RAM e, facoltativamente, l'indirizzo I / O all'interno dello stesso spazio di indirizzi 64 KB.

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.