Qual è il punto del DMA nelle CPU integrate?


17

Recentemente stavo facendo un progetto con il mbed (LPC1768), usando il DAC per produrre varie onde. Ho letto parti del foglio dati e mi ha parlato di come avesse DMA per molte periferiche. Sembrava utile, ma a seguito di una lettura ho scoperto che il DMA utilizzava lo stesso bus dati della CPU (che suppongo sia normale). Questo significa che la CPU non può interagire con nessuna delle memorie mentre il DAC sta ottenendo dati? Inoltre, dal momento che il DAC non aveva un buffer (per quanto potrei dire) e quindi deve DMA molto spesso, qual è il punto di DMA? Se la CPU non può eseguire transazioni di memoria, può fare qualcosa?


8
Ti suggerisco di guardare le funzionalità della tua CPU e se può fare altro che accedere alla memoria. Ho sentito parlare di alcune CPU che possono fare cose come decisioni o calcoli, non sono sicuro che questo sia affatto comune ..
PlasmaHH

La CPU dovrebbe impiegare del tempo a trasferire i dati su una porta I / O o delegare l'attività a un dispositivo dedicato?
StainlessSteelRat

Sì, la CPU può fare altre cose, ma in un sistema incorporato probabilmente sta impiegando molto tempo a interfacciarsi con le periferiche, in particolare le porte I / O. Non avrebbe più senso avere un bus dati aggiuntivo solo per DMA? O di solito non è necessario? La situazione in cui vorresti un bus extra è quando stai cercando di spingere i limiti del tuo hardware, cosa che presumo sia quando vorresti comunque usare il DMA negli Stati Uniti?
BeB00,

1
Esempio semplice, supponiamo che tu voglia fare molta stampa di informazioni su una porta seriale. È possibile sedersi e attendere l'invio di ogni byte (lento), copiarlo in un buffer e quindi utilizzare gli interrupt sulla CPU per inviare ogni byte quando la porta è pronta (molti cambi di contesto = lento), oppure copiarlo in un buffer e lasciare che il controller DMA esegua il timeout dei dati mentre la CPU è impegnata a fare altre cose (può essere più veloce).
Tom Carpenter,

2
Ho visto una volta una copertina di EDN che mostrava il disegno di un uomo che indossava un'enorme scarpa lunga tre piedi e un titolo: "Se è una scarpa, indossala". Il punto era che se una parte fa dieci cose di cui non hai bisogno e una cosa di cui hai bisogno e il prezzo, l'impronta e il budget di potenza sono tutti adatti, allora dovresti semplicemente usarlo e non perdere tempo a cercare qualcosa con meno funzioni.
Solomon Slow,

Risposte:


17

Il foglio dati LPC1768 che ho trovato ha le seguenti virgolette (sottolineatura mia):

Controller DMA (GPDMA) per uso generico a otto canali sulla matrice multistrato AHB che può essere utilizzato con periferiche SSP, bus I2S, UART, da analogico a digitale e da digitale ad analogico, segnali di corrispondenza del timer e da memoria a memoria trasferimenti di memoria.

Il bus APB diviso consente un throughput elevato con poche stalle tra CPU e DMA

Lo schema a blocchi a pagina 6 mostra SRAM con più canali tra la matrice AHB e la seguente citazione lo conferma:

LPC17xx contiene un totale di 64 kB di memoria RAM statica su chip. Ciò include la SRAM principale da 32 kB, accessibile dalla CPU e dal controller DMA su un bus ad alta velocità, e due ulteriori blocchi da 16 kB ciascuno SRAM situati su una porta slave separata sulla matrice multistrato AHB. Questa architettura consente agli accessi CPU e DMA di essere distribuiti su tre RAM separate a cui è possibile accedere contemporaneamente

E questo è rafforzato dalla seguente citazione:

GPDMA consente transazioni da periferica a memoria, da memoria a periferica, da periferica a periferica e da memoria a memoria.

Pertanto, è possibile trasmettere i dati al DAC da uno dei blocchi SRAM separati o da una periferica diversa, mentre si utilizza la SRAM principale per altre funzioni.

Questo tipo di DMA periferico-periferico è comune nelle parti più piccole in cui l'interfaccia di memoria è abbastanza semplice (rispetto a un moderno processore Intel).


Ah, grazie, non mi ero reso conto che fosse possibile, sono un po 'nuovo di DMA. Ciò implica che la cpu può accedere alle periferiche mentre il DAC sta accedendo alla SRAM separata?
BeB00,

1
Sì, questo è esattamente lo scopo della matrice AHB. Consente a diversi controller (CPU, DMA, alcune periferiche come Ethernet e USB) di accedere a cose diverse contemporaneamente. Questo è il motivo per cui esistono più "porte" nella SRAM.
David,

Sì, l'AHB in queste piccole creature economiche offre larghezze di banda di memoria folli a causa dei banchi di memoria paralleli: puoi avere Ethernet, USB2 e tutto funziona al massimo throughput e la CPU non se ne accorge nemmeno ...
peufeu,

Anche il codice pollice può mettere 2 istruzioni in una parola a 32 bit, quindi la CPU potrebbe non aver bisogno di accedere al bus che spesso quando si fa matematica o operazioni che coinvolgono principalmente i registri ... Dall'altro lato, penso che M3 e M4 possano eseguire più accessi alla memoria per clock (istruzioni e dati) a causa della presenza di più bus.
peufeu,

30

In sostanza, DMA consente alla CPU di comportarsi efficacemente alla sua velocità nativa, mentre le periferiche possono comportarsi efficacemente alla loro velocità nativa. La maggior parte dei numeri nell'esempio è composta.

Confrontiamo due opzioni per raccogliere periodicamente i dati da un ADC:

  1. È possibile impostare l'ADC come parte di un interrupt (periodico o meno)
  2. È possibile creare un buffer e indicare al DMA di trasferire le letture ADC nel buffer.

Trasferiamo 1000 campioni dall'ADC alla RAM.

Utilizzando l'opzione 1: per ogni campione esiste

  • Si trascorrono 12 cicli inserendo l'interrupt
  • leggi annunci
  • conservare in ram
  • Sono trascorsi 12 cicli uscendo dall'interrupt

Facciamo finta che questa funzione di interruzione sia di 76 istruzioni, l'intera routine è lunga 100 istruzioni, supponendo l'esecuzione a ciclo singolo (nel migliore dei casi). Ciò significa che l'opzione 1 impiegherà 100.000 cicli di esecuzione della CPU.

Opzione 2: DMA è configurato per raccogliere 1000 campioni di ADC. Supponiamo che l'ADC abbia un trigger hardware da un contatore timer.

  • ADC e DMA trasferiscono 1000 dati dei campioni nella ram
  • DMA interrompe la CPU dopo 1000 campioni
  • Si trascorrono 12 cicli inserendo l'interrupt
  • Il codice accade (diciamo che dice al DMA di sovrascrivere la RAM)
  • Sono trascorsi 12 cicli uscendo dall'interrupt

Fingere che l'intero interrupt (con sovraccarico di entrata e di uscita) sia di 100 istruzioni a ciclo singolo. Utilizzando DMA, si impiegano solo 100 cicli per salvare gli stessi 1000 campioni.

Ora, ogni volta che il DMA accede al bus, sì, potrebbe esserci una disputa tra CPU e DMA. La CPU potrebbe anche essere costretta ad attendere il completamento del DMA. Ma attendere il completamento del DMA è molto più breve rispetto al bloccare la CPU per la manutenzione dell'ADC. Se il core clock della CPU è 2x Bus clock, la CPU potrebbe perdere alcuni cicli core in attesa del completamento del DMA. Ciò significa che il tempo di esecuzione effettivo del trasferimento è compreso tra 1000 (supponendo che la CPU non aspetti mai) e 9000 cicli. Ancora meglio rispetto ai 100.000 cicli.


2
È importante notare che la RAM non è l'unico posto in cui la CPU può memorizzare i dati. In generale, la CPU carica i dati dalla RAM nei registri prima di lavorarci su.
Aron,

Sì, assolutamente corretto. Il mio esempio è puramente uno schizzo approssimativo.
pgvoorhees,

Molti microcontrollori hanno anche un bus multistrato, quindi sono possibili operazioni simultanee. Ad esempio: adc-> ram e flash-> registrati contemporaneamente. Inoltre, molte istruzioni sono più lunghe di 1 orologio, quindi c'è molto tempo per il DMA.
Jeroen3,

9

Se in un determinato ciclo il processore e un controller DMA dovessero accedere allo stesso bus, l'uno o l'altro dovrebbero attendere. Molti sistemi, tuttavia, contengono più aree di memoria con bus separati insieme a un "ponte" del bus che consentirà alla CPU di accedere a una memoria mentre il controller DMA accede a un'altra.

Inoltre, molte CPU potrebbero non aver bisogno di accedere a un dispositivo di memoria ad ogni ciclo. Se una CPU normalmente dovrebbe accedere alla memoria solo su due cicli su tre, un dispositivo DMA a bassa priorità potrebbe essere in grado di sfruttare i cicli quando il bus di memoria sarebbe altrimenti inattivo.

Anche nei casi in cui ogni ciclo DMA provocherebbe lo stallo della CPU per un ciclo, tuttavia, DMA può essere comunque molto utile se i dati arrivano a una velocità abbastanza lenta da consentire alla CPU di fare altre cose tra gli elementi di dati in entrata , ma abbastanza velocemente da ridurre al minimo l'overhead per articolo. Se una porta SPI forniva i dati a un dispositivo a una velocità di un byte ogni 16 cicli della CPU, ad esempio, l'interruzione della CPU per ciascun trasferimento causerebbe probabilmente il tempo che impiega quasi tutto il suo tempo a entrare e tornare dalla routine del servizio di interrupt e nessuna facendo qualsiasi lavoro reale. Utilizzando DMA, tuttavia, l'overhead potrebbe essere ridotto al 13% anche se ogni trasferimento DMA causasse lo stallo della CPU per due cicli.

Infine, alcune CPU consentono l'esecuzione del DMA mentre la CPU è inattiva. L'uso di un trasferimento basato su interrupt richiederebbe che il sistema si riattivi completamente per ogni unità di dati trasferita. Utilizzando DMA, tuttavia, potrebbe essere possibile per il controller di sonno alimentare il controller di memoria un paio di orologi ogni volta che entra un byte, ma lasciare che tutto il resto rimanga addormentato, riducendo così il consumo di energia.


1
Le parti Cortex-M come l'LPC1768 hanno un percorso di memoria distinto dal flash al decodificatore dell'istruzione, quindi in effetti le operazioni da registro a registro possono significare che la CPU può eseguire più istruzioni tra le volte in cui è necessario accedere alla memoria dei dati.
Chris Stratton,

5

Come programmatore, DMA è un'opzione per il trasferimento di dati da e verso le periferiche che lo supportano. Per il classico esempio di spostamento di un buffer di grandi dimensioni attraverso una periferica seriale come SPI o UART o raccolta di un numero di campioni da un ADC, sono disponibili tre metodi per spostare tali dati:

  1. Metodo di polling. Qui è dove aspetti i flag di registro per permetterti di spostare dentro / fuori il byte successivo. Il problema è che stai aspettando tutta l'esecuzione della CPU mentre aspetti questo. Oppure, se devi condividere il tempo della CPU in un sistema operativo, il tuo trasferimento verrà drasticamente rallentato.

  2. Metodo di interruzione. Qui è dove si scrive una routine di servizio di interruzione (ISR) che viene eseguita con ogni trasferimento di byte e si scrive il codice nell'ISR che gestisce il trasferimento. Questo è più efficiente della CPU perché la CPU servirà il tuo ISR solo quando necessario. È gratuito per l'uso in qualsiasi altro momento tranne nell'IRR. ISR è anche una delle opzioni più veloci per effettuare il trasferimento in termini di velocità di trasferimento.

  3. DMA. Configurare il DMA con puntatori di origine / destinazione, numero di trasferimenti e via. Ruba i cicli del bus e il tempo della CPU per eseguire il trasferimento e la CPU è libera di fare altre cose nel frattempo. È possibile configurare un flag o interrompere per indicare quando il trasferimento è stato effettuato. Di solito è un tocco più veloce di ISR ​​ed è di solito l'opzione di trasferimento più veloce.

Come programmatore, preferisco il DMA perché è il più semplice da programmare ed è essenzialmente la tecnica più veloce per effettuare il trasferimento. In genere, è sufficiente configurare un paio di registri per i puntatori di origine / destinazione e il numero di trasferimenti per effettuare e partire. Trascorro molte più ore a lavorare nel codice ISR rispetto al codice con accelerazione DMA perché il codice ISR richiede capacità di progettazione critiche e deve essere codificato, testato, verificato, ecc. Il codice DMA è molto più piccolo e il codice che devo scrivere da solo è relativamente banale e sto ottenendo la massima velocità di trasferimento nell'affare.

Nella mia esperienza, ultimamente con i processori Atmel SAM3 / 4, DMA esegue un tocco più velocemente di un ISR efficiente della mia produzione. Avevo un'applicazione che leggeva in una pila di byte da SPI ogni 5 msec. Un sacco di matematica in virgola mobile si stava verificando in attività in background, quindi volevo che la CPU fosse il più libera possibile per quelle attività. L'implementazione iniziale è stata ISR, quindi sono passato a DMA per confrontare e provare ad acquistare un po 'più di tempo CPU tra i campioni. Il guadagno della velocità di trasferimento è stato leggermente migliorato, ma solo di poco. Era appena misurabile sull'o-scope.

Questo perché sui recenti microprocessori che ho visto, ISR e DMA funzionano quasi nello stesso modo: prendono i cicli della CPU come richiesto e il DMA sta essenzialmente facendo le stesse operazioni con la CPU che avrei codificato in un ISR efficiente .

In rari casi, ho visto periferiche con una propria area RAM accessibile SOLO da DMA. Questo era su MAC Ethernet o USB.


3

Il DMA è molto probabilmente usato qui in modo che il DAC possa avere un tempismo regolare, generare una forma d'onda cambiando l'uscita analogica ad un intervallo noto.

Sì, se si tratta di un bus condiviso, allora ... devi condividere.

La cpu non usa sempre il bus, quindi a volte è una buona idea condividere con un motore dma. E ovviamente questo significa che le priorità vengono coinvolte, a volte è solo chi ci arriva prima (per esempio hanno un comando FIFO di fronte alla risorsa e FIFO richieste in ordine, nell'ordine in cui arrivano, sì, non sarebbe necessariamente deterministico ). In un caso come questo, potresti voler che il dma abbia la priorità sulla CPU in modo che cose sensibili al tempo come DAC o ADC abbiano un tempismo deterministico. Dipende da come hanno scelto di implementarlo.

La gente a volte ha questo presupposto spesso errato che dma è gratuito. Non consuma ancora il tempo del bus, se condiviso con la CPU (che alla fine è come parla a una risorsa con cui la CPU può parlare), quindi la CPU e / o il dma vengono trattenuti, quindi la CPU deve ancora aspettare un po ' tempo, in alcune implementazioni (probabilmente non il tuo microcontrollore) la cpu è completamente trattenuta fino al completamento della dma, la cpu viene fermata per la durata. Dipende solo dall'implementazione. La parte gratuita di ciò è che la CPU non deve essere costantemente interrotta o polling o trattenere il respiro per alcuni eventi per alimentare i dati. Può volerci del tempo per creare il buffer successivo da sovrastare. Deve cercare il completamento del trasferimento dma e gestirlo, ma invece di dire che ogni byte ora è più byte, un blocco di dati.

Non esiste una risposta universale. "Dipende" ... dal design specifico della cosa specifica che stai usando. Anche all'interno di un progetto di chip / scheda / sistema potrebbero esserci più motori DMA e non vi è motivo di ritenere che funzionino tutti allo stesso modo. Per ogni caso devi capirlo, e sfortunatamente, spesso non lo documentano o lo documentano abbastanza bene. Quindi potresti dover creare alcuni esperimenti se è un problema.


nota incorporato non ha nulla a che fare con esso. il punto di dma è ottenere prestazioni facendo eventualmente lavoro per la cpu in modo che non debba avere codice e sfruttare i cicli del bus normalmente inutilizzati e lavorare lì. Anche per cose come nella tua domanda di fornire i dati al momento giusto idealmente senza spese generali della CPU. questi vantaggi sono utili incorporati o meno.
old_timer

1

Le risposte finora parlano della "velocità" che la CPU può fare e dei vantaggi di DMA. Tuttavia c'è un'altra considerazione, il potere .

Se la CPU desiderasse inviare un pacchetto di dati su un collegamento lento, dovrebbe essere attiva per la maggior parte del tempo se si utilizza il polling o gli interrupt, tuttavia la CPU principale potrebbe trovarsi in uno stato di sospensione durante l'esecuzione del DMA .


0

Alcuni processori come la serie STM32H7 hanno molte opzioni RAM e un sacco di RAM accoppiata. Avere banchi RAM separati consente a DMA di eseguire il martellamento di molta RAM mentre il processore sta elaborando i dati nel ram accoppiato che non richiede cache e non viene martellato da DMA. Per spostare i dati intorno a te puoi usare MDMA. Ho costruito un set di radar FMCW usando uno di questi. Gli ADC ottengono i dati IQ da due ingressi in una SRAM. Quindi ridimensiono i dati ed eseguo il fft complesso a 256 virgola mobile in ram dtcm. Quindi FIFO il risultato in un array 2d in RAM AXI usando MDMA.

Io prendo un secondo bin 64 fft attraverso il fifo per il vettore di velocità. Quindi eseguo l'entità dei dati complessi e invio i dati risultanti 128 e 64 valori in virgola mobile a un altro H7 utilizzando SPI a 12,5 MHz per il rilevamento. Faccio tutto questo in 4 ms.

La frequenza di campionamento dell'ADC è di 84 kHz e usando il sovracampionamento sto ottenendo una risoluzione di circa 18 bit.

Non male per un processore generico che funziona solo nella gamma MHz e senza RAM esterna.

Anche le grandi cache che questo dispositivo ha migliorato le prestazioni per calc al di fuori del dtcm aiuta.

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.